某天,想下载某人的相册,发现一张一张下载,工作量巨大,所以写了这个工具。

使用到的工具

  • Fiddler(抓包工具)
  • python(脚本语言)
  • intellij

步骤

分析包

  • 获取相册分类链接信息

打开某人空间 - 打开fiddler抓取 - 访问相册

打开fiddler,搜索相册名称 ‘侄子’

获取相册链接,将其拖到右边的composer

拷贝链接地址和cookie信息

  • 获取相册里面照片的信息

同上面的步骤,打开某个相册,在fiddler里面搜索某张照片的名称

获取相册列表信息链接

编程

贴出主要代码

# coding=utf-8
import os, threading from Queue import Queue
from py2.http_utils import Http
from py2 import soup, cookie_utils, json_utils, regex_utils, DOWNLOAD_PATH photo_url = 'http://h5.qzone.qq.com/proxy/domain/alist.photo.qq.com/fcgi-bin/fcg_list_album_v3?g_tk=1210057952&callback=shine0_Callback&t=419513462&hostUin=773817625&uin=77086540&appid=4&inCharset=utf-8&outCharset=utf-8&source=qzone&plat=qzone&format=jsonp&notice=0&filter=1&handset=4&pageNumModeSort=40&pageNumModeClass=15&needUserInfo=1&idcNum=0&callbackFun=shine0&_=1484721771570'
detail_url = 'http://h5.qzone.qq.com/proxy/domain/shplist.photo.qzone.qq.com/fcgi-bin/cgi_list_photo?g_tk=1210057952&callback=shine3_Callback&t=160656776&mode=0&idcNum=0&hostUin=773817625&topicId=5ceb20e9-d727-4285-b177-dc91df68e67b&noTopic=0&uin=77086540&pageStart=0&pageNum=30&skipCmtCount=0&singleurl=1&batchId=&notice=0&appid=4&inCharset=utf-8&outCharset=utf-8&source=qzone&plat=qzone&outstyle=json&format=jsonp&json_esc=1&question=&answer=&callbackFun=shine3&_=1484721812872'
cookie1 = " pac_uid=1_77086540; tvfe_boss_uuid=2c4e1161f404d6b1; QZ_FE_WEBP_SUPPORT=1; cpu_performance_v8=3; pgv_pvid=9548679930; o_cookie=77086540; __Q_w_s__QZN_TodoMsgCnt=1; __Q_w_s_hat_seed=1; RK=mBGHAsurXZ; randomSeed=23363; qq_photo_key=71b85dd259bd647f18a963405c43e803; ptisp=ctc; ptcz=eae4b39cd8587e96c54d1585575c875c51beb348f479e89c599533f6576cde1e; pt2gguin=o0077086540; uin=o0077086540; skey=@D4MK2Tg8t; p_uin=o0077086540; p_skey=wqJMnZAj7nEKuDrTMmATE7Cd0vBccQ*KloG*3aWgtF8_; pt4_token=VjVJc1wZjNTzVlXNOzKdDTXd*BdE2v7BEqs3ymF5G6E_; rv2=8066000527FC1F71AD31043B7CE2B89E62CC79CD9D7FEF3E87; property20=C112B65F9A5C0A4A00E4FE7DCC637E839780CB4B4072589CF28B5A90AD807919FE353ECC066D4A54; pgv_info=ssid=s7926413392; qzspeedup=sdch" download_path = os.path.join(DOWNLOAD_PATH, 'csy') topicId = regex_utils.find(r'topicId=(.*?)&', detail_url)
detail_url = detail_url.replace("&pageNum=30&", "&pageNum=500&") http = Http()
cookie2 = cookie_utils.parse_fiddler_str_cookie(cookie1)
http.set_cookie(cookie2) def getAlbumListModeSort():
html1 = http.get(photo_url)
if html1:
t1 = html1[html1.find("(") + 1:html1.rfind(")")]
j1 = json_utils.loads(t1)
albumList = []
if 'albumListModeSort' in j1['data']:
albumList = j1['data']['albumListModeSort']
elif 'albumList' in j1['data']:
albumList = j1['data']['albumList']
elif 'albumListModeClass' in j1['data']:
for k in j1['data']['albumListModeClass']:
if 'albumList' in k and k['albumList'] is not None:
albumList.extend(k['albumList'])
for p in albumList:
print p['name']
print p['id']
print p['priv']
question = p['question'] if 'question' in p else None
print question
if question is None:
getDetail(p['name'], p['id'])
pass
print '---------------------------' downloadQueue = Queue()
downLoadIsStart = False def getDetail(name, id):
print 'get photo: %s, %s' % (name, id)
detail_url1 = detail_url.replace(topicId, id)
html1 = http.get(detail_url1)
path1 = os.path.join(download_path, name)
if html1:
t1 = html1[html1.find("(") + 1:html1.rfind(")")]
j1 = json_utils.loads(t1)
if j1 is None:
j1 = json_utils.loads(t1.decode("gbk", "ignore"))
photoList = []
if 'photoList' in j1['data']:
photoList = j1['data']['photoList']
elif 'rangeList' in j1['data']:
if j1['data']['rangeList'] is not None:
for k in j1['data']['rangeList']:
if 'photoList' in k and k['photoList'] is not None:
photoList.extend(k['photoList'])
if photoList is not None and len(photoList) > 0:
for p in photoList:
print p['url']
# http.download_file(p['url'], path=path1, file_name=p['name'])
downloadQueue.put((p['url'], path1, str(p['modifytime']) + "_" + p['name']))
downloadFile() def downloadFile():
global downLoadIsStart
if not downLoadIsStart:
downLoadIsStart = True
all_thread = []
for i in range(5):
all_thread.append(threading.Thread(target=downloadFileThread))
for t in all_thread:
t.start()
print 'start....' def downloadFileThread():
try:
val = downloadQueue.get(block=True, timeout=5)
while val is not None:
try:
http.download_file(val[0], path=val[1], file_name=val[2])
except:
pass
val = downloadQueue.get(block=True, timeout=5)
except:
pass if __name__ == "__main__":
getAlbumListModeSort()
# getDetail(u'叶落而知秋', u'V13N7D3U4c7iMA')

