花了三個小時,實現了一個簡單的爬蟲,現在實現的功能是設定抓取深度,設定入口
出現的問題是:目前是單線程 在url抓取過程中會出現重複的url 儘管我努力去避免此類問題的發生,但是在我本地調試過程中還是出現了類似的問題
我避免url重複的方式 是 根據父頁面 來判斷 具體看程式碼 整個代碼相對比較簡單,希望對剛剛開始研究爬蟲的新手有所協助,也希望對我這個代碼目前存在的問題 給予糾正
/Files/suyuan/CSpider.rar
以下內容為轉載
Spider技術:設計Spider時要解決的幾個問題
spider是整個搜尋引擎系統中很重要的一個組成部分,可以說是搜尋引擎的基礎。它不僅僅是為搜尋引擎提供了搜尋對象——海量資料,更重要的是它使搜尋引擎從一個檢索工具上升為一個資訊整合的平台。
搜尋引擎的本質就是資訊的整合,通過資訊的整合構建了一個使用者平台。這樣就使得搜尋引擎成為一個很好的且很有利潤的商業化對象。
好的搜尋引擎必須配一個好的spider,好的spider需要設計人員優雅的去設計。
設計時spider重點要解決以下幾個問題:
1. 抓取的效率
抓取的效率和電腦硬體的效能、硬體的多少、網路的頻寬有關係,但為了提高抓取效率不能一味地增加硬體,而是要利用有限的硬體資源在一定的時間內抓取最多的的網頁。
常見的提高抓取效率的策略有:
(1)採用多線程並發抓取
(2)採用單線程、非阻塞I/O抓取
(3)分布式抓取,把抓取工作分布到多台伺服器完成,對於Google這樣的搜尋引擎還包括地理上的分布式,把抓取伺服器機群分布到全球各個國家的主幹網上抓取。
(4) 抓取的效率很大程度也取決於抓取的對象——網站伺服器和頻寬的速度。因此設計spider時要有估算抓取網站伺服器負載和頻寬的功能並且有一個很好調度策略,使得訪問不同狀況網站伺服器有不同的頻率。
2. 抓取的品質
設計spider的目標不是把互連網上的所有網頁都抓回來,而是抓重要的而且是最新的網頁的即可。
怎樣抓取高品質的網頁?哪些網頁是品質比較高的?這裡就要求設計人員對互連網以及使用者的習慣和常理都有一定的理解。
從互連網整體上看,網站中各個網頁之間的連結關係是一個很重要的資源,因此在抓取網頁時要記錄網頁之間的連結關係,以便進行連結分析,從而通過連結關係來評價網頁的品質。
網頁重要性的評價指標可以從以下幾個方面著手:
(1)某個網頁的連結深度。
(2)網頁的入度。
(3)網頁的父網頁的入度。
(4)網頁的重複數。
以上這些指標都基於這麼幾個常理:
(1)網站最重要的網頁都放在前面,即層次越淺。網站首頁以及首頁指向的網頁都是比較重要的。
(2)有很多網頁、很重要的網頁都指向這個網頁,這個網頁就比較重要,就像檢索工具《SCI》評價論文的品質一樣,被引用的論文的次數越多,則說明這篇論文比較重要。
(3)第二點講的是引用,還有一個就是轉載,網頁轉載的次數越多,則說明這個網頁比較重要,就像報紙或雜誌文章一樣,好的文章都被其他媒體大量轉載。
具體實現時除了第一個指標外,其他三個指標只有在預先處理階段的統計才能得出。
所以在抓取時應首先獲得盡量多的網站首頁,然後從該網站首頁出發採用先寬的抓取策略。
3. 抓取的禮貌問題
禮貌的抓取具體表現在:網站不讓抓取的網頁就不要抓取,控制好訪問網站的頻率,spider的抓取行為不能影響正常使用者的訪問。因此spider在抓取時要:
(1)限制單位時間內對一個網站抓取網頁的數量。
(2)限制同時對同一個網站抓取的線程/進程的數量。
(3)控制對同一個網站抓取的時間間隔。
(4)遵循robots、META Tag 、sitemap.htm協議 ,對不允許訪問的目錄不訪問。
(5)在抓取網頁的時發送的請求中,通過User-agent、Form欄位,標識spider的身份、聯絡Email、spdier注意事項頁面URL。
4. 避免重複抓取
之所以會造成重複抓取,是因為:
(1)互連網上大量網頁被其他網頁引用,這就使得同一個網頁的URL出現在多個不同的網頁中,這就要求spider必須有URL消重功能。
(2)網頁被其他網頁轉載,這就使得同一篇文章出現在不同URL的頁面中,這就要求spider具有內容消重功能,目前這塊比較難以實現,當前很多搜尋引擎公司都沒有較好的解決這個問題。
(3)網頁的URL有多種表示形式,這是由於DNS與IP對應關係造成的。
一個URL對應一個網頁,但由於URL可以採用以下兩種表示方式:
[協議://]網域名稱[:連接埠][/路徑/檔案名稱]
[協議://]點分十進位IP地址[:連接埠][/路徑/檔案名稱]
且網域名稱與IP存在以下對應關係:
-- 一對一,http://www.baidu.com 與http://220.231.39.97指向的是同一網頁。
-- 一對多,DNS輪轉,http://www.163.com 與http://202.108.42.73,http://202.108.42.91指向的是同一網頁。
-- 多對一,虛擬機器主機,多個網域名稱對應同一個ip,不同的URL指向不同的網頁。
一個網站具有多個網域名稱,對應同一個IP,例如:www.netease.com,www.163.com指向同一個網頁。
- - 多個網域名稱對應多個ip ,一個網站有多個網域名稱,同時採用了DNS輪轉技術,一個網域名稱對應多個ip地址。
5. 抓取資料的更新
抓取資料的更新問題是一個很重要的問題,它決定了使用者能不能馬上搜尋到最新的新聞,最新的內容,但是由於互連網上海量的網頁使得一次抓取的周期都很長 ,如果通過每次重新抓取一次來更新,勢必更新周期很長。
spider已經抓取的網頁可能被修改、刪除,spider要定期檢測這些網頁的更新情況,同時更新原始網頁庫、提取的資料庫以及索引庫。
互連網上同時不斷的產生新的網頁,spider也要抓取回來。
不同的網站的更新周期不一樣,有的很長,有點很短。
spider要根據網站的更新周期,對網站進行分類,不同更新周期的網站抓取的周期不一樣。
一般來說,網路蜘蛛在更新原始網頁庫等的時候,不用把URL對應的網頁重新抓取一遍,對於大部分的網頁,只需要HTTP Head請求、條件Get請求來更新。
6.內容提取
spider要抓取的檔案各種各樣,比如有HTML、XML網頁,有doc、ppt、xls、pdf等帶格式的文檔,有圖片、音頻、視頻等多媒體資料,對這些不同類型檔案spider都要提取出檔案裡的純文字內容。
對於doc、pdf等文檔,這種由專業廠商提供的軟體產生的文檔,廠商都會提供相應的文本提取介面。
對於HTML、XML網頁來說,除了標題和本文以外,會有許多著作權資訊、廣告連結以及公用的頻道連結,這些連結和文本本文一點關係也沒有,在提取網頁內容的時候,也需要過濾這些無用的連結。
對於多媒體、圖片等檔案,一般是通過連結的錨文本(即,連結文本)和相關的檔案注釋來判斷這些檔案的內容。另外,許多多媒體檔案中有檔案屬性,考慮這些屬性也可以更好的瞭解檔案的內容。
對於網頁內容的提取一般採用外掛程式的形式,通過一個外掛程式管理服務程式,遇到不同格式的網頁採用不同的外掛程式處理。這種方式的好處在於擴充性好,以後每發現一種新的類型,就可以把其處理方式做成一個外掛程式補充到外掛程式管理服務程式之中。
7. 硬體投入、抓取速度、一次抓取時間、抓取資料量等估算
孫子曰:凡是預則立,不預則廢。強調計劃的重要性。很多事情也要做到心中有數。
設計一個spider一定要考慮抓取10億網頁需要多長時間,需要多少硬碟來存,需要多少伺服器來抓等。這些都可以通過估算得到一個最好/最大值的。
例如:抓取時應該使用多少台機器以及一台機器啟動多少抓取進程/線程呢?
這裡要考慮硬體資源情況:
-- 區域網路頻寬 //發送速率
-- 互連網接入頻寬
-- 區域網路時間延遲 //1 ~ 10 ms
-- 互連網時間延遲 //100 ~ 500 ms
-- 伺服器端接收請求、回應時間
-- CPU利用率
-- 記憶體大小以及利用率
-- 硬碟大小以及讀寫速度
-- 系統負載情況
以上提到了設計spider時要著重考慮的幾個問題,這隻是從大的方面概略地介紹了以一下,技術其實還是一門精工細作的工作,需要技術人員不斷地去打磨。