网络爬虫

**網路爬蟲**（英語：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

## 參考文獻