歡迎光臨
每天分享高質量文章

Python爬蟲實戰:抓取並儲存百度雲資源(附程式碼)

尋找並分析百度雲的轉存api

首先你得有一個百度雲盤的賬號,然後登入,用瀏覽器(這裡用火狐瀏覽器做示範)開啟一個分享連結。F12開啟控制檯進行抓包。手動進行轉存操作:全選檔案->儲存到網盤->選擇路徑->確定。點選【確定】前建議先清空一下抓包記錄,這樣可以精確定位到轉存的api,這就是我們中學時學到的【控制變數法】2333。

可以看到上圖中抓到了一個帶有 “transfer” 單詞的 post 請求,這就是我們要找的轉存(transfer)api 。接下來很關鍵,就是分析它的請求頭和請求引數,以便用程式碼模擬。

點選它,再點選右邊的【Cookies】就可以看到請求頭裡的 cookie 情況。

cookie分析

因為轉存是登入後的操作,所以需要模擬登入狀態,將與登入有關的 cookie 設定在請求頭裡。我們繼續使用【控制變數法】,先將瀏覽器裡關於百度的 cookie 全部刪除(在右上角的設定裡面,點選【隱私】,移除cookies。具體做法自己百度吧。)

然後登入,右上角進入瀏覽器設定->隱私->移除cookie,搜尋 “bai” 觀察 cookie 。這是所有跟百度相關的 cookie ,一個個刪除,刪一個掃清一次百度的頁面,直到刪除了 BDUSS ,掃清後登入退出了,所以得出結論,它就是與登入狀態有關的 cookie 。

同理,刪除掉 STOKEN 後,進行轉存操作會提示重新登入。所以,這兩個就是轉存操作所必須帶上的 cookie 。

弄清楚了 cookie 的情況,可以像下麵這樣構造請求頭。

除了上面說到的兩個 cookie ,其他的請求頭引數可以參照手動轉存時抓包的請求頭。這兩個 cookie 預留出來做引數的原因是 cookie 都是有生存週期的,過期了需要更新,不同的賬號登入也有不同的 cookie 。

引數分析

接下來分析引數,點選【Cookies】右邊的【Params】檢視引數情況。如下:

上面的query string(也就是?後跟的引數)裡,除了框起來的shareid、from、bdstoken需要我們填寫以外,其他的都可以不變,模擬請求的時候直接抄下來。

前兩個與分享的資源有關,bdstoken與登入的賬號有關。下麵的form data裡的兩個引數分別是資源在分享使用者的網盤的所在目錄和剛剛我們點選儲存指定的目錄。

所以,需要我們另外填寫的引數為:shareid、from、bdstoken、filelist 和 path,bdstoken 可以手動轉存抓包找到,path 根據你的需要自己定義,前提是你的網盤裡有這個路徑。其他三個需要從分享連結裡爬取,這個將在後面的【爬取shareid、from、filelist,傳送請求轉存到網盤】部分中進行講解。

搞清楚了引數的問題,可以像下麵這樣構造轉存請求的 url 。

爬取shareid、from、filelist,傳送請求轉存到網盤

以上面這個資源連結為例(隨時可能被河蟹,但是沒關係,其他連結的結構也是一樣的),我們先用瀏覽器手動訪問,F12 開啟控制檯先分析一下原始碼,看看我們要的資源資訊在什麼地方。控制檯有搜尋功能,直接搜 “shareid”。

定位到4個shareid,前三個與該資源無關,是其他分享資源,最後一個定位到該 html 檔案的最後一個標簽塊裡。雙擊後可以看到格式化後的 js 程式碼,可以發現我們要的資訊全都在裡邊。如下節選:

可以看到這兩行

yunData.PATH 只指向了一個路徑資訊,完整的 filelist 可以從 yunData.FILEINFO 裡提取,它是一個 json ,list 裡的資訊是Unicode編碼的,所以在控制檯看不到中文,用Python程式碼訪問並獲取輸出一下就可以了。

直接用request請求會收穫 404 錯誤,可能是需要構造請求頭引數,不能直接請求,這裡博主為了節省時間,直接用selenium的webdriver來get了兩次,就收到了傳回信息。第一次get沒有任何 cookie ,但是baidu 會給你傳回一個BAIDUID ,在第二次 get 就可以正常訪問了。

yunData.FILEINFO 結構如下,你可以將它複製貼上到json.cn裡,可以看得更清晰。

清楚了這三個引數的位置,我們就可以用正則運算式進行提取了。程式碼如下:

爬取到了這三個引數,就可以呼叫之前的 transfer 方法進行轉存了。


王雨城,Python中文社群專欄作者

部落格:

http://www.jianshu.com/u/88ff70818bd1


回覆數字“0328”獲取本文原始碼下載地址。

《Python人工智慧和全棧開發》2018年07月23日即將在北京開課,120天衝擊Python年薪30萬,改變速約~~~~

*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。


– END –



更多Python好文請點選【閱讀原文】哦

↓↓↓

贊(0)

分享創造快樂