2012-08-16 125 views
1

我有一個網絡爬蟲。網絡爬蟲收集我給它的網頁的鏈接,但是當它檢索鏈接時,由於網站的緣故,一些鏈接被複制。如果新行與舊行完全相同,那麼MYSQL有沒有辦法覆蓋數據?覆蓋mysql表數據

說,如果我在一個鏈接字段

我也設法再次回升http://www.facebook.comhttp://www.facebook.com,我想後者覆蓋舊行。因此我的搜索引擎沒有衝突。

+0

[有幫助?](http://stackoverflow.com/questions/1218905/how-do-i-update-if-exists-insert-if-not-aka-upsert-or-merge-in-mysql) – 2012-08-16 17:44:45

回答

2

我假設你想如果url已存在,則更新last_updated日期。否則沒有好的理由去做更新。

INSERT INTO `scrapping_table` 
    (`url`) 
    VALUES 
    ("www.facebook.com") 
    ON DUPLICATE KEY UPDATE 
    `date_updated` = `datetime.now()` 
+0

我有桌子,'網頁',你可以解釋一下更多 – 2012-08-16 17:54:01

+0

所以你的'網頁'表有一個列'url'存儲'facebook.com'。現在您再次抓取網頁,您的抓取工具再次找到「facebook.com」。現在更新'url'是一個多餘的步驟,除非您可以通過存儲執行此更新的'date'來存儲關於此新爬網的更多元信息。 – 2012-08-16 18:04:55

+0

在像Google這樣的大型系統中,抓取可能需要幾周時間,並且上次查看此url信息對於搜索算法非常有用,因此抓取工具不會繼續瀏覽相同的url。稍微不同的是,谷歌使用「倒排索引」,這是建立全文搜索的好策略。 – 2012-08-16 18:06:53

0

如果您的鏈接域是唯一比你可以使用

INSERT INTO "mytable" (link_field, x_column, y_column) VALUES ("www.facebook.com",'something new for x','something new for y') 
ON DUPLICATE KEY UPDATE x_column='something new for x', y_column='something new for y' 

只要確保你的鏈接域是唯一的,如果你在你的列有更獨特的領域,我建議使用,因爲這第二個方法they建議避免在具有多個唯一索引的表上使用ON DUPLICATE KEY子句。

  1. 將您的鏈接字段設置爲唯一。
  2. 之前插入一行嘗試

    Select "primary_id" from mytable where link_field="www.facebook.com" 
    
  3. 從這個SQL計數返回的行數。

    =>如果計數> 0,然後更新使用 「primary_id」 我們只是通過SELECT SQL

    =>抓起行,如果count == 0,只需要插入你的行

0

謹防!!

同時經營一個網絡爬蟲,可能會發現數以百萬計的 你希望儘量減少查詢的每一個「爬行」過程火災鏈接... 你想創建一個獨特的聯繫表,將養活機器人?或者你想防止重複的搜索結果?

唯一的URL檯球桌: - (!in_array())

  • 在檢索頁面,你應該網址保存到一個數組(或列表),並確保了其獨特的價值陣列,你會發現你爬行的每一頁都包含很多重複的鏈接 - 所以在使用sql之前清理它們。
  • 將網址轉換爲哈希值(32位數字的「simhash」[1,0])。
  • 現在打開一個連接到數據庫,並檢查是否存在,如果它確實轉儲他們!不要更新(其進行第二個過程)。你應該在索引表上匹配使用散列的鏈接,這將更快。

防止重複結果搜索:

  • 如果在上述方法編制索引的網址,你不應該查找重複的URL,如果你有,這意味着在你的爬行操作的問題。

  • 即使您在另一個表中有重複的值,並且您想要搜索但沒有返回重複結果,您可以在查詢中使用DISTINCT。

祝你好運!