網路爬蟲專案開發日誌(五) 爬蟲協議初探

2021-07-24 15:58:06 字數 3902 閱讀 8623

--前言--

常在河邊走,哪有不濕鞋

有的時候,網路爬取就像串門一樣,如果守規矩的話,是需要先打個**給主人預約一下,或是進門的時候先敲門看看主人是否在家,如果主人允許咱進去,咱再進去,進去後,也不要東摸摸西看看,否則主人是會發飆了,搞不好就會逐客了。

--概念--

網路爬取領域,也是一樣的,也有著通用的規範,稱之為機械人協議,這是乙個面向計算機網路搜尋引擎的,以robots命名的文字文件,一般都會放在**的根目錄下,可以直接訪問到的。

--應用模式--

應用模式,此文討論的主要是圍繞icp(網路內容提供商)和搜尋引擎(爬蟲程式)之間的雙向行為模式。

1) icp通過「爬蟲協議「排除特定資訊顯示於搜尋結果,即:icp通過爬蟲協議禁止搜尋引擎將該**上部分資訊被羅列在搜尋結果中,但實際上我們還是可以通過別的方式來訪問或獲取這些資訊的。

2)icp通過「爬蟲協議」排除特定搜尋引擎,即:爬蟲協議作用的物件原本只是針對改icp**上的部分資訊內容,並一視同仁的對待所有的**訪問者。但是,在此模式中,icp**引入了白名單、黑名單機制,對名單中的不同訪問者區別性對待。

3)  搜尋引擎無視「爬蟲協議」並提供相關的資訊位址,即:由於「爬蟲協議」並不具備技術上的強制性,搜尋引擎完全可以無視協議,直接訪問icp**內容,這種行為可能屬於違約,應承擔違約責任,而且有過過往的法律糾紛發生過,但是,我只能說過往的法律裁定結果不能作為今後類似案件的判定依據。

4)  搜尋引擎無視「爬蟲協議」並複製相關資訊,即:網路爬取是最典型的事例,這種情況下有可能侵犯icp的著作權,如果icp的資訊都**於網路使用者的上傳,搜尋引擎的複製行為也涉嫌侵犯其他主題的著作權及icp對於資訊管理、編排所產生的權利。

5)icp對於「爬蟲協議」功能的擴充套件,很多icp運營者往往會利用「爬蟲協議」的法律地位與功能的不明確,賦予其額外的功能,實現競爭利益最大化的同時為其相關欣行為的合理性背書。針對這種行為,可以結合《反不正當競爭法》有相關條款,並著眼於「爬蟲協議」的基本功能,結合該行為背後的競爭因素,判斷爬蟲協議的合理性。

--簡易協議構建--

最簡單的robots.txt只有兩條規則:

user-agent:指定對哪些爬蟲生效

disallow:指定要遮蔽的**

先說user-agent,爬蟲抓取時會宣告自己的身份,這就是user-agent,沒錯,就是http協議裡的user-agent。robots.txt利用user-agent來區分不同的搜尋引擎。

disallow 行列出的是要攔截的網頁,以正斜線 (/) 開頭,可以列出特定的**或模式。要遮蔽整個**,使用正斜線即可;

要遮蔽某一目錄以及其中的所有內容,在目錄名後新增正斜線;要遮蔽某個具體的網頁,就指出這個網頁。例如:

user-agent: *

disallow: /?*

