爬蟲進階:Scrapy抓取boss直聘、拉勾心得經驗
關於使用Scrapy的體會,最明顯的感受就是這種模板化、工程化的腳手架體系,可以說是拿來即可開箱便用,大多僅需按一定的規則套路配置,剩下的就是專注於編寫跟爬蟲業務有關的程式碼。絕大多數的反反爬蟲策略,大多有以下幾種:
- 忽略robots.txt協議
- 新增隨機請求頭,如cookie、user-agent等
- sleep休眠
- 控制併發請求數、設定頁面下載延遲
- 驗證碼識別(靠譜)
- 使用ip代理池(最靠譜)
文章的出發點是share本人使用scrapy爬取Boss和拉勾兩個招聘網的一些實操總結經驗。兩個網站的網頁結構不盡相同,好在需要及提取出的最終資料基本保持了一致,出於兩個網站不同的反爬策略和請求配置(settings.py
友情提醒,這裡不介紹scrapy示例及完整程式碼(Tip: 下方貼有完整程式碼連結)。如文章標題描述的那樣,由於拉勾和Boss都有各自不同的反爬策略,多少也限制了一些爬蟲學習者的熱情,包括我自身在內,不過多番嘗試之後還是有收穫的,跑的是定時計劃,目前已入庫的有近三萬條資料。
進入正題,下面分別介紹拉勾網以及Boss直聘網崗位招聘資料的爬取心得,不過網站的反爬策略和網頁結構隨時都有發生變動的可能,因此還是需要根據實際情況進行再調整。本次分享的內容截止到2018年09月28日,在實際執行專案中依然生效。
拉勾
- 關閉預設
cookie
(否則會跟請求頭中的Cookie
headers
並新增隨機Cookie
屬性- 在
settings.py
中找到並設定COOKIES_ENABLED = False
- 可以在spider程式碼中為
Request
手動新增headers
,或者修改settings.py
中的DEFAULT_REQUEST_HEADERS
屬性,或者編寫自定義的HeadersMiddleware(繼承DefaultHeadersMiddleware
,重寫process_request
方法,別忘了配置)
- 在
拉勾網的cookie,用uuid隨機生成即可,參考如下:
def random_cookie():
args = (uuid.uuid4( ),) * 5
cookie = 'user_trace_token={}; LGUID={}; JSESSIONID={}; LGSID={}; LGRID={}'.format(*args)
return cookie
- 控制併發請求數及設定下載延遲
在settings.py
中找到並設定如下,因此理論上一天可抓60/2 * 2 * 60 * 24 =
86400條資料:
# 當併發數和下載延遲均設定為2時,沒有出現反爬限制(可多次嘗試)
CONCURRENT_REQUESTS = 2
DOWNLOAD_DELAY = 2
補充:上述說明中,請求Cookie是必須要加的,否則會重定向到登入頁面;在未使用ip代理的情況下,併發數不宜設定過大,親測是直接封了IP…
Boss直聘
對比拉勾網,感覺直聘網的反爬策略會更加嚴格,不過抓慢一點還是可以的(這樣理論上一天是60/5 * 1 * 60 * 24 =
17280條資料)
-
設定隨機
User-Agent
(可能非必需) -
控制併發請求數、下載延遲
# 這麼慢還是被限制...
CONCURRENT_REQUESTS = 1
DOWNLOAD_DELAY = 5
- 加入驗證碼識別
事實上,這種情況下限制後是被重定向到一個驗證碼頁面。本人目前的解決方案是編寫自定義的CustomRedirectMiddleware(繼承RedirectMiddleware
,重寫process_response
方法進行驗證碼識別[第三方API])
小結
分享的都是比較曲中的解決方案,不差錢的建議直接上ip代理(實測過免費的,別指望了)。
相關程式碼 - 拉勾
相關程式碼 - boss
歡迎關注我的個人公眾號:超級碼里奧
如果這對您有幫助,歡迎點贊和分享,轉載請註明出處