2015-10-06 20 views
0

我是從其他網站刮的數據,我經常處理如下的情況:如何處理重複數據的抓取?

EntityA 
    IdEntityB 
    IdEntityC 

EntityB 
    IdEntityD 
    IdEntityE 

上述實體中的每一個都有自己的網頁,我想插入那些到SQL數據庫。但是,我報廢物品的順序不是最佳的。到目前爲止,我的解決方案(不涉及外鍵或任何類型的映射)一直是廢除EntityA的頁面,請查找與其對應的EntityB的頁面的鏈接,並安排該頁面被刪除。同時,全部刮落的實體被扔在一個箱子裏,然後我將其插入到數據庫中。出於性能方面的考慮,我一直等到有大約2000個實體被迫將所有實體推入數據庫。天真的做法是隻插入沒有唯一身份的每個身份,但這意味着我將不得不使用一些其他(非數字)較低質量的信息來引用系統上的每個實體。當我無法一起刮除所有實體時,如何保證數據庫中有乾淨的數據?這是使用Python和Scrapy框架。

+0

你的意思是刮/刮?報廢扔掉,或擺脫:)「我們報廢了該項目,因爲它的成本太高」 – rofls

+0

@rofls oops!修復它 –

+0

乾淨的數據是什麼意思?你能解釋一下嗎??你是否意味着像你這樣的裁員可能會把同一個頁面兩次或者兩次都報廢。 –

回答

2

在抓取網站的情況下,通常避免冗餘的主要因素是跟蹤已經被抓取的網址。在你的mysql中添加一個表格,只需要你刮過的頁面的URL(或者是URL的MD5或SHA1哈希)。在表中爲該列創建一個索引。

在你抓取任何頁面之前,檢查mysql表格是否已經抓取它。這將是一個選擇查詢,並不會加載太多的MySQL。我知道你正在以批處理的方式寫入數據庫,因爲性能問題,但是這個select不會加載mysql那麼多。如果您使用多個線程,只需觀察並監控與mysql的連接並根據需要更改配置。

但更好的方法是有一個表有3列的結構是這樣的:

id | url | crawled_flag 

此表在這裏創建url索引並使其獨特。所以這個網址不會是多餘的。首先,當你刮一頁時,使該行的crawled_flagtrue。然後解析頁面並獲取此頁面中的所有鏈接,並將crawled_flag作爲false插入到此表中。在這裏,如果該表中已存在該URL,則插入將失敗,因爲我們已將url列設置爲unique。您的下一個刮應該是crawled_flag的行的url爲false,並且此循環繼續。這將避免由於冗餘URL導致的數據冗餘。