當爬蟲不遵守 robots 協議時,有沒有防止抓取的可能?


先說結論:在爬蟲與反爬蟲的對弈中,爬蟲一定會勝利。換言之,只要人類能夠正常訪問的網頁,爬蟲在具備同等資源的情況下就一定可以抓取到。

robots.txt 只是約定,爬蟲遵守或者不遵守完全在於爬蟲作者的意願。舉個例子,公交車上貼著「請為老弱病殘孕讓座」,但是大部分人並不見得會遵守。一般來講,只有大的搜索引擎爬蟲會遵守你網站的 robots.txt 協議,其它的爬蟲基本都不會看一眼你的 robots.txt 寫的是什麼。

大部分情況下,反爬蟲的需求是不能影響到網站正常使用的,一個網站的功能性需求一定高於反爬蟲需求,所以大部分網站反爬蟲一定不會噁心到正常用戶的使用。比如豆瓣電影的電影詳情頁是 「https://movie.douban.com/subject/26266072/」,其中可變部分為後面代表每部電影的數字編號,豆瓣絕不會為了反爬蟲將網頁 URL 結構替換成淘寶的 URL 那樣複雜。同理百度也一定不會要求你每次訪問就輸入一個驗證碼,來確認你是人類而不是機器。所以這裡首先需要明確一個概念就是:只能儘可能加大爬蟲抓取數據的代價,而不可能做到百分之百防止爬蟲

----------------
那麼,如何加大爬蟲的抓取難度呢?下面根據自己做 Anti-Spider 的一點經驗,胡說幾句吧。

首先,最簡單的方式便是校驗 User-Agent。校驗 User-Agent 其實並不能起到反爬蟲的作用,因為幾乎所有寫爬蟲的人,看到的前三篇教程里,就會有一篇講到要模擬 User-Agent。除了 User-Agent,所有通過 HTTP 請求傳遞到伺服器的客戶端參數都不能完全當做反爬蟲的依據,因為模擬和偽造的成本太低了

然後,一個比較常見的反爬蟲策略是基於訪問數量,爬蟲的訪問總數會遠高於人類,設定一個閾值,超過閾值的就是爬蟲。常見使用這樣處理方式的網站有 58 同城等,在訪問 58 同城較快時,會彈出一個驗證碼。然而只要有規律的 sleep,就可以輕鬆繞過這條限制。

這種處理方案的升級版是找到人與爬蟲訪問特徵的不一致究竟在哪裡。爬蟲與人類在訪問特徵上最大的不一樣在於,人不會長時間持續訪問一個網站,正常人類在天級的時間周期里訪問一個網站的總次數 y 大致滿足——
y = k*x^{a}  (0< a < 1, k > 0)

我們不關心 k、a 的值具體是什麼,但是比較明顯的是,一個正常用戶訪問會在較短時間裡完成某一時間周期的總請求數的絕大部分。映射到總用戶上,確定的一段時間裡,正常用戶訪問的總頁數會在某個量級時開始驟減。
而爬蟲訪問一個網站的總次數 y 與某個時間周期的關係則大致為——
y = k*x(k > 0)

其實就是,爬蟲的訪問數量會隨著時間增長而線性增長。於是,根據這樣的特點,可以參考人類社會的個人所得稅制度或者階梯電價制度,對於一個較短周期設置比較寬的閾值,而隨著時間長度的增加而逐步收緊閾值。當然,具體的閾值設置為多少合適,要根據特定網站的日誌分析之後得出具體數據。

到這裡,很多爬蟲已經會開始表現的精力不足了。大部分爬蟲會直接命中短時間的策略被封,那些 sleep 一下的爬蟲,在爬取一段時間之後,依然會命中中長時間的策略。如果再 sleep,抓取的效率太低,成本與收益不成正比,自然就不會再抓了。

對應的,爬蟲的開發者會想辦法繼續反反爬蟲。常見的方案是通過代理 IP 和批量註冊的賬號。那些大規模抓取數據的爬蟲,為了能夠長時間抓取數據,一般是不會跑在個人電腦上的,而是通過雲伺服器或者 VPS。再進一步的識別爬蟲,則可以根據來訪 IP 的風險屬性進一步識別。一般需要這樣處理的話,都是一些中大型的商業網站了。個人網站一來沒必要,二是沒有精力,一般不會更進一步反爬蟲了。

----------------
時間關係暫且到這裡,後面的內容先寫上提綱,明晚繼續——

  • 通過 IP 屬性結合頻率反爬蟲
  • 用戶的訪問鏈上下文特徵
  • 模擬人類社會的信用等級對用戶、IP 分級
  • 頁面行為分析與識別

一樓說的不錯。
但是我覺得方法並不好。假若來的爬蟲是googlebot類似的搜索引擎爬蟲,你這個站豈不是就不要想出現在搜索引擎上了。
所以我覺得,最最靠譜的方法是在robots.txt里放上釣魚連接。
正常的搜索引擎不會去訪問,不遵守robots規定的也被禁止了。
還有就是限制ip的請求次數把。
但是想完全杜絕爬蟲是不可能的。因為完全沒有辦法確定請求的背後到底是人還是爬蟲。


一種是分析爬蟲特徵,嘗試過濾爬蟲的請求
另外一些可能技巧:

1. 在頁面開頭放上一些釣魚的鏈接(一般人點不到),爬蟲會去訪問,一訪問就把對應的ip封了
2. 頁面全是圖像
3. 頁面內容用javascript來生成
4. 頁面上不提供可以供爬蟲追蹤的鏈接,跳轉都用js觸發


你好,直接抓ajax介面,豈不是更方便更直接呢


見過有些網站設置在http中設置 ln -s ../ dirname 之類的自循環軟鏈接。
但存的從爬蟲角度講,理論上,很難確定獲取url的是人還是計算機。


如果還有獨立 UA 應該還是可以直接在前置伺服器上過濾掉吧。
如果 UA 都偽裝了……就只能上機器學習方法了。


全站ajax非同步獲取數據,然後前端填充。這樣爬蟲沒有牛逼javascript引擎的話,抓到的都是沒有數據的模板。


推薦閱讀:

網路搜索引擎為什麼又要叫爬蟲?
python抓取新浪微博,求教!!?
scrapy可以進行線性/順序抓取嗎?
python爬蟲的中文亂碼問題?
如何解決Python selenium在遠程shell下無法連接瀏覽器的問題?

TAG:爬蟲計算機網路 | robotstxt |