爬蟲與反爬蟲,這相愛相殺的一對,的確可以寫出一部壯觀的斗爭史。而在大數據時代,數據就是款子,許多企業都為本身的網站運用了反爬蟲機制,防備網頁上的數據被爬蟲爬走。然而,假如反爬機制過于嚴格,大概會誤傷到真正的用戶請求;假如既要和爬蟲死磕,又要擔保很低的誤傷率,那么又會加大研發的本錢。
簡樸初級的爬蟲速度快,偽裝度低,假如沒有反爬機制,它們可以很快的抓取大量數據,甚至因為請求過多,造成處事器不能正常事情。而偽裝度高的爬蟲爬取速度慢,對處事器造成的承擔也相對較小。所以,網站反爬的重點也是那種簡樸粗暴的爬蟲,反爬機制也會答允偽裝度高的爬蟲,得到數據。究竟偽裝度很高的爬蟲與真實用戶也就沒有太大不同了。
這篇文章主要接頭利用 Scrapy 框架時,如何應對普通的反爬機制。
header 檢討
最簡樸的反爬機制,就是查抄 HTTP 請求的 Headers 信息,包羅 User-Agent, Referer、Cookies 等。
User-Agent
User-Agent 是查抄用戶所用客戶端的種類和版本,在 Scrapy 中,凡是是在下載器中間件中舉辦處理懲罰。好比在 setting.py 中成立一個包括許多欣賞器 User-Agent 的列表,然后新建一個 random_user_agent 文件:
這樣就可以在每次請求中,隨機選取一個真實欣賞器的 User-Agent。
Referer
Referer 是查抄此請求由那邊來,凡是可以做圖片的盜鏈判定。在 Scrapy 中,假如某個頁面 url 是通過之前爬取的頁面提取到,Scrapy 會自動把之前爬取的頁面 url 作為 Referfer。也可以通過上面的方法本身界說 Referfer 字段。
Cookies
網站大概會檢測 Cookie 中 session_id 的利用次數,假如高出限制,就觸發反爬計策。所以可以在 Scrapy 中配置 COOKIES_ENABLED = False 讓請求不帶 Cookies。
也有網站強制開啟 Cookis,這時就要貧苦一點了。可以另寫一個簡樸的爬蟲,按時向方針網站發送不帶 Cookies 的請求,提取響應中 Set-cookie 字段信息并生存。爬取網頁時,把存儲起來的 Cookies 帶入 Headers 中。
X-Forwarded-For
在請求頭中添加 X-Forwarded-For 字段,將本身申明為一個透明的署理處事器,一些網站對署理處事器會手軟一些。
X-Forwarded-For 頭一般名目如下
這里將 client1,proxy1 配置為隨機 IP 地點,把本身的請求偽裝成署理的隨機 IP 發生的請求。然而由于 X-Forwarded-For 可以隨意改動,許多網站并不會信任這個值。
限制 IP 的請求數量
假如某一 IP 的請求速渡過快,就觸發反爬機制。雖然可以通過放慢爬取速度繞過,這要以爬取時間大大增長為價錢。另一種要領就是添加署理。
然后再每次請求時利用差異的署理 IP。然而問題是如何獲取大量的署理 IP?
可以本身寫一個 IP 署理獲取和維護系統,按時從各類披露免費署理 IP 的網站爬取免費 IP 署理,然后按時掃描這些 IP 和端口是否可用,將不行用的署理 IP 實時清理。這樣就有一個動態的署理庫,每次請求再從庫中隨機選擇一個署理。然而這個方案的缺點也很明明,開拓署理獲取和維護系統自己就很費時艱辛,而且這種免費署理的數量并不多,并且不變性都較量差。假如必需要用到署理,也可以去買一些不變的署理處事。這些處事大多會用到帶認證的署理。
在 requests 庫中添加帶認證的署理很簡樸,
然而 Scrapy 不支持這種認證方法,需要將認證信息 base64 編碼后,插手 Headers 的 Proxy-Authorization 字段:
import base64
動態加載
此刻越來越多的網站利用 ajax 動態加載內容,這時候可以先截取 ajax 請求闡明一下,有大概按照 ajax 請求結構出相應的 API 請求的 URL 就可以直接獲取想要的內容,凡是是 json 名目,反而還不消去理會 HTML。
然而,許多時候 ajax 請求城市經事后端鑒權,不能直接結構 URL 獲取。這時就可以通過 PhantomJS+Selenium 模仿欣賞器行為,抓取顛末 js 渲染后的頁面。詳細可以參考:Scrapy+PhantomJS+Selenium 動態爬蟲
需要留意的是,利用 Selenium 后,請求不再由 Scrapy 的 Downloader 執行,所以之前添加的請求頭等信息城市失效,需要在 Selenium 中從頭添加