通過Fiddler抓包發現返回的res
覺得有幫助的別忘了關注一下知識圖譜與大資料公眾號,完整程式碼移步從今天開始種樹
開始
在上一文中,我們儲存了百度雲盤的地址和提取碼,但是這種分享連結很容易被遮蔽,最好的做法就是儲存資源到自己的網盤,不過採集的連結有上萬個,人肉儲存並不現實,所以本文嘗試了批量儲存資源,如您還沒看過上文,這裡可以跳轉。
爬蟲學習3:搭建自己的電影資源網保姆式教學
觀察請求
以下面資源連結為例:
https://pan.baidu.com/s/1tHSxZQueF-Wsa2T0NlT3vQ
在瀏覽器中輸入以上鍊接,會自動跳轉到https://pan.baidu.com/share/init?surl=tHSxZQueF-Wsa2T0NlT3vQ
輸入正確提取碼後發現直接跳轉到資源儲存頁面了,F12 NETWORK裡也看不到此請求的返回值,這時候只能使用Fiddler才能抓到包了。
Fiddler抓包
開啟Fiddler,為了不讓其它各類請求影響到我們,首先進行簡單設定,以此來顯示我們想要的請求,點選Filters 進行如下設定,最後點選Actions裡的Run Filterset now,就只會顯示pan.baidu.com
域名的請求:
測試post資料
為了得到點選提取檔案按鈕時傳送的請求和post的資料,先嚐試輸入一個錯誤的提取碼123,檢視請求:
https://pan.baidu.com/share/verify?surl=tHSxZQueF-Wsa2T0NlT3vQ&t=1593142082616&channel=chunlei&web=1&app_id=250528&bdstoken=855345cbf66bbfba3d30d5e201ea346f&logid=MTU5MzE0MjA4MjYyMDAuNTM5MjA2Nzg2ODEyNTcxNA==&clienttype=0
看來上面這個url就提取資料的請求,接下來具體看一下都提交了哪些資料:
Form Data中的pwd就是剛才輸入的錯誤提取碼,而其它兩個引數vcode和vcode_str在沒有驗證碼的情況下也不用管,再看看Query String中的引數,為了測試這些引數有哪些是變化的,我挑選了一些資源連結去嘗試,具體過程就省略了,總結如下:
Query String引數 | 是否變化 |
---|---|
surl | 即資源連結中的最後部分,可直接獲取 |
t | 時間戳,可直接獲取 |
channel | 固定 |
web | 固定 |
app_id | 固定 |
bdstoken | 固定 |
logid | 變化 |
clienttype | 固定 |
Form Data引數 | 是否變化 |
---|---|
pwd | 即提取碼 |
vcode | 無 |
vcode_str | 無 |
從上面表格來看,需要手動獲取的就是logid,稍微有點經驗的話應該都能想到這會不會是js動態生成的,抱著這個心態來到sources標籤下,搜尋logid關鍵字,果不其然,有個JS檔案裡有這個引數,直接定位到相應的行數:
直接在68行打一個斷點,檢視執行狀態:
細心的同學一個很快就能發現上圖紅框裡的值就是第一次請求https://pan.baidu.com/share/init?surl=tHSxZQueF-Wsa2T0NlT3vQ
cookies裡的BAIDUID
的值,logid
就是通過上面一些js程式碼中的一些演算法得到的,cookies如下:
BIDUPSID=EC39F255CF7B146E8ADD4FA37DB16739;BAIDUID=BBBC2B2C1269AF3AA7D113D07FAC5E80:FG=1; PSTM=1587390447; PANWEB=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDCLND=C4jsJ4aHacfrqq02TYbUOKGFFDefnJAMNmU%2BI3v5FNM%3D;
水平有限,沒辦法將這段js改寫為python,不過好在python提供了一個執行js程式碼的庫pyexecjs
,該庫運行於Nodejs環境,首先要保證你的機器安裝了Nodejs:
pip install pyexecjs
下圖即代表安裝正確了,execjs可以正常使用
將js程式碼稍微修改一下,儲存為yunpan.js
:
var u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/~!@#¥%……&"
, l = String.fromCharCode
, d = function (e) {
if (e.length < 2) {
var n = e.charCodeAt(0);
return 128 > n ? e : 2048 > n ? l(192 | n >>> 6) + l(128 | 63 & n) : l(224 | n >>> 12 & 15) + l(128 | n >>> 6 & 63) + l(128 | 63 & n)
}
var n = 65536 + 1024 * (e.charCodeAt(0) - 55296) + (e.charCodeAt(1) - 56320);
return l(240 | n >>> 18 & 7) + l(128 | n >>> 12 & 63) + l(128 | n >>> 6 & 63) + l(128 | 63 & n)
}
, f = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g
, g = function (e) {
return (e + "" + Math.random()).replace(f, d)
}
, h = function (e) {
var n = [0, 2, 1][e.length % 3]
, t = e.charCodeAt(