2009-11-08 70 views
4

我正在構建一個小應用程序,它將抓取內容正在增長的站點(就像在stackoverflow上一樣),區別在於一旦創建的內容很少被修改。兩次不抓取相同的內容

現在,我在第一遍中檢索網站中的所有頁面。

但接下來,該網站的分頁內容 - 我不想重新抓取所有這些,只是最新的補充。

因此,如果該網站有500頁,第二次通過,如果該網站有501頁,那麼我只會抓取第一頁和第二頁。這是處理這種情況的好方法嗎?

最終,抓取的內容將以lucene結尾 - 創建一個自定義搜索引擎。

所以,我想避免多次瀏覽相同的內容。任何更好的想法?

編輯:

比方說,該網站有一個頁面:結果會像這樣來訪問:??

結果頁面= 1,結果頁= 2 ...等

我想保持跟蹤最後一次抓取時有多少頁面,只抓取差異就足夠了。 (也許使用頁面上每個結果的散列 - 如果我開始跑到相同的散列 - 我應該停止)

+0

我不確定問題是什麼,真的。 – Artelius 2009-11-08 12:07:01

+2

如果您認爲內容將永遠不會被修改,您如何期待新的可抓取鏈接出現? – Thomas 2009-11-08 12:08:45

+0

除了托馬斯說的之外,這種方法並沒有考慮到插入後內容可能會改變。把它放在這裏,想想有很多答案的問題,其中澄清來源於對原始問題的修改... – em70 2009-11-08 14:43:07

回答

5

如果每條內容位於唯一位置,只需將這些位置(可能是URL)提供給散列字段並在「抓取」內容之前檢查它。無論如何,該URL可能應該是Lucene中存儲數據的一部分,因此在添加到索引之前,通過搜索很容易實現。

+0

該死的,你是對的,我只是意識到,在網頁上的每個結果必須有一個獨特的網址。謝謝:) – sirrocco 2009-11-08 12:16:48

2

我的做法是存儲每個頁面內容的散列/指紋。這樣,當您重新提取頁面時,您將驗證指紋,如果匹配,沒有任何變化,並且不需要解析,因爲您已經處理頁面及其上的所有鏈接。

+0

但實際上獲取頁面可能比分析它並將其添加到索引要慢。你需要取它來散列它。 – dlamblin 2009-11-08 12:34:20

+0

這就是衝突..除非你取得它(或者詢問服務器是否發生變化),你真的不知道它是否改變了。OP如何知道頁數已經改變?知道頁面名稱與知道它的內容是不一樣的。至少我明白這個頁面與SO相似,頁面改變了。 – lexu 2009-11-08 13:33:48

1

該網站是否爲每個獲取的資源發佈有效的電子標籤?如果是這樣,你可以發出已知資源的條件GET,並在服務器發送資源的情況下(即它已經改變),你可以尋找新的鏈接來抓取,更新內容等。

當然這隻適用如果你的網站發出的E-標籤和響應有條件的GET ...

1
  1. 做網站的標準站點範圍抓取來獲取所有的歷史內容
  2. 跟蹤他們的RSS Feed,瞭解新內容
  3. 定期重複網站爬網以獲取更新內容
1

看看'Last-Modified'HTTP頭。在C#中,從HttpWebResponse中,如果它不等於DateTime.Now,則內容已更改。因此,您可以使用本地內容(假設您正在存儲它)爲您的抓取工具提供Feed。

因此,當您抓取時,存儲WebPage內容和'Last-Modified'標題。

此外,您可以存儲每個唯一的AbsoluteUri,這很好地工作,直到AbsoluteUri的查找時間超過獲取頁面所需的時間,或者您可以使用Bloom過濾器:http://en.wikipedia.org/wiki/Bloom_filter

除了找出Google站點地圖(或RSS源)的位置之外,您不知道添加了哪些新內容。自動知道就像竊賊一樣,詢問你的新購物在哪裏,而不是先問你。 :)