網路爬蟲

網路爬蟲（web crawler），也叫網路蜘蛛（spider），是一種用來自動瀏覽全球資訊網的網路機器人。其目的一般為編纂網路索引。

網路搜尋引擎等站點通過爬蟲軟體更新自身的網站內容或其對其他網站的索引。網路爬蟲可以將自己所訪問的頁面保存下來，以便搜尋引擎事後生成索引 (搜尋引擎)供使用者搜索。

爬蟲訪問網站的過程會消耗目標系統資源。不少網路系統並不默許爬蟲工作。因此在訪問大量頁面時，爬蟲需要考慮到規劃、負載，還需要講「禮貌」。不願意被爬蟲訪問、被爬蟲主人知曉的公開站點可以使用robots.txt文件之類的方法避免訪問。這個文件可以要求軟體助理只對網站的一部分進行索引，或完全不作處理。

網際網路上的頁面極多，即使是最大的爬蟲系統也無法做出完整的索引。因此在公元2000年之前的全球資訊網出現初期，搜尋引擎經常找不到多少相關結果。現在的搜尋引擎在這方面已經進步很多，能夠即刻給出高素質結果。

爬蟲還可以驗證超連結和HTML代碼，用於網路抓取（參見數據驅動編程）。

## 命名

網路爬蟲也可稱作網路蜘蛛、蜘蛛查詢器、螞蟻、自動索引程序（automatic indexer），或（在FOAF (軟體)軟體中）稱為網路疾走（web scutter）。

## 概述

網路爬蟲始於一張被稱作種子的統一資源地址（URL）列表。當網路爬蟲訪問這些統一資源定位器時，它們會甄別出頁面上所有的超連結，並將它們寫入一張「待訪列表」，即所謂爬行疆域。此疆域上的URL將會被按照一套策略循環來訪問。如果爬蟲在執行的過程中複製歸檔和保存網站上的資訊，這些檔案通常儲存，使他們可以較容易的被查看。閱讀和瀏覽他們儲存的網站上並即時更新的資訊，這些被儲存的網頁又被稱為「快照」。越大容量的網頁意味著網路爬蟲只能在給予的時間內下載越少部分的網頁，所以要優先考慮其下載。高變化率意味著網頁可能已經被更新或者被取代。一些伺服器端軟體生成的URL（統一資源定位符）也使得網路爬蟲很難避免檢索到重複內容。

但是網際網路的資源卷帙浩繁，這也意味著網路爬蟲只能在一定時間內下載有限數量的網頁，因此它需要衡量優先順序的下載方式。有時候網頁出現、更新和消失的速度很快，也就是說網路爬蟲下載的網頁在幾秒後就已經被修改或甚至刪除了。這些都是網路爬蟲設計師們所面臨的兩個問題。

再者，伺服器端軟體所生成的統一資源地址數量龐大，以致網路爬蟲難免也會採集到重複的內容。根據超文本傳輸協定，無盡組合的參數所返回的頁面中，只有很少一部分確實傳回正確的內容。例如：數張快照陳列室的網站，可能通過幾個參數，讓使用者選擇相關快照：其一是通過四種方法對快照排序，其二是關於快照解析度的的三種選擇，其三是兩種文件格式，另加一個使用者可否提供內容的選擇，這樣對於同樣的結果會有48種（4*3*2）不同的統一資源地址與其關聯。這種數學組合替網路爬蟲造成了麻煩，因為它們必須越過這些無關腳本變化的組合，尋找不重複的內容。

## 爬蟲策略

爬蟲的實現由以下策略組成：

- 指定頁面下載的選擇策略
- 檢測頁面是否改變的重新訪問策略
- 定義如何避免網站過度訪問的約定性策略
- 如何部署分布式網路爬蟲的並行策略

### 選擇策略

#### 連結跟隨限制

爬蟲可能只想搜索HTML頁面而避免其他MIME 類型。為了只請求HTML資源，爬蟲在抓取整個以GET方式請求的資源之前，通過創建HTTP的HEAD請求來決定網路資源的MIME類型。為了避免發出過多的請求，爬蟲會檢查URL和只請求那些以某些字符（如.html, .htm, .asp, .aspx, .php, .jsp, .jspx 或 /）作為後綴的URL。這個策略可能會跳過很多HTML網路資源。

