Scrapy用Cookie實現模擬登錄
這是我學習Python爬蟲第30天的筆記。
模擬登錄是爬取某些站點內容的一個關鍵,有些網站(特別是論壇類),不登錄的話,一個數據也拿不到。
模擬登錄有這樣幾個關鍵:
- 弄清楚登錄的url
一些網站打開出現登錄的頁面,地址欄大多數不是登錄提交表單的url。 -
提交登錄表單的字段
登錄頁面的url和登錄表彰的字段名獲取的方式有兩種:
1) 分析頁面源代碼,找到表單標簽及屬性。適應比較簡單的頁面,或者對網頁代碼,js非常熟悉。
2) 采用抓包工具,查看提交的url和參數,如Chrome的開發者工具中的Network, Fiddler等。這種方式簡單粗暴、快速。尤其適應頁面比較復雜,登錄時經過了幾次跳轉的。 -
登錄以后去往頁面的url
這個不是必須的,因為一般都有登錄后默認打開的頁面,或者你所需要取數據的頁面是明確的。但是如果對於第三方登錄來講,這個參數就是必要的。
知道了登錄url, 表單的參數后,通過提交參數的方式來實現登錄,不難。不是本文討論的重點。
params = {'uname':'kitty','upass':'hello'} r = requests.post("http://xxx.org/post", data=params)
一些站點的登錄流程還是比較復雜,如代碼封裝在js中,登錄時經過了跳轉。那采用以上的方式來實現登錄就比較復雜。即使用抓包拿到登錄url,表單參數,這時的登錄一般還附加了一些其他參數,需要一一構造出來,有的如時間戳等等。
有沒有一種比較簡單的方式,來成功實現爬蟲模擬登錄的,然后方便抓取到數據?Cookie就是這樣一種方式。不需要知道登錄url, 不需要知道登錄表單的字段名,以及還需要哪些其他參數。
我以QQ群論壇來說明使用Cookie實現模擬登錄,然后抓取數據。打開就是加載的登錄div。

以下兩種方式,都需要首先拿到Cookie,可以使用Chorme開發者工具,或者Fiddler,在目標網站上使用用戶名和密碼登錄一下,就拿到Cookie了。

一、用requests發送請求,實現模擬登錄
使用requests發送請求時,把cookie作為參數傳遞進來就可以了。
構造Cookie:
cookie = {'Cookie': 'qm_username=137958873x0; qm_sid=8a4cce2f4413b4a5c9981093942b3f6f,qMUZrWmt0Z0XQbVZWKlNBZXUzT0xCSXJNRHNXU1NDVzd6MXZFQjJSbGZxMF8.; RK=/jt+Uh72a5; pgv_pvid=2786550760; pgv_info=ssid=s5861035317; ptui_loginuin=1379588730; ptisp=ctc; ptcz=e3d339f47c356076793ff4c270b572e35ed69746057039ee2e78677e391793b9; pt2gguin=o1379588730; uin=o1379588730; skey=@ssNmMQP3p; p_uin=o1379588730; p_skey=2w78648Kd9wuwxK9lsiDM02MQFJfSIhEuxhhE*aH-SU_; pt4_token=aGGiHcty94vO0iC8mxQ*OgkHOI6fZmdzQCxsb-baX1U_'}
發達請求時,傳遞Cookie
html = requests.get(url,cookies=cookie).content
詳細可參考,《用Python玩轉QQ群論壇》
二、用Scrapy實現模擬登錄
在Scrapy中Cookie登錄的步驟跟上面一樣,但是在實現過來中,卻遇到很多困難,一直困擾我,而且在Scrapy中提示不多,如請求被禁止:
getting Forbidden by robots.txt: scrapy
總結一下Scrapy中實現Cookie登錄的方法:
1)Cookie的寫法不一樣:

注意,驗證登錄寫在start_requests()方法中,傳遞cookie參數。
return [FormRequest("http://qgc.qq.com/309o916014x/",cookies=cookies,callback=self.parse)]
2) 在settings.py中的配置,增加:
ROBOTSTXT_OBEY=False
再次啟動爬蟲,成功!還是同樣的頁面,抓取到數據。

總結一下,使用Cookie登錄的好處:
不需要知道登錄url和表單字段以及其他參數,不需要了解登錄的過程和細節。由於不是采用登錄url, 用戶名+密碼的方式。配合工具使用,快速方便。
所謂用Cookie實現登錄,就把過登錄過的信息(包括用戶名、密碼以及其他的驗證信息)打包一起發給服務器,告訴服務器我是登錄驗證過的。
不足之處,Cookie有過期時間,過一段時間再運行這個爬蟲,需要重新獲取一下Cookie的值。抓取數據過程是沒有問題的。
關於Cookie的介紹:
-
Cookie分類
Cookie總是保存在用戶客戶端中,按在客戶端中的存儲位置,可分為內存Cookie和硬盤Cookie。Cookie的有效性,最短的瀏覽器關閉后就消失了,最長是可以一直保存,直到被刪除。 -
Cookie用途
因為HTTP協議是無狀態的,即服務器不知道用戶上一次做了什么,這嚴重阻礙了交互式Web應用程序的實現。
在典型的應用是網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅干和兩飲料。最后結帳時,由於HTTP的無狀態性,不通過額外的手段,服務器並不知道用戶到底買了什么。
所以Cookie就是用來繞開HTTP的無狀態性的“額外手段”之一。服務器可以設置或讀取Cookies中包含信息,借此維護用戶跟服務器中的狀態。 -
Cookie的缺陷
1)Cookie會被附加在每個HTTP請求中,所以無形中增加了流量。
2) 由於在HTTP請求中的Cookie是明文傳遞的,所以安全性成問題。(除非用HTTPS)
3) Cookie的大小限制在4KB左右。對於復雜的存儲需求來說是不夠用的。
原文鏈接:http://www.jianshu.com/p/887af1ab4200