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

使用到的工具

  • 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. Memory

    A - Memory Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit Sta ...

  2. CTabCtrl

    转载至 http://blog.csdn.net/jacklam200/archive/2008/08/01/2753797.aspx 一.在对话框视图中加入CTabCtrl控件 资源ID:IDC_T ...

  3. phantom" breakpoints

    http://stackoverflow.com/questions/723199/why-does-my-eclipse-project-have-phantom-debugger-breakpoi ...

  4. IFeatureLayer

      All Properties Methods Inherited Non-inherited Description AreaOfInterest The default area of inte ...

  5. Lua学习系列(一)

    从现在开始,打算学习一门新的脚本语言-lua. 1.什么是lua? a) lua1 • Lua 1.0 was implemented as a library, in less then 6000 ...

  6. CDOJ 1271 Search gold

    简单DP.dp[i][j]表示走到这格的最大金钱数. #include<cstdio> #include<cstring> #include<cmath> #inc ...

  7. java中关于编码的问题(字符转换流及字符缓冲流 )

    上次我们使用的是字节流,还有一种方式就是字符流,上次说过如何分辨使用哪种流,如果记事本可以读懂则使用字符流,否则使用字节流.使用字符流就需要牵扯到编码的问题,下面给出一种转化流的格式. OutputS ...

  8. [Programming WCF Services]Chapter 1. WCF Essentials - EndPoint

    1.配置文件方式设置EndPoint(ABC) 1.1.基本配置 <system.serviceModel> <services> <service name=" ...

  9. iOS 简易环形进度条

    demo下载地址:https://github.com/haozheMa/LoopProgressDemo/tree/master ViewController中的代码 #import "V ...

  10. 360路由器设置网段ip

    路由器设置->高级设置->修改路由器地址