运行结果

抓取QQ空间相册的更多相关文章

  1. 通过Scrapy抓取QQ空间

    毕业设计题目就是用Scrapy抓取QQ空间的数据,最近毕业设计弄完了,来总结以下: 首先是模拟登录的问题: 由于Tencent对模拟登录比较讨厌,各个防备,而本人能力有限,所以做的最简单的,手动登录后 ...

  2. python+selenium+requests爬取qq空间相册时遇到的问题及解决思路

    最近研究了下用python爬取qq空间相册的问题,遇到的问题及解决思路如下: 1.qq空间相册的访问需要qq登录并且需是好友,requests模块模拟qq登录略显麻烦,所以采用selenium的dri ...

  3. Python_小林的爬取QQ空间相册图片链接程序

    前言 昨天看见某人的空间有上传了XXXX个头像,然后我就想着下载回来[所以本质上这是一个头像下载程序],但是一个个另存为太浪费时间了,上网搜索有没有现成的工具,居然要注册码,还卖45一套.你们的良心也 ...

  4. Python爬虫实战:使用Selenium抓取QQ空间好友说说

    前面我们接触到的,都是使用requests+BeautifulSoup组合对静态网页进行请求和数据解析,若是JS生成的内容,也介绍了通过寻找API借口来获取数据. 但是有的时候,网页数据由JS生成,A ...

  5. [WPF源代码]QQ空间相册下载工具

    放一个WPF源代码,源代码地址 http://download.csdn.net/detail/witch_soya/6195987 代码没多少技术含量,就是用WPF做的一个QQ空间相册下载工具,效果 ...

  6. qq空间相册下载

    qq空间相册下载 描述 目前功能只可以下载 单个相册 程序基本是3个独立分开的部分. 解析(某一用户)所有相册 解析(单个)相册所有图片地址并写文件 根据文件下载图片 目的 只要有权限可以访问到的相册 ...

  7. 如何破解QQ空间相册密码访问权限2019方法

    今天小编给大家介绍一下最新的QQ空间相册破解方法,是2019年最新方法,本方法来自互联网,下面开始方法教程 教程之前我们需要下载软件,地址我发在下方 软件切图 1.首先我们打开软件,然后在“操作界面” ...

  8. selenium爬取qq空间,requests爬取雪球网数据

    一.爬取qq空间好友动态数据 # 爬取qq空间好友状态信息(说说,好友名称),并屏蔽广告 from selenium import webdriver from time import sleep f ...

  9. QQ空间相册展示特效

    <!doctype html> <html lang="en"> <head> <title>QQ空间相册展示特效<title ...

随机推荐

  1. Python之路:堡垒机实例以及数据库操作

    一.堡垒机前戏 开发堡垒机之前,先学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作. SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: ...

  2. Redis缓存服务搭建及实现数据读写--转载

    来自 http://www.cnblogs.com/lc-chenlong/p/3218157.html 1.  下载安装Redis 下载地址:https://github.com/MSOpenTec ...

  3. Myeclipse添加struts2支持后取消操作

    Myeclipse添加struts包后, 想重新加载的方法: 1. myelicpse,右键项目,选close project 2. 找到项目所在目录, 打开.classpath删除带有struts2 ...

  4. iOS JsonModel

    iOS JsonModel 的使用 本文转自:http://blog.csdn.net/smking/article/details/40432287 下面讲一下JSONModel的使用方法. @in ...

  5. Linux系统的/proc目录

    1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机 制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它 ...

  6. mysql优化----第一篇:综述

    一 系统层面  查看CPU和IO状态,确定瓶颈.增 更换设备 二   数据库层面 1 参数优化. 参考文章<mysql性能优化----调整参数>增大数据库内存缓存等设置. 参考 http: ...

  7. onchange、oninput、onpropertyChange事件的异同

    onchange事件适用于input\textarea\select元素上,支持各大浏览器,该事件只有在键盘或者鼠标操作改变对象属性,且失去焦点时触发,脚本触发无效: oninput事件适用于inpu ...

  8. LPC1768基本输入输出GPIO使用

    LPC1788通用IO口的控制包含了一些基本的组件,比如设置推挽输出,开漏输出,上拉电阻等,我们今天来看看. 首先使用GPIO要打开GPIO的系统时钟   LPC_SC->PCONP |= (1 ...

  9. coding菜鸟养成记

    http://www.cnblogs.com/xdp-gacl/category/563690.html http://www.cnblogs.com/vincent-blog/p/4402327.h ...

  10. 写一个程序,统计自己C语言共写了多少行代码。ver2.00

    概要 完成一个程序,作用是统计一个文件夹下面所有文件的代码行数.输入是一个文件夹的绝对路径,输出是代码行数.所以此程序的新特点有两个: 统计某一文件夹下的所有文件: 可以任意指定本机硬盘上任何位置的某 ...