Python 爬蟲(七)-- Scrapy 模擬登入

發表於2017-08-31

1. Cookie原理


HTTP是無狀態的面向連線的協議, 為了保持連線狀態, 引入了Cookie機制

Cookie是http訊息頭中的一種屬性,包括:

  • Cookie名字(Name)Cookie的值(Value)
  • Cookie的過期時間(Expires/Max-Age)
  • Cookie作用路徑(Path)
  • Cookie所在域名(Domain),使用Cookie進行安全連線(Secure)。

前兩個引數是Cookie應用的必要條件,另外,還包括Cookie大小(Size,不同瀏覽器對Cookie個數及大小限制是有差異的)。

更詳細的cookie

2. 模擬登陸


這次主要爬取的網站是知乎

爬取知乎就需要登陸的, 通過之前的python內建庫, 可以很容易的實現表單提交

現在就來看看如何通過Scrapy實現表單提交

首先檢視登陸時的表單結果, 依然像前面使用的技巧一樣, 故意輸錯密碼, 方面抓到登陸的網頁頭部和表單(我使用的Chrome自帶的開發者工具中的Network功能)

cpp_py_medium

表單截圖

檢視抓取到的表單可以發現有四個部分:

  • 郵箱和密碼就是個人登陸的郵箱和密碼
  • rememberme欄位表示是否記住賬號
  • 第一個欄位是_xsrf,猜測是一種驗證機制

現在只有_xsrf不知道, 猜想這個驗證欄位肯定會實現在請求網頁的時候傳送過來, 那麼我們檢視當前網頁的原始碼(滑鼠右鍵然後檢視網頁原始碼, 或者直接用快捷鍵)

cpp_py_medium

查詢網頁原始碼

發現我們的猜測是正確的

那麼現在就可以來寫表單登陸功能了

其中主要的功能都在函式的註釋中說明

3. Cookie的儲存


為了能使用同一個狀態持續的爬取網站, 就需要儲存cookie, 使用cookie儲存狀態, Scrapy提供了cookie處理的中介軟體, 可以直接拿來使用

CookiesMiddleware

這個cookie中介軟體儲存追蹤web伺服器發出的cookie, 並將這個cookie在接來下的請求的時候進行傳送

Scrapy官方的文件中給出了下面的程式碼範例 :

那麼可以對我們的爬蟲類中方法進行修改, 使其追蹤cookie

4. 偽裝頭部


有時候登陸網站需要進行頭部偽裝, 比如增加防盜鏈的頭部, 還有模擬伺服器登陸, 這些都在前面的爬蟲知識中提到過

cpp_py_medium

Headers

為了保險, 我們可以在頭部中填充更多的欄位, 如下

在scrapy中RequestFormRequest初始化的時候都有一個headers欄位, 可以自定義頭部, 這樣我們可以新增headers欄位

形成最終版的登陸函式

5. Item類和抓取間隔


完整的知乎爬蟲程式碼連結

設定抓取間隔, 訪問由於爬蟲的過快抓取, 引發網站的發爬蟲機制, 在setting.py中設定

更多設定可以檢視官方文件

抓取結果(只是擷取了其中很少一部分)

6. 存在問題

  • Rule設計不能實現全網站抓取, 只是設定了簡單的問題的抓取
  • Xpath設定不嚴謹, 需要重新思考
  • Unicode編碼應該轉換成UTF-8

相關文章