一. 功能需求分析: 在很多時候我們需要做這樣一個事情:我們想把我們QQ空間上的相冊高清圖像下載下來,怎麼做?到網上找軟體?答案是否定的,理由之一:網上很多軟體不知有沒有病毒,第二它有可能捆了很多不必要的軟體,對我們不友好,而且有些需要費用,那該怎麼辦?難道就無計可施了嗎?答案又是否定的,我們可以通 ...
一. 功能需求分析:
在很多時候我們需要做這樣一個事情:我們想把我們QQ空間上的相冊高清圖像下載下來,怎麼做?到網上找軟體?答案是否定的,理由之一:網上很多軟體不知有沒有病毒,第二它有可能捆了很多不必要的軟體,對我們不友好,而且有些需要費用,那該怎麼辦?難道就無計可施了嗎?答案又是否定的,我們可以通過爬蟲技術完成一個QQ或者微信相冊空間下載器,根據功能需求不同我們可以去改進它讓它成為可批量下載的QQ空間下載器,或者做成多線程,圖形化界面多功能採集器
二. 環境搭建:
Window+Chrome火狐瀏覽器+火狐驅動+requests/Linux+phantomjs+phantomjs驅動+requests
三. 技術點分析:
QQ空間是騰訊的產品通過瀏覽器F12分析請求我們得到與相冊相關的鏈接ajax:
通過實驗我們獲取到與數據請求成功相關的有幾個參數:
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為例