覆盖mysql表数据

时间:2012-08-16 17:40:45

标签: mysql sql web-crawler

我有一个网络抓取工具。网页抓取工具从我提供的网页收集链接,但是当它检索链接时,由于网站的原因,某些链接会重复。如果新行与旧行完全相同,MYSQL中是否有一种方法可以覆盖数据。

假设我在链接字段中有http://www.facebook.com

我还设法再次选择http://www.facebook.com,我希望后者覆盖旧行。因此我的搜索引擎没有冲突。

4 个答案:

答案 0 :(得分:2)

如果last_updated已存在,我假设您要更新url日期。否则,没有充分理由进行更新。

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

答案 1 :(得分:1)

调查ON DUPLICATE KEY行动

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

基本上让你关注一个唯一键的列写下你的insert语句,然后添加

ON DUPLICATE KEY UPDATE col = overwriting value

答案 2 :(得分: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子句。 / p>

  1. 将您的链接字段设置为唯一。
  2. 插入行之前
  3. 尝试

    Select "primary_id" from mytable where link_field="www.facebook.com"
    
  4. 计算此SQL中返回的行数。

    =>如果count> 0,则使用我们刚刚通过SELECT SQL抓取的“primary_id”更新行

    =>如果count == 0,只需插入行

答案 3 :(得分:0)

<强>提防!!

在操作可能会找到数百万个链接的网络爬虫时 你想最小化查询的每个“爬行”过程触发... 你想创建一个独特的链接表,将为机器人提供信息吗?或者您想阻止重复的搜索结果?

唯一网址池表:

  • 在抓取页面时 - 你应该将url保存到数组(或列表)并确保(!in_array())它是一个唯一的值数组,你会发现你抓取的每个页面都包含很多重复的链接 - 所以在使用sql之前清理它们。
  • 将网址隐藏为哈希(32位数字的“simhash”[1,0])。
  • 现在打开与db的连接并检查是否存在它是否存在转储!不要更新(它进行第二个过程)。你应该使用索引表上的散列匹配链接,它会更快。

阻止重复结果搜索:

  • 如果您使用上述方法编制了网址索引,则无法找到重复的网址,如果有,则表示您的抓取操作存在问题。

  • 即使您在另一个表中有重复值并且您想要搜索它但没有返回重复结果,您也可以在查询中使用DISTINCT。

祝你好运!