欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-08 20:44:53
一. 功能需求分析: 在很多时候我们需要做这样一个事情:我们想把我们QQ空间上的相册高清图像下载下来,怎么做?到网上找软件?答案是否定的,理由之一:网上很多软件不知有没有病毒,第二它有可能捆了很多不必要的软件,对我们不友好,而且有些需要费用,那该怎么办?难道就无计可施了吗?答案又是否定的,我们可以通 ......

一.    功能需求分析:

在很多时候我们需要做这样一个事情:我们想把我们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空间登录后的界面,然后点击“脚本”

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

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:

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

 

 通过正则表达式得到p_skey。

一.    效果图:

以输入我的qq为例

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

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