Erlo

爬虫技术实现空间相册采集器V.0.0.1版本

2019-02-12 05:02:07 发布   1341 浏览  
页面报错/反馈
收藏 点赞

一.    功能需求分析:

在很多时候我们需要做这样一个事情:我们想把我们QQ空间上的相册高清图像下载下来,怎么做?到网上找软件?答案是否定的,理由之一:网上很多软件不知有没有病毒,第二它有可能捆了很多不必要的软件,对我们不友好,而且有些需要费用,那该怎么办?难道就无计可施了吗?答案又是否定的,我们可以通过爬虫技术完成一个QQ或者微信相册空间下载器,根据功能需求不同我们可以去改进它让它成为可批量下载的QQ空间下载器,或者做成多线程,图形化界面多功能采集器

二.    环境搭建:

Window+Chrome火狐浏览器+火狐驱动+requests/Linux+phantomjs+phantomjs驱动+requests

三.    技术点分析:

QQ空间是腾讯的产品通过浏览器F12分析请求我们得到与相册相关的链接ajax:

https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/fcg_list_album_v3?g_tk=214387010&callback=shine0_Callback&t=321694332&hostUin=1983273232&uin=1983273232&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=4&callbackFun=shine0&_=1549870211769

 

https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/cgi_list_photo?g_tk=214387010&callback=shine0_Callback&t=601982730&mode=0&idcNum=4&hostUin=1983273232&topicId=V12TViY911k4R5&noTopic=0&uin=1983273232&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=shine0&_=1549870377883

 

通过实验我们获取到与数据请求成功相关的有几个参数:

g_tk,uin,hostUin,pageNum,pagestart , topicId

其中hostuin是要下载的QQ号,因为下载相册必须要自己先登录所以uin是自己QQ,topicid是QQ相册id可以通过第一个链接获取到,g_tk是QQ加密算法生成的一个数字串,用户在获取登录状态后还必须加上g_tk才能正确返回数据然后通过获取到的图片链接下载图片

一.    技术难点分析:

其他参数都很好获取,就是这个g_tk困扰了我很久,后来通过分析请求和网上找资料最终解决了这个问题,首先我们需要获取g_tk是如何计算的,由于Firefox自带的控制台功能不够用, 这里用Firefox+Firebug来做,其它浏览器应该也有对于的插件F12打开Firebug控制台,刷新QQ空间登录后的界面,然后点击“脚本”

function (a){

    a=QZFL.util.URI(a);

    var b;

    a&&(a.host&&0<a.host.indexOf("qzone.qq.com")?b=QZFL.cookie.get("p_skey"):

a.host&&0<a.host.indexOf("qq.com")&&(b=QZFL.cookie.get("skey")));

    b||(b=QZFL.cookie.get("skey")||QZFL.cookie.get("rv2"));

    a=5381;

    for(var c=0,d=b.length;c<d;++c)

        a+=(a<<5)+b.charAt(c).charCodeAt();

    return a&2147483647

}

我们可以看到它的值与p_skey或者skey有关,顺序是如果有p_skey那就通过p_skey计算。

终上所述我们得到g_tk计算方式:


def g_tk(p_skey):
               hash = 5381;
                for i in p_skey:
                hash += (hash << 5) + ord(i)
                return hash & 0x7fffffff

      将上面代码整合我们很快就能得到我们想要数据,而p_skey在登录成功后的cookies中,我们为了方便无需通过分析cookie然后传入固定g_tk,我采用了一种很方便的方法,先用自动化框架登录成功后得到我们想要的cookie:

 

 通过正则表达式得到p_skey。

一.    效果图:

以输入我的QQ为例

 

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认