disallow: /pop/*.html

user-agent: etaospider

disallow: /

--高階--

sitemap

前面說過爬蟲會通過網頁內部的鏈結發現新的網頁。但是如果沒有連線指向的網頁怎麼辦?或者使用者輸入條件生成的動態網頁怎麼辦?能否讓**管理員通知搜尋引擎他們**上有哪些可供抓取的網頁?這就是sitemap,最簡單的 sitepmap 形式就是 xml 檔案,在其中列出**中的**以及關於每個**的其他資料(上次更新的時間、更改的頻率以及相對於**上其他**的重要程度等等),利用這些資訊搜尋引擎可以更加智慧型地抓取**內容。

新的問題來了,爬蟲怎麼知道這個**有沒有提供sitemap檔案,或者說**管理員生成了sitemap,(可能是多個檔案),爬蟲怎麼知道放在**呢?

由於robots.txt的位置是固定的,於是大家就想到了把sitemap的位置資訊放在robots.txt裡。這就成為robots.txt裡的新成員了。

節選一段google robots.txt:

sitemap:

sitemap:

插一句,考慮到乙個**的網頁眾多,sitemap人工維護不太靠譜,google提供了工具可以自動生成sitemap。

meta tag

其實嚴格來說這部分內容不屬於robots.txt。

robots.txt的初衷是為了讓**管理員管理可以出現在搜尋引擎裡的**內容。但是,即使使用 robots.txt 檔案讓爬蟲無法抓取這些內容,搜尋引擎也可以通過其他方式找到這些網頁並將它新增到索引中。例如,其他**仍可能鏈結到該**。因此,網頁**及其他公開的資訊(如指向相關**的鏈結中的定位文字或開放式目錄管理系統中的標題)有可能會出現在引擎的搜尋結果中。如果想徹底對搜尋引擎隱身那咋整呢?答案是:元標記,即meta tag。

比如要完全阻止乙個網頁的內容列在搜尋引擎索引中(即使有其他**鏈結到此網頁),可使用 noindex 元標記。只要搜尋引擎檢視該網頁,便會看到 noindex 元標記並阻止該網頁顯示在索引中,這裡注意noindex元標記提供的是一種逐頁控制對**的訪問的方式。

要防止所有搜尋引擎將**中的網頁編入索引,在網頁的部分新增:

這裡的name取值可以設定為某個搜尋引擎的user-agent從而指定遮蔽某乙個搜尋引擎。

除了noindex外,還有其他元標記,比如說nofollow,禁止爬蟲從此頁面中跟蹤鏈結。詳細資訊可以參考google支援的元標記,這裡提一句:noindex和nofollow在html 4.01規範裡有描述,但是其他tag的在不同引擎支援到什麼程度各不相同,還請讀者自行查閱各個引擎的說明文件。

crawl-delay

除了控制哪些可以抓哪些不能抓之外,robots.txt還可以用來控制爬蟲抓取的速率。如何做到的呢?通過設定爬蟲在兩次抓取之間等待的秒數。

crawl-delay:5

表示本次抓取後下一次抓取前需要等待5秒。

注意:google已經不支援這種方式了,在webmaster tools裡提供了乙個功能可以更直觀的控制抓取速率。

這裡插一句題外話,幾年前曾經有一段時間robots.txt還支援複雜的引數:visit-time,只有在visit-time指定的時間段裡,爬蟲才可以訪問;request-rate: 用來限制url的讀取頻率,用於控制不同的時間段採用不同的抓取速率。後來估計支援的人太少,就漸漸的廢掉了,目前google和baidu都已經不支援這個規則了,其他小的引擎公司貌似從來都沒有支援過。

防君子不防小人

robots協議不是什麼技術壁壘,而只是一種互相尊重的協議,好比私家花園的門口掛著「閒人免進」,尊重者繞道而行,不尊重者依然可以推門而入。目前,robots協議在實際使用中,還存在一些問題。

快取robots.txt本身也是需要抓取的,出於效率考慮,一般爬蟲不會每次抓取**網頁前都抓一下robots.txt,加上robots.txt更新不頻繁,內容需要解析。通常爬蟲的做法是先抓取一次,解析後快取下來,而且是相當長的時間。假設**管理員更新了robots.txt,修改了某些規則,但是對爬蟲來說並不會立刻生效,只有當爬蟲下次抓取robots.txt之後才能看到最新的內容。尷尬的是,爬蟲下次抓取robots.txt的時間並不是由**管理員控制的。當然,有些搜尋引擎提供了web 工具可以讓**管理員通知搜尋引擎那個url發生了變化,建議重新抓取。注意,此處是建議,即使你通知了搜尋引擎,搜尋引擎何時抓取仍然是不確定的,只是比完全不通知要好點。至於好多少,那就看搜尋引擎的良心和技術能力了。

ignore

不知是無意還是有意,反正有些爬蟲不太遵守或者完全忽略robots.txt,不排除開發人員能力的問題,比如說根本不知道robots.txt。另外,本身robots.txt不是一種強制措施,如果**有資料需要保密,必需採取技術措施,比如說:使用者驗證,加密,ip攔截,訪問頻率控制等。

惡意爬蟲

在網際網路世界中,每天都有不計其數的爬蟲在日夜不息地爬取資料,其中惡意爬蟲的數量甚至高於非惡意爬蟲。遵守robots協議的爬蟲才是好爬蟲,但是並不是每個爬蟲都會主動遵守robots協議。

惡意爬蟲可以帶來很多潛在威脅,比如電商**的商品資訊被爬取可能會被競爭對手利用,過多的爬蟲還會占用頻寬資源、甚至導致**宕機。

網路爬蟲專案開發日誌(二) 爬蟲架構設計

架構設計原則 1 不過度設計,所有設計都是本著服務業務的初心。2 保留足夠的可拓展性 3 開發成本降至最低 學習成本 開發時效 開源技術優先 去ioe 架構設計計畫 一言不合,先上圖,下面是爬蟲系統架構目標,分為三個階段如下 一期 業務上的需求是,按需爬取網頁,而且查詢的體量也會很小,因為公司業務剛...

python網路爬蟲(五)

資訊標誌的三種形式 xml,json,yaml xml例項 tian cai北京 516002 json例項 yaml例項 firstname tian lastname cai address city 北京 zipcode 516002 xml 最早的通用資訊標記語言,可擴充套件性好,但繁瑣 i...

網路爬蟲 學習日誌(一)

學習get與post請求,嘗試使用requests或者是urllib用get方法向 發出乙個請求,並將其返回結果輸出。如果是斷開了網路,再發出申請,結果又是什麼。了解申請返回的狀態碼。了解什麼是請求頭,如何新增請求頭。學習什麼是正規表示式並嘗試一些正規表示式並進行匹配。然後結合requests re...