2012-08-16 80 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。

祝你好运!