1. 程式人生 > >普通反爬蟲機制的應對策略

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

爬蟲與反爬蟲,這相愛相殺的一對,簡直可以寫出一部壯觀的鬥爭史。而在大資料時代,資料就是金錢,很多企業都為自己的網站運用了反爬蟲機制,防止網頁上的資料被爬蟲爬走。然而,如果反爬機制過於嚴格,可能會誤傷到真正的使用者請求;如果既要和爬蟲死磕,又要保證很低的誤傷率,那麼又會加大研發的成本。
簡單低階的爬蟲速度快,偽裝度低,如果沒有反爬機制,它們可以很快的抓取大量資料,甚至因為請求過多,造成伺服器不能正常工作。而偽裝度高的爬蟲爬取速度慢,對伺服器造成的負擔也相對較小。所以,網站反爬的重點也是那種簡單粗暴的爬蟲,反爬機制也會允許偽裝度高的爬蟲,獲得資料。畢竟偽裝度很高的爬蟲與真實使用者也就沒有太大差別了。
這篇文章主要討論使用Scrapy框架時,如何應對普通的反爬機制。

header檢驗

最簡單的反爬機制,就是檢查HTTP請求的Headers資訊,包括User-Agent, Referer、Cookies等。

User-Agent

User-Agent是檢查使用者所用客戶端的種類和版本,在Scrapy中,通常是在下載器中介軟體中進行處理。比如在setting.py中建立一個包含很多瀏覽器User-Agent的列表,然後新建一個random_user_agent檔案:

123456 classRandomUserAgentMiddleware(object):@classmethoddef process_request(cls,request,spider):ua=random.choice(spider.settings['USER_AGENT_LIST'])ifua: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頭一般格式如下

1 X-Forwarded-For:client1,proxy1,proxy2

這裡將client1,proxy1設定為隨機IP地址,把自己的請求偽裝成代理的隨機IP產生的請求。然而由於X-Forwarded-For可以隨意篡改,很多網站並不會信任這個值。

限制IP的請求數量

如果某一IP的請求速度過快,就觸發反爬機制。當然可以通過放慢爬取速度繞過,這要以爬取時間大大增長為代價。另一種方法就是新增代理。
很簡單,在下載器中介軟體中新增:

1 request.meta['proxy']='http://'+'proxy_host'+':'+proxy_port

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

123 proxies={"http":"http://user:[email protected]:3128/",}

然而Scrapy不支援這種認證方式,需要將認證資訊base64編碼後,加入Headers的Proxy-Authorization欄位:

12345678910 import base64# Set the location of the proxyproxy_string=choice(self._get_proxies_from_file('proxies.txt'))# user:[email protected]:portproxy_items=proxy_string.split('@')request.meta['proxy']="http://%s"%proxy_items[1]# setup basic authentication for the proxyuser_pass=base64.encodestring(proxy_items[0])request.headers['Proxy-Authorization']='Basic '+user_pass

動態載入

現在越來越多的網站使用ajax動態載入內容,這時候可以先擷取ajax請求分析一下,有可能根據ajax請求構造出相應的API請求的URL就可以直接獲取想要的內容,通常是json格式,反而還不用去解析HTML。
然而,很多時候ajax請求都會經過後端鑑權,不能直接構造URL獲取。這時就可以通過PhantomJS+Selenium模擬瀏覽器行為,抓取經過js渲染後的頁面。具體可以參考:Scrapy+PhantomJS+Selenium動態爬蟲
需要注意的是,使用Selenium後,請求不再由Scrapy的Downloader執行,所以之前新增的請求頭等資訊都會失效,需要在Selenium中重新新增

123 headers={...}forkey,value inheaders.iteritems():webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.{}'.format(key)]=value

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

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

相關推薦

普通爬蟲機制應對策略

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

python爬蟲-常見爬蟲機制應對方法

資料頭User-Agent反爬蟲機制解析: 當我們使用瀏覽器訪問網站的時候,瀏覽器會發送一小段資訊給網站,我們稱為Request Headers,在這個頭部資訊裡面包含了本次訪問的一些資訊,例如編碼方式,當前地址,將要訪問的地址等等。這些資訊一般來說是不必要的,但是現在很多

python爬蟲系統學習十一:常見爬蟲機制應對方法

資料頭User-Agent反爬蟲機制解析 我們小時候都聽過一首兒歌。我說一個開頭,大家肯定能把剩下的幾句背出來:小兔子乖乖,把門開啟... 當我們使用瀏覽器訪問網站的時候,瀏覽器會發送一小段資訊給網站,我們稱為Request Headers,在這個頭部資訊裡面包含了本

爬蟲】關於企業信用信息公示系統-加速樂最新爬蟲機制

pos 錯誤頁面 code 小時 timeout googl ear 系統 phantom ( ̄▽ ̄)~*又得半夜修仙了,作為一個爬蟲小白,花了3天時間寫好的程序,才跑了一個月目標網站就更新了,是有點悲催,還是要只有一天的時間重構。 升級後網站的層次結構並沒有太多變化,

常見的爬蟲應對方法

以及 pan 獲取數據 繞過 方式 如果 fir req 取數 0x01 常見的反爬蟲 從功能上來講,爬蟲一般分為數據采集,處理,儲存三個部分。這裏我們只討論數據采集部分。   一般網站從三個方面反爬蟲:用戶請求的Headers,用戶行為,網站目錄和數據加載方式。前兩種比

【逆向工程2】爬蟲機制報告

