2010-03-27 68 views
5

我使用PHP來刮取網站並收集一些數據。這一切都沒有使用正則表達式。我使用php的explode()方法來查找特定的HTML標籤。如何知道被抓取的網站是否發生了變化?

如果網站的結構發生變化(CSS,HTML),那麼刮板就可能收集到錯誤的數據。所以問題是 - 我怎麼知道HTML結構是否已經改變?在將任何數據存儲到我的數據庫之前如何識別此信息以避免存儲錯誤的數據。

回答

7

我認爲,如果您在內容發生變化的頁面上進行拼寫,您沒有任何清晰的解決方案。

我已經開發了幾個python刮刀,我知道如果網站只是對其佈局進行微妙的改變,怎麼會令人沮喪。

你可以嘗試一個機械化解決方案(不知道PHP的對應),如果你很幸運,你可以隔離你需要提取的內容(鏈接?)。

另一種可能的方法是編寫一些約束並在存儲到db之前檢查它們。

例如,如果您正在抓取Url,則需要驗證哪些scraper已解析爲正式的Url;相同的整數ID或任何你想刮,可以被認爲是有效的。

如果您正在刮純文本,將會更難以檢查。

+0

嘿,那就是我。對不起,因爲它不是故意的!我按了錯誤的按鈕,現在我無法改變它。它說 - 「投票太舊,無法更改,除非這個答案被編輯」。再次抱歉,請對答案進行一些更改,以便我可以對其進行投票。這不是故意的。 – Yeti 2010-03-27 18:59:32

1

首先,在某些情況下,您可能希望將原始文件的hashes與新的html進行比較。 MD5和SHA1是兩個流行的哈希。這可能會或可能不會在任何情況下都有效,但是您應該熟悉這一點。這會告訴你是否有變化 - 內容,標籤或任何東西。

要了解結構是否發生了變化,您需要捕獲標籤出現的直方圖,然後比較這些結果。如果您關心標籤出現故障,那麼您必須捕獲標籤樹並進行比較,以查看標籤是否以相同的順序出現。這將對你想達到的目標非常具體。

PHP Simple HTML DOM Parser是一個工具,它可以幫助你解析HTML。

+2

@BrainLy:只是因爲新的HTML文件有不同的散列,並不意味着HTML結構已經改變。 – codaddict 2010-03-27 18:01:33

+0

哈希將*總是*不同,因爲我刮的數據每小時變化!我的意思是,如果他們改變了網站的設計,那麼如何以有效的方式檢測到呢? – Yeti 2010-03-27 18:03:49

+0

動態頁面會始終產生不同的散列,通常不會發生重大結構更改。 – 2010-03-27 18:04:02

0

Explode()不是HTML解析器,但您想了解HTML結構中的更改。這將是棘手的。嘗試使用HTML解析器。沒有其他人能夠正確地做到這一點。

+0

任何關心解釋他們downvote? – spender 2010-03-27 18:08:40

2

如果你想知道關於結構的變化,我認爲最好的方法是存儲你的第一頁的DOM結構,然後將它與新的結構進行比較。

有很多的方式,你可以做到這一點: - SAXParser的 的DOMParser等

我有一個小博客,這將給一些指點我的意思 http://let-them-c.blogspot.com/2009/04/xml-as-objects-in-oops.html

,或者您可以使用http://en.wikipedia.org/wiki/Simple_API_for_XML或DOm工具解析器。

+1

嘗試使用HTML解析器時,您需要非常小心。他們傾向於在最微小的格式錯誤的HTML上炸掉。 – 2010-03-27 18:18:30

2

說到這裏我的屁股,但它可能你可能想看看一些文檔對象模型的PHP方法。

http://php.net/manual/en/book.dom.php

如果我非常,非常有限的DOM的理解是正確的,在HTML網站結構的變化將改變文檔對象模型,而是一個固定的結構中一個簡單的內容變化不會。那麼,如果你能捕捉到DOM狀態,然後在每次刮擦中比較它,你理論上是不是可以確定這種改變已經發生? (順便說一下,當我在一個特定的頁面上發佈條形考試結果時,我試圖獲得電子郵件通知時,我這樣做的方式就是比較file_get_contents()值。令人驚訝的是,沒有誤報:沒有誤報,並在網站發佈內容後立即通過電子郵件發送給我。)

2

取決於網站,但您可以計算刮樣頁面中頁面元素的數量,如div,&樣式標記,然後通過比較這些總數與稍後的刮擦檢測頁面結構是否已經改變。

一個類似的過程可以用於CSS文件,其中每個類或id的名稱可以使用簡單的正則表達式提取,根據需要進行存儲和檢查。如果這個列表有新的增加,那麼頁面結構幾乎可以肯定地改變網站被刮掉的某個地方。

相關問題