為了避免掉入從網站下載無限量的URL的爬蟲陷阱，有些爬蟲還能避免請求一些帶有「?」的資源（動態生成）。不過假若網站重寫URL以簡化URL的目的，這個策略就變得不可靠了。

#### URL規範化

爬蟲通常使用某些URL規範化的方式以避免資源的重複爬取。URL規範化，指的是以某種一致的方式修改和標準化URL的過程。這個過程有各種各樣的處理規則，包括統一轉換為小寫、移除「.」和「..」片段，以及在非空路徑里插入斜杆。

#### 路徑上移爬取

有些爬蟲希望從指定的網站中儘可能地爬取資源。而路徑上移爬蟲就是為了能爬取每個URL里提示出的每個路徑。例如，給定一個Http的種子URL: http://llama.org/hamster/monkey/page.html，要爬取 /hamster/monkey/， /hamster/ 和 /。Cothey發現路徑能非常有效地爬取獨立的資源，或以某種規律無法在站內連結爬取到的資源。

#### 主題爬取

對於爬蟲來說，一個頁面的重要性也可以說是，給定查詢條件一個頁面相似性能起到的作用。網路爬蟲要下載相似的網頁被稱為主題爬蟲或局部爬蟲。這個主題爬蟲或局部爬蟲的概念第一次被Filippo Menczer和 Soumen Chakrabarti等人提出的。

### 重新訪問策略

網站的屬性之一就是經常動態變化，而爬取網站的一小部分往往需要花費幾個星期或者幾個月。等到網站爬蟲完成它的爬取，很多事件也已經發生了，包括增加、更新和刪除。

在搜尋引擎的角度，因為沒有檢測這些變化，會導致存儲了過期資源的代價。最常用的估價函數是新鮮度和過時性。

新鮮度：這是一個衡量抓取內容是不是準確的二元值。在時間t內，倉庫中頁面p的新鮮度是這樣定義的：

$$F_p(t) = \begin{cases} 1 & {\rm if}~p~{\rm~is~equal~to~the~local~copy~at~time}~t\\ 0 & {\rm otherwise} \end{cases}$$

過時性:這是一個衡量本地已抓取的內容過時程度的指標。在時間t時，倉庫中頁面p的時效性的定義如下：

$$A_p(t) = \begin{cases} 0 & {\rm if}~p~{\rm~is~not~modified~at~time}~t\\ t - {\rm modification~time~of}~p & {\rm otherwise} \end{cases}$$

### 平衡禮貌策略

爬蟲相比於人，可以有更快的檢索速度和更深的層次，所以，他們可能使一個站點癱瘓。不需要說一個單獨的爬蟲一秒鐘要執行多條請求，下載大的文件。一個伺服器也會很難響應多線程爬蟲的請求。

就像Koster所注意的那樣，爬蟲的使用對很多工作都是很有用的，但是對一般的社區，也需要付出代價。使用爬蟲的代價包括：

- 網路資源：在很長一段時間，爬蟲使用相當的帶寬高度並行地工作。
- 伺服器超載：尤其是對給定伺服器的訪問過高時。
- 質量糟糕的爬蟲，可能導致伺服器或者路由器癱瘓，或者會嘗試下載自己無法處理的頁面。
- 個人爬蟲，如果過多的人使用，可能導致網路或者伺服器阻塞。

對這些問題的局部解決方法是漫遊器排除協議（Robots exclusion protocol），也被稱為robots.txt議定書，這份協議是讓管理員指明網絡伺服器的不應該爬取的約定。這個標準沒有包括重新訪問一台伺服器的間隔的建議，雖然設置訪問間隔是避免伺服器超載的最有效辦法。最近的商業搜尋引擎，如Google，Ask Jeeves，MSN和Yahoo可以在robots.txt中使用一個額外的 「Crawl-delay」參數來指明請求之間的延遲。

### 並行策略

一個並行爬蟲是並行運行多個進程的爬蟲。它的目標是最大化下載的速度，同時儘量減少並行的開銷和下載重複的頁面。為了避免下載一個頁面兩次，爬蟲系統需要策略來處理爬蟲運行時新發現的URL，因為同一個URL地址，可能被不同的爬蟲進程抓到。

## 另見

- robots.txt：放在網頁伺服器上，告知網路蜘蛛哪些頁面內容可取得或不可取得。
- Scrapy