1. 程式人生 > >爬蟲進階:Scrapy抓取boss直聘、拉勾心得經驗

爬蟲進階:Scrapy抓取boss直聘、拉勾心得經驗

關於使用Scrapy的體會,最明顯的感受就是這種模板化、工程化的腳手架體系,可以說是拿來即可開箱便用,大多僅需按一定的規則套路配置,剩下的就是專注於編寫跟爬蟲業務有關的程式碼。絕大多數的反反爬蟲策略,大多有以下幾種:

  • 忽略robots.txt協議
  • 新增隨機請求頭,如cookie、user-agent等
  • sleep休眠
  • 控制併發請求數、設定頁面下載延遲
  • 驗證碼識別(靠譜)
  • 使用ip代理池(最靠譜)

文章的出發點是share本人使用scrapy爬取Boss和拉勾兩個招聘網的一些實操總結經驗。兩個網站的網頁結構不盡相同,好在需要及提取出的最終資料基本保持了一致,出於兩個網站不同的反爬策略和請求配置(settings.py

),因此對應實際的情況是兩個Scrapy專案。

友情提醒,這裡不介紹scrapy示例及完整程式碼(Tip: 下方貼有完整程式碼連結)。如文章標題描述的那樣,由於拉勾和Boss都有各自不同的反爬策略,多少也限制了一些爬蟲學習者的熱情,包括我自身在內,不過多番嘗試之後還是有收穫的,跑的是定時計劃,目前已入庫的有近三萬條資料。

Data

進入正題,下面分別介紹拉勾網以及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
歡迎關注我的個人公眾號:超級碼里奧
如果這對您有幫助,歡迎點贊和分享,轉載請註明出處