1. 程式人生 > >Python網路爬蟲實戰(四)模擬登入

Python網路爬蟲實戰(四)模擬登入

對於一個網站的首頁來說,它可能需要你進行登入,比如知乎,同一個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