我剛開始考慮今天創建/定製網絡爬蟲,並且對網絡爬蟲/機器人禮儀知之甚少。我發現的大部分禮儀文章看起來都很老舊,很尷尬,所以我想從網絡開發者社區獲得一些當前(和實用)的見解。創建網絡爬蟲程序時需要考慮什麼?
我想使用爬蟲遍歷「網絡」以實現超級簡單的目的 - 「網站XYZ的標記是否滿足條件ABC?」。
這引發了很多問題要問我,但我想我需要走出的第一方式的兩個主要問題是:
- 感覺有點「玄乎」從一開始走 - 這種事情是可以接受的嗎?
- 抓取工具應該具體考慮哪些因素,以免讓人不安?
我剛開始考慮今天創建/定製網絡爬蟲,並且對網絡爬蟲/機器人禮儀知之甚少。我發現的大部分禮儀文章看起來都很老舊,很尷尬,所以我想從網絡開發者社區獲得一些當前(和實用)的見解。創建網絡爬蟲程序時需要考慮什麼?
我想使用爬蟲遍歷「網絡」以實現超級簡單的目的 - 「網站XYZ的標記是否滿足條件ABC?」。
這引發了很多問題要問我,但我想我需要走出的第一方式的兩個主要問題是:
服從robots.txt(並不像過去那麼激進)已經說過了。
您可能想要考慮一下您的用戶代理字符串 - 它們是預先知道您正在做什麼以及如何與您聯繫的好地方。
我想說,考慮您造成多少負載是非常重要的。例如,如果您的搜尋器一次或多或少地請求單個站點的每個對象,則可能會導致該特定站點的負載問題。
換句話說,請確保您的抓取工具不太過分。
完全可以接受 - 只要確保每次會話只訪問一次每頁。當你在技術上創建一個searchbot時,你必須遵守robots.txt和no-cache
規則。如果需要阻止IP,人們仍然可以專門阻止您的機器人。
你只是在尋找源代碼,據我所知,所以你想要建立一些東西,遵循<link>
s樣式表和<script src="..."></script>
爲JavaScripts。
負荷是一個很大的考慮因素。限制您抓取特定網站的頻率以及完成目標所需的最基本信息。如果你正在尋找文字,不要下載所有的圖像,像這樣的東西。
當然要服從robots.txt,但也要確保您的用戶代理字符串包含準確的聯繫信息,並且可能指向描述您在做什麼以及如何執行操作的網頁的鏈接。如果一個網絡管理員看到很多你的請求,並且很好奇,你可以通過一個信息豐富的網頁回答很多問題。
除了WillDean和Einar的很好的答案之外,我真的建議你花一些時間閱讀HTTP響應代碼的含義,以及爬蟲在遇到每個響應代碼時應該做些什麼,因爲它會在很大程度上改變你的表現,無論你是否被某些網站禁止。
一些有用的鏈接:
請務必在您的用戶代理字符串的URL解釋誰/爲什麼你的機器人是什麼/爬行。
另外別忘了遵守機器人meta標籤:http://www.w3.org/TR/html4/appendix/notes.html#h-B.4.1.2
另一件事想 - 當蜘蛛網頁,不要太草率決定的事情不存在或有錯誤。某些頁面由於維護工作或在短時間內得到糾正的錯誤而處於脫機狀態。
如果我懷疑某個頁面應該存在,因爲它是由其他頁面指向的,那麼我會將代碼插入到我的「重試」隊列中,以便稍後再嘗試。如果再次失敗,計數器會增加,直到計數器超出我的重試限制,或者頁面恢復在線。 – 2013-01-20 22:44:42
所有優點,在這裏提出的。您還必須處理動態生成的Java和JavaScript鏈接,參數和會話ID,轉義單引號和雙引號,相對鏈接失敗嘗試(使用../../越過根目錄),區分大小寫,幀,重定向,餅乾....
我可以繼續幾天,有點。我有一個覆蓋大部分這個的Robots Checklist,我很高興回答我可以。
您還應該考慮使用開放源碼機器人爬蟲代碼,因爲它可以讓您在所有這些問題上大顯身手。我也有一個頁面:open source robot code。希望有所幫助!
您需要添加一些功能來黑名單站點/域或其他東西(IP範圍,ASN等),以避免您的蜘蛛陷入垃圾郵件網站。
您需要擁有一個HTTP實現,對超時和行爲有很多控制權。期望很多網站發送無效回覆,巨大響應,垃圾頭,或者只是讓連接無限期地打開而沒有響應等。
也不要相信200狀態來表示「頁面存在」。根據我的經驗(與一個大的HTML文檔一起),相當大比例的網站發回200個「找不到」或其他錯誤。
你會得到'200'來定製錯誤頁面,這些頁面被困在他們的站點內部,並在內部重定向到「嘿,這個頁面不存在,但我們通過告訴你是有幫助的。」頁面,這對蜘蛛的作者根本沒有幫助。 – 2013-01-20 22:42:25
在用戶代理中添加聯繫信息是一種將蜘蛛介紹給網站管理員的好方法,並通過輸入聯繫信息使其顯而易見,您是友善的人。如果他們碰到他們的網站時遇到問題,您可能有機會與他們合作以獲取Feed或API,前提是他們可以與您聯繫。混淆信息或未能提供信息,他們會立即伸手斧頭,並通過禁止域名來切斷您的訪問權限。 – 2013-01-20 22:40:31