之前的文章介紹過如何使用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)
閱讀更多 初沏的茶 的文章