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

使用到的工具

  • 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. ural1126 Magnetic Storms

    Magnetic Storms Time limit: 0.5 secondMemory limit: 64 MB The directory of our kindergarten decided ...

  2. PAT (Advanced Level) 1004. Counting Leaves (30)

    简单DFS. #include<iostream> #include<cstring> #include<cmath> #include<algorithm& ...

  3. spring boot + neo4j restful

    整整折腾了三天,终于把spring boot + neo4j的路走通了. 这里介绍3个部分,pom,entity,repository 1)pom <?xml version="1.0 ...

  4. The 2014 ACMICPC Asia Invitational Xian

    上半年邀请赛的时候真是险而又险地2题拿了个铜,确实其实跟没拿一样......现场前复盘一下,长长记性 [A]签到题 [B]最短路+DFS [C]最短路 [D]构造+欧拉回路 [E]数论,最佳平方逼近 ...

  5. mrql初级教程-使用(er)

    最近使用mrql做xml文件解析,使用xpath来进行判断 使用的方法如下,其中t.mrql文件如下: v =args[1];store ty:=source(xml,args[0],{"p ...

  6. iOS开发——打电话

    1.调用 自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://55522555 ...

  7. iOS越狱包

    编译完了的程序是xxx.app文件夹,我们需要制作成ipa安装包,方便安装 找一个不大于500*500的png图片(程序icon图标即可),改名为:iTunesArtwork,注意不能有后缀名. 建立 ...

  8. css布局-多行文字垂直居中

    方法一: 代码: <style> *{padding: ;margin:;font-size: 12px;} div{float: left;width: 200px;height:200 ...

  9. cocos2d-x 定时器selector的使用 :schedule的使用

    在游戏设计时,我们需要不断的改变屏幕显示来反映游戏操作的效果,最简单的就是提示用户已经进行的游戏时间.为此,我们需要使用cocos2d-x内置的任务调度机制,即CCNode的schedule成员函数. ...

  10. PHPEXCEL实例-导出EXCEL

      PHPExcel 是相当强大的 MS Office Excel 文档生成类库,当需要输出比较复杂格式数据的时候,PHPExcel 是个不错的选择. <?php /* * 导出EXCEL *  ...