訪問博客查看 本文 最新內容,排版更美觀ヾ(?ω?`)o 如有錯誤歡迎指出~
IR 信息檢索系列筆記:
隨著互聯網的興起,Web 的增多,網絡信息檢索成為 IR 中的一大主題。
簡要介紹以下幾個相關概念:
- 最廣的是 Network ,一個物理層面的廣義網絡。
- 其次,是互聯網。因特網和其他類似的由計算機相互連接而成的大型網絡系統都可算是互聯網,Internet 是互聯網中最大的一個。
- 再者,是 Internet,即因特網。由許多小的子網互聯而成的一個邏輯網,每個子網中連接著若干臺計算機(主機)。
- 最后,是 Web,也稱 World Wide Web,即萬維網。它使用超文本技術將遍布全球的各種信息資源鏈接起來,以便于用戶訪問。Web 只是 Internet 上的一個應用層服務。
網絡信息檢索 | Web Search
Goal | 目標
Provide information discovery for large amounts of open access material on the web.
Challenges | 挑戰
Volume of material -- several billion items, growing steadily
Items created dynamically or in databases (deep web, about 150 times of web pages of surface web)
Great variety -- length, formats, quality control, purpose, etc.
Inexperience of users -- range of needs
Economic models to pay for the service -- 訂閱、廣告、許可
Strategies | 策略
- Subject hierarchies (分類目錄) + human indexing -- 1st Generation
- Web crawling (網頁爬取) + automatic indexing -- 2nd Generation
- Human directed web crawling and automatic indexing -- Mixed models
Components | 組成
- Web crawler: URL Server + Crawler + Store Server
- Indexing system: URL Resolver + Indexer + Pagerank (離線網頁排名算法)
- Search system: Sorter + Searcher (在線檢索服務)
網絡爬蟲 | Web crawler
Web crawler,也稱 Web spider,用于下載網頁的一種程序。只要給出 seed URLs (Uniform Resource Locator) 的初始集,就可以遞歸地(recursively)根據集合中的鏈接下載更多的頁面。有兩種特殊的爬蟲:
Focused web crawler,針對特定類別的網站的專業爬蟲,需要分類方法支持。
Deep web crawler,針對動態網頁的深網爬蟲,需要腳本模擬動作支持。
對于所有的爬蟲,最重要的是抓取一個頁面中的鏈接,擴充初始集。
此外,一個爬蟲,還要考慮性能(爬取大量頁面)、禮貌性(避免過載服務器、違法操作)、應對故障(破損鏈接、超時、爬蟲陷阱)、搜索策略(DFS/BFS),存儲網頁(并行文件系統)等。
禮貌性 | Politeness
「惡意爬蟲」往往會在短時間內大量訪問同一個站點,造成 DDoS 攻擊(Distributed denial of service attack,分布式拒絕服務攻擊),進而導致網站的癱瘓。此外,還存在非法爬取私人信息、非法收集數據等行為。
為了在法律上限制爬蟲,有以下的協議:
Robots Exclusion Protocol:網站管理者可以注明該網站的哪些路徑是不可被爬蟲訪問的,這些協議會體現在 http://.../robots.txt 中。
Robots META tag:HTML 作者可以注明該頁面中的文件不可被索引,或該頁面不可被用于解析以獲得更多鏈接。只需要在 HTML 文本中添加以下命令:
<meta name="robots" content="noindex, nofollow">
爬蟲性能 | Performance
爬蟲面向的信息往往是極龐大的,超過了一臺機器的性能范圍。現實中,通常采用并行分布式爬蟲,將任務量劃分到各臺機器。那么如何分配任務才能使得各臺機器承受的壓力均勻呢?
Distributing the Workload
首先可以將機器編號 0 至 N-1,再對一個 URL 的主域名(Domain name)做哈希,得到一個 0 至 N-1 的值,并分配到對應機器。這樣做的好處有:
- 同一域名只在一臺機器上訪問,這樣就可以防止多臺機器同時訪問了同一域名(避免對其造成 DoS 攻擊)。
- 不需要主服務器的分配,減少了機器間的溝通,主域名下的子域名全在同一臺機器中。
- 每臺機器有獨立的 DNS cache (域名緩存),可以提高查詢效率。
Software Hazards
此外,要提高爬蟲的性能,還要實現軟件故障的處理:
- 過慢、無應答的 DNS/HTTP 服務器
- 過大、無限大的頁面(自動填充型)
- 無限的鏈接(隨時間變化的路徑)
- 破損的 HTML 頁面
Extract Links
抓取頁面中的鏈接、解析頁面中的鏈接也會遇到許多難題:
- 相對路徑、絕對路徑
- CGI (Common Gateway Interface, 公共網關接口) 動態生成的頁面
- Server-side 服務端腳本
- 隱藏在 JavaScript 代碼中的鏈接
爬蟲架構 | Crawler Architecture
接下來介紹一種經典的分布式爬蟲架構 High performance large scale web spider architecture
。
- URL Manager
存放所有訪問過的 URL 記錄,以及待訪問隊列。
- Pool of data collector
數據收集池,按照 URL Manager 分配的序列訪問網頁,內部通常由多臺機器多線程地收集網頁數據。
- Set of filters
實現數據統計、頁面索引、鏈接提取的功能,并返回新的連接到 URL Manager。
- Storage manager
負責壓縮、解壓縮、存儲、檢索數據。
- Communicator
通信器,將新找到的頁面和找到它的頁面連接,完成 URL 去重等任務。
URL 隊列 | URL Frontier
URL Frontier 維護了一個包含大量 URL 的隊列,并且每當有爬蟲線程尋找 URL 的時候,它都會按照某種順序重新排序。以何種順序返回隊列中的 URL,需要有兩個方面的考慮:
- 第一個要考慮的是具有很高更新頻率的高質量頁面,即頁面的優先級。一個頁面的優先級權值應該是由它的改變頻率和它本身網頁質量(使用一些恰當的質量評估方法)共同決定的。
- 第二個要考慮的就是禮貌策略:我們必須避免在很短的時間間隔內重復抓取同一個主機。因此,如果URL隊列被設計成簡單的優先級隊列的話,可能會造成對某一主機的大量的訪問請求。
上圖展示了一個基于禮貌性和權值策略的URL隊列的實現。它的目標是確保:
- 每次只有一個連接去訪問一臺主機;
- 連續對同一個主機的訪問請求之間存在幾秒鐘的等待時間;
- 具有高優先級的頁面將會被優先爬取。
其中有兩個重要的子模塊,前部分的 Front 隊列集合 F,以及后部分的 Back 隊列集合 B。這兩種隊列均是 FIFO 隊列。
Front 隊列實現了對權值相關處理,而 Back 隊列實現了對禮貌策略的相關處理。在一條 URL 被添加到隊列的過程中,它將會先后穿越 Front 和 Back 隊列。
首先,權值計算器會給該 URL 分配一個介于 1 和 F 之間的整數權值,再進入相應的 Front 隊列,具有很高更新頻率的文檔(如新聞頁面)將會被賦予一個很高的權值(通過啟發式方法)。而后高權值對應的 Front 隊列也會更高頻率的吞吐 URL。
此外,我們需要維護一個堆,堆里存放著的條目對應每一個 Back 隊列,該條目記錄著該隊列所對應的主機可以再次被連接的最早時間。注意:每個隊列僅對應一個主機,即滿足分布式的要求。
請求獲取 URL 的爬蟲線程會抽取出堆頂元素(時間最早者),然后一直等到相應時間后訪問之。從而避免訪問頻率過高。