普通反爬蟲機制的應對策略

2021-09-23 07:16:58 字數 3261 閱讀 5843

爬蟲與反爬蟲,這相愛相殺的一對,簡直可以寫出一部壯觀的鬥爭史。而在大資料時代,資料就是金錢,很多企業都為自己的**運用了反爬蟲機制,防止網頁上的資料被爬蟲爬走。然而,如果反爬機制過於嚴格,可能會誤傷到真正的使用者請求;如果既要和爬蟲死磕,又要保證很低的誤傷率,那麼又會加大研發的成本。

簡單低階的爬蟲速度快,偽裝度低,如果沒有反爬機制,它們可以很快的抓取大量資料,甚至因為請求過多,造成伺服器不能正常工作。而偽裝度高的爬蟲爬取速度慢,對伺服器造成的負擔也相對較小。所以,**反爬的重點也是那種簡單粗暴的爬蟲,反爬機制也會允許偽裝度高的爬蟲,獲得資料。畢竟偽裝度很高的爬蟲與真實使用者也就沒有太大差別了。

這篇文章主要討論使用scrapy框架時,如何應對普通的反爬機制。

header檢驗

最簡單的反爬機制,就是檢查http請求的headers資訊,包括user-agent, referer、cookies等。

user-agent

class randomuseragentmiddleware(object): 

@classmethod 

defprocess_request(cls, request, spider): 

ua = random.choice(spider.settings['user_agent_list']) 

if ua: 

request.headers.setdefault('user-agent', ua) 

這樣就可以在每次請求中,隨機選取乙個真實瀏覽器的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頭一般格式如下

x-forwarded-for: client1, proxy1, proxy2 

限制ip的請求數量

如果某一ip的請求速度過快,就觸發反爬機制。當然可以通過放慢爬取速度繞過,這要以爬取時間大大增長為代價。另一種方法就是新增**。

然後再每次請求時使用不同的**ip。然而問題是如何獲取大量的**ip?

可以自己寫乙個ip**獲取和維護系統,定時從各種披露免費**ip的**爬取免費ip**,然後定時掃瞄這些ip和埠是否可用,將不可用的**ip及時清理。這樣就有乙個動態的**庫,每次請求再從庫中隨機選擇乙個**。然而這個方案的缺點也很明顯,開發**獲取和維護系統本身就很費時費力,並且這種免費**的數量並不多,而且穩定性都比較差。如果必須要用到**,也可以去買一些穩定的**服務。這些服務大多會用到帶認證的**。

在requests庫中新增帶認證的**很簡單,

proxies =  

然而scrapy不支援這種認證方式,需要將認證資訊base64編碼後,加入headers的proxy-authorization欄位:

動態載入

現在越來越多的**使用ajax動態載入內容,這時候可以先擷取ajax請求分析一下,有可能根據ajax請求構造出相應的api請求的url就可以直接獲取想要的內容,通常是json格式,反而還不用去解析html。

然而,很多時候ajax請求都會經過後端鑑權,不能直接構造url獲取。這時就可以通過phantomjs+selenium模擬瀏覽器行為,抓取經過js渲染後的頁面。

需要注意的是,使用selenium後,請求不再由scrapy的**********執行,所以之前新增的請求頭等資訊都會失效,需要在selenium中重新新增

headers =  

forkey, valuein headers.iteritems(): 

webdriver.desiredcapabilities.phantomjs['phantomjs.page.customheaders.{}'.format(key)] = value 

另外,呼叫phantomjs需要指定phantomjs的可執行檔案路徑,通常是將該路徑新增到系統的path路徑,讓程式執行時自動去path中尋找。我們的爬蟲經常會放到crontab中定時執行,而crontab中的環境變數和系統的環境變數不同,所以就載入不到phamtonjs需要的路徑,所以最好是在申明時指定路徑:

driver = webdriver.phantomjs(executable_path='/usr/local/bin/phantomjs')

爬蟲高階 反爬策略的應對機制

爬蟲與反爬蟲,這相愛相殺的一對,簡直可以寫出一部壯觀的鬥爭史。而在大資料時代,資料就是金錢,很多企業都為自己的 運用了反爬蟲機制,防止網頁上的資料被爬蟲爬走。然而,如果反爬機制過於嚴格,可能會誤傷到真正的使用者請求 如果既要和爬蟲死磕,又要保證很低的誤傷率,那麼又會加大研發的成本。簡單低階的爬蟲速度...

python3爬蟲 反爬蟲應對機制

前言 訪問終端限制 這種可通過偽造動態的ua實現 訪問次數限制 一般通過cookie ip定位,可通過禁用cookie,或使用cookie池 ip池來反制 訪問時間限制 延遲請求應對 盜鏈問題 通俗講就是,某個網頁的請求是有跡可循的,比如知乎的問題回答詳情頁,正常使用者行為必然是先進入問題頁,在進入...

爬蟲反爬機制及反爬策略

參考 爬蟲是一種模擬瀏覽器對 發起請求,獲取資料的方法。簡單的爬蟲在抓取 資料的時候,因為對 訪問過於頻繁,給伺服器造成過大的壓力,容易使 崩潰,因此 維護者會通過一些手段避免爬蟲的訪問,以下是幾種常見的反爬蟲和反反爬蟲策略 爬蟲與反爬蟲,這相愛相殺的一對,簡直可以寫出一部壯觀的鬥爭史。而在大資料時...