筆者所在公司是一家網際網路金融公司,其中最大的一塊業務就是貸款。當一個使用者向我們申請貸款時,我們需要使用者授權獲取使用者的徵信資料,然後將資料交給風控規則引擎生成一份資料包告,憑藉這份資料包告來判斷是否可以給這個使用者放貸。
其中獲取使用者徵信資料這一步就是用爬蟲來實現的。爬蟲的應用領域非常廣泛,技術手段也是五花八門。本文主要以央行徵信報告為爬取目標,講解三種爬蟲的技術解決方案。方案一:基於介面的爬蟲
技術棧:
- nodejs
- request
- cheerio
優點:
- 流程簡單
- 支援並行爬取
- 響應速度快
- 對環境沒有特殊要求
缺點:
- 需要手動維護使用者cookie
- 方案不可用
補充:
這個方案其實本來是最佳方案。但後來央行徵信改版,登入頁密碼框改用ActiveX控制元件來加密使用者密碼。純介面的方式無法通過央行徵信的登入驗證,所以該方案現在已經不可用了。
方案二:基於瀏覽器的爬蟲
技術棧:
- nodejs
- selenium
- winio
- jquery
優點:
- 可通過央行徵信的登入驗證
- 不需要維護使用者cookie
缺點:
- 依賴IE瀏覽器環境
- 響應速度慢
- 不支援並行爬取
- 驅動級鍵盤輸入不穩定
補充:
由於ActiveX控制元件只能在IE瀏覽器中才能載入,所以爬蟲程式必須部署在windows機器上,也就是圖中的worker機。另外,ActiveX控制元件的密碼無法通過程式碼直接複製,必須依賴驅動級鍵盤輸入來輸入使用者密碼。
方案三:基於瀏覽器+介面的爬蟲
技術棧:
- nodejs
- selenium
- winio
- request
- cheerio
優點:
- 可通過央行徵信的登入驗證
- 響應速度快
- 支援並行爬取
缺點:
- 依賴IE瀏覽器環境
- 驅動級鍵盤輸入不穩定
- 需要部署多臺worker機
- 流程複雜
- 需要手動維護使用者cookie
補充:
該方案其實是結合了方案一和方案二的優點。worker機用來載入ActiveX控制元件,輸入使用者密碼,獲取加密後密碼後返回給爬蟲服務端。剩下的流程就都和方案一相同。
代理優化
央行徵信有反爬機制,如果同一個IP登入了很多個使用者,這個IP就有可能被封。所以爬蟲程式需要加代理IP來提升穩定性和成功率。這個問題其實挺好解決的,花錢買一個代理IP服務就好了。
但是代理IP服務商的質量參差不齊,服務好的價格貴,便宜的又不穩定。如果你像筆者一樣,只能申請到像太陽代理這樣的渣渣代理。那我這裡給你提供一個思路,提升渣渣代理服務的穩定性。
寫一個定時任務,每隔一段時間就獲取一次IP,每次取n個。然後分別用這些個IP去請求央行徵信的登入頁,如果1秒內成功響應,就把這個IP存到IP池裡,否則就丟棄。
通過定時任務維護一個高質量的IP池,可以極大地提升爬蟲的穩定性和成功率。
其他
以上三種方案以及代理優化方案,都在筆者所在公司生產環境使用過。實際使用的技術棧和文中列舉的有所出入。文中的技術棧是我事後總結覺得最佳的技術方案。今後我會抽時間重構方案三的程式碼,然後開源到github。