爬蟲訓練營-反爬蟲之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設定一個永不過期的有效期。
不會下廚的健身愛好者
不是一個好程式設計師
長按二維碼關注