對於一個網站的首頁來說,它可能需要你進行登錄,比如知乎,同一個URL下,你登錄與未登錄當然在右上角個人信息那里是不一樣的。
(登錄過)
(未登錄)
那么你在用爬蟲爬取的時候獲得的頁面究竟是哪個呢?
肯定是第二個,不可能說你不用登錄就可以訪問到一個用戶自己的主頁信息,那么是什么讓同一個URL在爬蟲訪問時出現不同內容的情況呢?
在第一篇中我們提到了一個概念,cookie,因為HTTP是無狀態的,所以對方服務器並不知道這次請求到底來自於誰,就好像突然你收到了一封信,上面讓你給他寄一些東西,但是信上卻沒有他的聯系方式。
在HTTP中也是如此,我們普通的請求都類似於匿名信,而cookie的出現,就是讓這封信上蓋上了你自己的名字。
在請求時附帶上你的cookie,服務器放就會知道這次請求來自於誰,然后你點擊個人信息頁,服務器就知道是要返回這個cookie對應的用戶的信息頁了。
在谷歌瀏覽器中,你可以在控制台Application里面找到當前網站的所有cookie鍵值對。一般來說用於確認你個人信息的只有一個鍵值對,但是你也可以把所有的都用上,並不能保證對方服務器是不是對某些鍵值對也進行檢查了。
很多網站在你沒有登錄的情況下並不會給過多的數據讓你看,所以你的爬蟲需要進行一次模擬登錄。
模擬登錄需要從一個網站的登錄界面開始,因為我們要在這里用爬蟲發送post請求附帶賬號密碼來登錄對方網站。
拿人人網來舉例。
人人網登錄地址:http://www.renren.com/
打開控制台,我們可以先嘗試觀察一次登錄的網絡請求。很容易就能在里面找到一個/login的POST請求,登錄的請求都會是POST,因為GET請求的參數會放在URL上,很容易被人攔截看到你的賬號密碼。
在表單參數中,我們需要注意的就只有email,password和rkey了,其他的照填即可。
email是我們的賬號名,可以是郵箱也可以是電話號。
password是密碼,這個密碼明顯是加密過的,對於這種情況,我們在請求時也要用同樣的算法對密碼進行加密,但是我們如何知道對方采用了什么加密算法呢?
這種情況大多數你都可以在控制台sources里面找到,在這里你可以找到網站加載過的所有文件,而加密算法一般會在js文件中。
sources里面很明顯有一個叫login.js的文件,那么它一定和登錄有關系,因為在sources里面打開js太難看了,會縮成一行,所以我就在控制台打開它了。
根據password定位到這里。
可以找到關於登錄時密碼加密的算法,順便一提,人人網這個login.js的函數命名真的是沒救了,abcd...xyz用了個遍,不知道是為了惡心自己人還是惡心別人寫爬蟲分析它這個login。但是很遺憾的是人人網給爬蟲留下了一個很方便的登錄途徑,我們甚至可以不用自己加密密文!!!
雖然說這里可以不用自己轉義加密算法了,但是其實很多網站並不會像人人網這樣暴露出一個action的do事件讓我們可以直接調用的,所以最好還是掌握一些密文加密的那部分。
再來看人人網暴露出的爬蟲便捷登錄的接口。
我們只需要調用這個do即可完成登錄。
也就是說,我們模擬這個form來完成請求,在請求前,我們需要把信息裝填到form中。
先安裝scrapy依賴
pip install scrapy
import scrapy
url = "http://www.renren.com/PLogin.do"
data = {"email": "xxxxx", "password": "xxxxx"}
response = scrapy.FormRequest(url,formdata=data,callback=self.parse_page)
登錄成功之后,我們就可以從response中拿到cookie,然后在之后的請求中都附帶上cookie,這樣對方服務器就知道我們是誰了。
如果之前在網頁登錄失敗次數過多,可能會導致爬蟲模擬登錄需要驗證碼,而此處是考慮不需要驗證碼的情況,所以可能會登錄失敗,解決方法可以是清理本機Cookie。