如何使用python來自動保存百度網盤資源-這樣的操作你會嗎?


開始

在上一文中,我們保存了百度雲盤的地址和提取碼,但是這種分享鏈接很容易被屏蔽,最好的做法就是保存資源到自己的網盤,不過采集的鏈接有上萬個,人肉保存並不現實,所以本文嘗試了批量保存資源,如您還沒看過上文,這里可以跳轉。

爬蟲學習3:搭建自己的電影資源網保姆式教學

觀察請求

以下面資源鏈接為例:

在瀏覽器中輸入以上鏈接,會自動跳轉到 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 :


使用execjs執行一下



得到所有的變化參數后就可以提交數據了:


通過Fiddler抓包發現返回的res為下,errno為0即代表提交成功:

{"errno":0,"err_msg":"","request_id":8738382064533520558,"randsk":"g2VwUSYs1KSuOMh9%2FQDVUUwc7ICFq4CZNmU%2BI3v5FNM%3D"}

留意上面的 randsk 。

如果你是用瀏覽器抓包就會發現輸對提取碼點擊按鈕后請求會全部刷新一次,就不能確認到底是哪個請求跳轉到資源頁面的,只能使用Fiddler才能抓到 POST 成功后的請求,經過測試,發現POST數據后又再次請求了 https://pan.baidu.com/s/1wy0LC4O6iY7l9M6RD25k6w 這個鏈接,沒錯,就是上面一開始請求的鏈接,區別就是這次請求cookie中攜帶了剛才返回的 randsk 的值。所以再次請求時添加上 randsk :


保存資源

抓包分析

抓包保存資源鏈接發現為:

#保存鏈接
https://pan.baidu.com/share/transfer?shareid=4180912663&from=2693937402&ondup=newcopy&async=1&channel=chunlei&web=1&app_id=250528&bdstoken=7a8e1e34b454fd27de65b7662f67c2fa&logid=MTU5MzE4MTYzNDY0NDAuOTE1MzE0NDI5MzI1NTY4OA==&clienttype=0"

Query String 和 Form Data 為:

Query String大部分參數都提到過,可以參考上面,這里出現了新的兩個參數 shareid 和 from ,經過測試除了這兩個參數和上文中 logid ,其它參數均為固定。

Form Data參數 是否變化
fsidlist 變化
path 你自己選擇保存的路徑,約等於固定
type 固定

到這里又稍微被 shareid 和 from 、 fsidlist 三個參數卡住了,在頁面中搜索這三個參數也沒有結果,在source中搜索了一下,倒是又一個shareid,但是貌似也關系不大,折騰了一會就想到既然參數名搜不到,那我搜一下參數值試試?,果然在資源頁面中搜到了三個參數的值(即 https://pan.baidu.com/s/1wy0LC4O6iY7l9M6RD25k6w 這頁面),如下圖:

正則表達式即可提取出三個值。


轉存

轉存時候注意cookie里要攜帶 BDUSS 和 STOKEN ,這兩個參數在資源頁面的cookies里,且都為固定的,沒有登錄的話只有 STOKEN , BDUSS 的值要在登錄狀態下才能看到,下圖時登錄后的cookie:

代碼如下:


完結,撒花

到這里就結束了,本文講解了如何使用python轉存百度雲盤資源。

 


此文轉載文,著作權歸作者所有,如有侵權聯系小編刪除!

原文地址:http://www.cnblogs.com/luohua13950/p/13723860.html

 

如需要源代碼點擊這里下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM