当前位置: 移动技术网 > IT编程>脚本编程>Python > 爬虫技术实现空间相册采集器V.0.0.1版本

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

2019年02月12日  | 移动技术网IT编程  | 我要评论

孕早期症状,上海男科医院哪家权威,红河谷在哪

一.    功能需求分析:

在很多时候我们需要做这样一个事情:我们想把我们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为例

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网