1、放慢爬取速度,減小對于目標(biāo)網(wǎng)站造成的壓力。但是這樣會減少單位時間類的爬取量。
專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)湖里免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
第二種方法是通過設(shè)置IP等手段,突破反爬蟲機(jī)制繼續(xù)高頻率爬取。網(wǎng)站的反爬機(jī)制會檢查來訪的IP地址,為了防止IP被封,這時就可以使用HTTP,來切換不同的IP爬取內(nèi)容。使用代理IP簡單的來講就是讓代理服務(wù)器去幫我們得到網(wǎng)頁內(nèi)容,然后再轉(zhuǎn)發(fā)回我們的電腦。要選擇高匿的ip,IPIDEA提供高匿穩(wěn)定的IP同時更注重用戶隱私的保護(hù),保障用戶的信息安全。
2、這樣目標(biāo)網(wǎng)站既不知道我們使用代理,更不會知道我們真實(shí)的IP地址。
3、建立IP池,池子盡可能的大,且不同IP均勻輪換。
如果你需要大量爬去數(shù)據(jù),建議你使用HTTP代理IP,在IP被封掉之前或者封掉之后迅速換掉該IP,這里有個使用的技巧是循環(huán)使用,在一個IP沒有被封之前,就換掉,過一會再換回來。這樣就可以使用相對較少的IP進(jìn)行大量訪問。
網(wǎng)絡(luò)爬蟲為什么被封?當(dāng)中最直接的因素的就是訪問速度過快,這個不要說爬取抓取了,就算用戶自己點(diǎn)擊太快也是會被提示訪問頻率過快的。網(wǎng)絡(luò)爬蟲的訪問速度若是一直都很快,而且都使用同一個IP地址訪問,這是很快IP便會被封的。
面對這個問題,網(wǎng)絡(luò)爬蟲通常是怎么處理的呢?不外乎是兩類方法,首位降低訪問速度,其次切換IP訪問。
爬蟲降低訪問速度
鑒于上文所指的訪問速度過快會引起IP被封,那么最直接的辦法就是降低訪問速度,這樣就能防止了我們的IP被封的問題。但呢,降低速度,爬蟲的效率就降低,關(guān)鍵還是要降低到什么程度?
在這一點(diǎn)上,我們首先要檢測出網(wǎng)站設(shè)置的限制速度閾值,這樣我們才可以設(shè)置合理的訪問速度,建議不要設(shè)固定的訪問速度,可以設(shè)置在一個范圍之內(nèi),預(yù)防過于規(guī)律而被系統(tǒng)檢測到,進(jìn)而導(dǎo)致IP被封。
爬蟲切換IP訪問
降低了訪問速度,在所難免的影響到了爬取的抓取效率,無法高效的抓取,這樣的抓取速度與人工抓取有什么區(qū)別呢?都沒有了使用爬蟲抓取的優(yōu)勢了。
即然單個爬蟲被控制了速度,但我們可以使用多個爬蟲同時去抓取??!是的,我們可以使用多線程,多進(jìn)程,這里要配合使用代理,不一樣的線程使用不同的IP地址,就好像同時有不同的用戶在訪問,這樣就能極大地提高爬蟲的爬取效率了。
1、從用戶請求的Headers反爬蟲是最常見的反爬蟲策略。
偽裝header。很多網(wǎng)站都會對Headers的User-Agent進(jìn)行檢測,還有一部分網(wǎng)站會對Referer進(jìn)行檢測(一些資源網(wǎng)站的防盜鏈就是檢測Referer)。如果遇到了這類反爬蟲機(jī)制,可以直接在爬蟲中添加Headers,將瀏覽器的User-Agent復(fù)制到爬蟲的Headers中;或者將Referer值修改為目標(biāo)網(wǎng)站域名[評論:往往容易被忽略,通過對請求的抓包分析,確定referer,在程序中模擬訪問請求頭中添加]。對于檢測Headers的反爬蟲,在爬蟲中修改或者添加Headers就能很好的繞過。
2、基于用戶行為反爬蟲
還有一部分網(wǎng)站是通過檢測用戶行為,例如同一IP短時間內(nèi)多次訪問同一頁面,或者同一賬戶短時間內(nèi)多次進(jìn)行相同操作。[這種防爬,需要有足夠多的ip來應(yīng)對]
(1)、大多數(shù)網(wǎng)站都是前一種情況,對于這種情況,使用IP代理就可以解決??梢詫iT寫一個爬蟲,爬取網(wǎng)上公開的代理ip,檢測后全部保存起來。有了大量代理ip后可以每請求幾次更換一個ip,這在requests或者urllib中很容易做到,這樣就能很容易的繞過第一種反爬蟲。
編寫爬蟲代理:
步驟:
1.參數(shù)是一個字典{'類型':'代理ip:端口號'}
proxy_support=urllib.request.ProxyHandler({})
2.定制、創(chuàng)建一個opener
opener=urllib.request.build_opener(proxy_support)
3a.安裝opener
urllib.request.install_opener(opener)
3b.調(diào)用opener
opener.open(url)
用大量代理隨機(jī)請求目標(biāo)網(wǎng)站,應(yīng)對反爬蟲
一般有一下幾種
一些常用的方法
IP代理
對于IP代理,各個語言的Native Request API都提供的IP代理響應(yīng)的API, 需要解決的主要就是IP源的問題了.
網(wǎng)絡(luò)上有廉價的代理IP(1元4000個左右), 我做過簡單的測試, 100個IP中, 平均可用的在40-60左右, 訪問延遲均在200以上.
網(wǎng)絡(luò)有高質(zhì)量的代理IP出售, 前提是你有渠道.
因?yàn)槭褂肐P代理后, 延遲加大, 失敗率提高, 所以可以將爬蟲框架中將請求設(shè)計(jì)為異步, 將請求任務(wù)加入請求隊(duì)列(RabbitMQ,Kafka,Redis), 調(diào)用成功后再進(jìn)行回調(diào)處理, 失敗則重新加入隊(duì)列. 每次請求都從IP池中取IP, 如果請求失敗則從IP池中刪除該失效的IP.
Cookies
有一些網(wǎng)站是基于cookies做反爬蟲, 這個基本上就是如 @朱添一 所說的, 維護(hù)一套Cookies池
注意研究下目標(biāo)網(wǎng)站的cookies過期事件, 可以模擬瀏覽器, 定時生成cookies
限速訪問
像開多線程,循環(huán)無休眠的的暴力爬取數(shù)據(jù), 那真是分分鐘被封IP的事, 限速訪問實(shí)現(xiàn)起來也挺簡單(用任務(wù)隊(duì)列實(shí)現(xiàn)), 效率問題也不用擔(dān)心, 一般結(jié)合IP代理已經(jīng)可以很快地實(shí)現(xiàn)爬去目標(biāo)內(nèi)容.
一些坑
大批量爬取目標(biāo)網(wǎng)站的內(nèi)容后, 難免碰到紅線觸發(fā)對方的反爬蟲機(jī)制. 所以適當(dāng)?shù)母婢崾九老x失效是很有必有的.
一般被反爬蟲后, 請求返回的HttpCode為403的失敗頁面, 有些網(wǎng)站還會返回輸入驗(yàn)證碼(如豆瓣), 所以檢測到403調(diào)用失敗, 就發(fā)送報(bào)警, 可以結(jié)合一些監(jiān)控框架, 如Metrics等, 設(shè)置短時間內(nèi), 告警到達(dá)一定閥值后, 給你發(fā)郵件,短信等.
當(dāng)然, 單純的檢測403錯誤并不能解決所有情況. 有一些網(wǎng)站比較奇葩, 反爬蟲后返回的頁面仍然是200的(如去哪兒), 這時候往往爬蟲任務(wù)會進(jìn)入解析階段, 解析失敗是必然的. 應(yīng)對這些辦法, 也只能在解析失敗的時候, 發(fā)送報(bào)警, 當(dāng)告警短時間到達(dá)一定閥值, 再觸發(fā)通知事件.
當(dāng)然這個解決部分并不完美, 因?yàn)橛袝r候, 因?yàn)榫W(wǎng)站結(jié)構(gòu)改變, 而導(dǎo)致解析失敗, 同樣回觸發(fā)告警. 而你并不能很簡單地區(qū)分, 告警是由于哪個原因引起的.