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

使用到的工具

  • 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. svn代码管理的使用工作流程

    1. 新建代码库repository. 2. checkout 到workspace. 3. checkin 回 repository. 4. release 一个版本出来(相当于拉出一个branch ...

  2. ios开发证书,描述文件,bundle ID的关系

    苹果为了控制应用的开发与发布流程,制定了一套非常复杂的机制.这里面的关键词有:个人开发者账号,企业开发者账号,bundle ID,开发证书,发布证书(又叫"生产证书"),开发描述文 ...

  3. 控制流之break

    break语句是用来 终止 循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,也停止执行循环语句.一个重要的注释是,如果你从for或while循环中 终止 ,任何对应的循环else块 ...

  4. 关于Discuz与jQuery冲突问题的亲测解决方法

    最近的一个项目整合dede和discuz程序,客户要求风格统一,所以有很多样式及特效都是要公用的.其中jQuery库定义的函数$()正好与discuz的comme.js中函数一样,这样就冲突了,导致d ...

  5. laravel5 数据库连接问题

    [PDOException] SQLSTATE[28000] [1045] Access denied for user ‘homestead’@’localhost’ (using password ...

  6. IOS NSURLRequest 设置 Header

    https://my.oschina.net/wolx/blog/406092 工程中的请求,需要设置Header,请求令牌才访问,NSURLRequest 请求没有直接设置header 的方法,需要 ...

  7. iOS UICollectionView 长按移动cell

    ref:http://www.jianshu.com/p/31d07bf32d62 iOS 9之后: 示例如下 效果 前言: 看完你可以学到哪些呢? 就是文章标题那么多, 只有那么多. . 手残效果图 ...

  8. 【ural1297】 Palindrome

    http://acm.timus.ru/problem.aspx?space=1&num=1297 (题目链接) 题意 求最长回文子串 Solution 后缀数组论文题 穷举每一位,然后计算以 ...

  9. js执行js字符串函数的方法

    <script> var jsText = 'return function(){alert(1+1)}' var jscode = new Function(jsText)(); jsc ...

  10. angularjs---服务(service / factory / provider)

    初angularJs时  常写一些不够优雅的代码  !我总结了一下看看各位有没有中枪的!-----( 这里只针对服务service及其相关! ) 以下做法不太优雅 兄弟controller 之间的相同 ...