今天的主題是反爬蟲機制,網站如何能保護好自己的資料,又不影響正常使用者體驗,所謂當今業界一場持久的攻防博弈。 一階爬蟲(技術篇) 應用場景一:靜態結果頁,無頻率限制,無黑名單。 攻:直接採用scrapy爬取 防:nginx層寫lua指令碼,將爬蟲IP加入黑名單,遮蔽一段時間(不提示時

用Python破解有道翻譯爬蟲機制

破解有道翻譯反爬蟲機制 web端的有道翻譯,在之前是直接可以爬的。也就是說只要獲取到了他的介面,你就可以肆無忌憚的使用他的介面進行翻譯而不需要支付任何費用。那麼自從有道翻譯推出他的API服務的時候,就對這個介面做一個反爬蟲機制(如果大家都能免費使用到他的翻譯介面,那他的

Python爬蟲機制

新增請求頭User-Agent: 如果不新增請求頭,網站會認為不是用瀏覽器操作,會進行反爬蟲,新增請求頭,網站會識別你是用哪個瀏覽器,不同的瀏覽器User-Agent不同 修改訪問頻率: 大多數情況下,我們遇到的是訪問頻率限制。如果你訪問太快了,網站就會認為你不是一個人。

Python(4) 用Python破解有道翻譯爬蟲機制

web端的有道翻譯,在之前是直接可以爬的。也就是說只要獲取到了他的介面,你就可以肆無忌憚的使用他的介面進行翻譯而不需要支付任何費用。那麼自從有道翻譯推出他的API服務的時候,就對這個介面做一個反爬蟲機制(如果大家都能免費使用到他的翻譯介面,那他的API服務怎麼賺錢)。這個反爬蟲機制在爬

scrapy: 使用HTTP代理繞過網站爬蟲機制

scrapy提供下載中介軟體機制, 可以在請求佇列與下載請求之間做一些動作. scrapy本身也提供了一個ProxyMiddleware, 但是它只能使用固定的IP地址, 由於免費的代理相當不穩定, 很多代理其實根本不能用. 因此需要對ProxyMiddleware改造使得這個middleware能夠發現代

Python爬取拉勾網資料(破解爬蟲機制)

人生苦短, 我學 Python! 這篇文章主要記錄一下我學習 Python 爬蟲的一個小例子, 是爬取的拉勾網的資料. 1.準備 配置 Python 環境什麼的就不說了, 網上教程很多, 自行解決. 2.扒原始碼 先開啟拉勾網的網頁. 我們要爬取這部分的資料

java給爬蟲設定User-Agent(繞過最表面的爬蟲機制

今天在爬my電影評分時發現訪問被控制,但瀏覽器依舊能訪問,查閱後得知因為java程式與瀏覽器訪問不同,一些採取了簡單採反爬蟲機制的網站可以拒絕這些小爬蟲的訪問。my電影也用了不少反爬蟲策略,比如說票房、評分人數都轉換了編碼讓你不好直接爬取,但我目前不需要那一部分。在給java

python3爬蟲--爬蟲應對機制

網頁 gitbook python python2 正常 ip池 spi target books python3爬蟲--反爬蟲應對機制 內容來源於: Python3網絡爬蟲開發實戰; 網絡爬蟲教程(python2); 前言:   反爬蟲更多是一種攻防戰,針對網站的反爬

如何應對網站爬蟲策略?如何高效地爬大量資料?

爬蟲(Spider),反爬蟲(Anti-Spider),反反爬蟲(Anti-Anti-Spider),這之間的鬥爭恢巨集壯闊...Day 1小莫想要某站上所有的電影,寫了標準的爬蟲(基於HttpClient庫),不斷地遍歷某站的電影列表頁面,根據 Html 分析電影名字存進自己的資料庫。這個站點的運維小黎發現

應對爬蟲策略

伺服器處理web請求DNS:(Domain Name System)域名系統。因特網上作為域名和IP地址相互對映的一個分散式資料庫,能夠使使用者更方便的訪問網際網路。通過主機名,最終得到該主機對應的IP地址的過程叫做域名解析。DNS協議執行在UDP(UserDatagram

python 爬蟲策略之js動態加密url破解

這次這個爬蟲廢了我好幾天時間,第一次遇到js反爬蟲策略,瞬間被打趴下了。不過研究了好幾天之後終於是搞定了,求助的一個朋友,最後的原理我可能也不是太清楚,寫下來,記錄一下,有遇到類似問題的可以參考一下。 這個反爬蟲策略,具體是這樣的,當我寫了一個這樣的get請求。 content = re

防止爬蟲幾個常見策略

動態設定User-Agent(隨機切換User-Agent,模擬不同使用者的瀏覽器資訊) 禁用Cookies(也就是不啟用cookies middleware,不向Server傳送cookies,有些網站通過cookie的使用發現爬蟲行為) 可以通過COOKIES

解決貓眼網爬蟲策略爬蟲

專案程式碼:Github [目錄] 一.引入問題 二.分步實現 1.頁面爬取 2.woff下載 3.字型解析規則 一.引入問題 可以看到,貓眼網電影評分,票房等的資料在響應的html中並不是直接提供給你的。這裡的xefcf,xef87等資料

應對爬蟲問題(正在學習中)

1.構造合理的HTTP請求頭 目前我一般使用的是更改User-Agent 有些網站不喜歡爬蟲訪問,會檢測連線物件,如果是爬蟲程式不會讓你訪問 import requests url='https://www.amazon.cn/' hd={'User-

爬蟲案例|從攻克機制到地理資訊視覺化!

  上圖是上海醫療服務資訊便民查詢系統網站(http://www.soyi.sh.cn/)上公佈的醫療機構位置的熱力圖。 本案例先從該網站抓取全部醫療機構的座標資訊,然後用免費的BDP個人版(http://www.bdp.cn)線上做圖。爬取資料時,我找到了資料的API介面,