1. 程式人生 > >爬蟲訓練營-反爬蟲之cookie

爬蟲訓練營-反爬蟲之cookie

此文已在本人個人微信公眾號(iwoods100,不會下廚的健身愛好者不是一個好程式設計師)首發,關注可查閱全部文章。

前面講過,cookie儲存在瀏覽器端,常用來儲存“認證資料”,請求會攜帶這些資料傳送給伺服器,這樣伺服器才能判斷當前請求的狀態,比如是否自動登入?

狀態不同,伺服器返回的資料也會不一樣。比如未登入狀態會先返回一個登入介面,而登入狀態則直接返回已登入介面。

除了自動登入外,cookie還會存放其它狀態資料,這取決於網站業務。

有些網站還會設定一些cookie驗證,如果你的請求不包含它們,則拒絕訪問。

所以,在爬蟲模擬請求時,應該先理順哪些cookie是必須的,哪些是不必的。


分析cookie

為了判斷一個網站是否會檢測cookie,可以做一些簡單的測試。

一般來說,涉及到查詢業務的資料,驗證cookie的可能性會大一些,但實際上大部分都不會檢驗cookie。

比如我訪問淘寶電影網,就必須要帶上淘寶的cookie。

如果不帶會怎麼樣?雖然前幾次能正常訪問,但在訪問數十次後,你會發現返回的不是請求資料,而是一個驗證碼頁面,此時淘寶就已經對你的ip封鎖了,而解決方法也很簡單,先輸入正確驗證碼解鎖,然後學乖一點,每次傳送請求的時候記得帶上cookie。

如果你使用的是linux後臺,建議安裝一個介面(如VNC)和瀏覽器,方便給ip解鎖。

當然你也可以讓程式自動解鎖,如果你看了本專題下的驗證碼部分和session部分,就能做到,只是實施起來挺麻煩。

接下來帶大家除錯一下南航航班請求會不會檢驗cookie呢?為了方便,我使用Fiddler來除錯。

完整的http請求就像下圖這樣~

紅框中是會發送給伺服器的cookie。

你可以把紅框中的cookie刪除,然後再次請求,就像下面這樣:

通過判斷兩次請求返回的資料是否一致,就能判斷伺服器是否對cookie有驗證。

在這裡,返回的資料正好是一致的,說明南航官網對航班資料的查詢並沒有cookie驗證。

模擬cookie

通過Fiddler可以很方便的傳送請求,那如何在python中實現帶cookie的請求呢?

以下是我常用的模擬方式:


通過上面的介面建立cookie後,就可新增在請求中了。


有時候你需要動態獲取cookie,也就是從返回的資料中找到伺服器最新設定的cookie,提取出來即可。(一般針對SESSIONID才會這樣做)

TIPS

不知你是否注意到,我在建立cookie的時候使用的是cookielib.Cookie建構函式。為什麼要這樣做呢?因為能夠靈活設定cookie的相關屬性。而我也建議你這樣做。

尤其要注意cookie的域名屬性,因為有的請求下的cookie包含了多種域名cookie,比如淘寶網的cookie列表:


其次,有效期也很重要,請給cookie設定一個永不過期的有效期。

不會下廚的健身愛好者

不是一個好程式設計師

長按二維碼關注