Scrapy自定義中間件使用瀏覽器cookie模擬登錄原理及代碼

之前的文章介紹過如何使用FormRequest提交登錄表單模擬登錄

。但很多網站登錄時都要求輸入驗證碼來防止爬蟲。如12306的圖片點擊驗證碼、淘寶的滑動圖片驗證碼。複雜的驗證碼很難自動識別,本文介紹一種簡單地登錄方式:首先在瀏覽器人工登錄,然後通過自定義中間件使用瀏覽器Cookie直接發送HTTP請求,從而跳過表單登錄的步驟


獲取瀏覽器cookie

第三方Python庫browsercookie可以方便的獲取Chrome和Firefox瀏覽器Cookie,開發者無需關心各種瀏覽器以哪種形式存儲在哪裡。

1. 使用pip安裝browsercookie

pip install browsercookie

2. browsercookie的簡單使用

>>> import browsercookie

>>> # 獲取Chrome瀏覽器cookie

>>> chrome_cookiejar =browsercookie.chrome()

>>> type(chrome_cookiejar)

<class>

>>> # 打印cookie

>>> for cookie in chrome_cookiejar:

... print(cookie)

...

<cookie>

<cookie>

……


Scrapy中間件CookieMiddleware核心方法與工作原理

Scrapy使用的Cookie由CookieMiddleware中間件自動處理。它有以下幾個核心方法:

  • from_crawler

    從配置文件中讀取COOKIES_ENABLE,決定是否啟用該中間件。如果啟用,調用構造器對象,否則拋出NotConfigured異常,Scrapy將忽略該中間件。

  • __init__

    使用標準庫中的collections.defaultdict創建一個默認字典self.jars,該字典中每一個值都是一個scrapy.http.cookies.CookierJar對象。

  • process_request

    處理每一個待發送的Request對象,嘗試從request.meta['cookiejar']中獲取用戶指定的CookieJar。如果用戶未指定,則使用默認CookieJar(self.jars[None])。調用self.get_request_cookies方法獲取發送請求request應攜帶的Cookie信息,填寫到HTTP請求中。

  • process_response

    處理每一個Resonse對象,調用request.meta['cookiejar']獲取CookieJar對象,調用extract_cookies方法將HTTP響應頭部中的Cookie保存到CookieJar對象中。


自定義中間件BrowserCookieMiddleware

實現自定義BrowseCookieMiddleware的核心思想是:繼承CookieMiddleware並在構造方法中使用browsercookie提取瀏覽器Cookie並保存到self.jar中。代碼如下:

import browsercookie

from scrapy.downloadmiddlewares.cookies import CookiesMiddleware

class BrowserCookieMiddleware(CookiesMiddleware) :

def __init__(self, debug = False) :

# 調用基類,構造默認的self.jar字典

super().__init__(debug)

# 使用browsercookie加載瀏覽器的cookie

chrome_cookiejar = browsercookie.chrome()

# 將cookie保存至self.jar中

jar = self.jar['chrome']

for cookie in chrome_cookiejar :

jar.set_cookie(cookie)


分享到:


相關文章: