1

我有一个网络爬虫。网络爬虫从我给它的网页中收集链接,但是当它检索链接时,一些链接由于网站而重复。如果新行与旧行完全相同,MYSQL 中有没有办法覆盖数据。

说如果我有在链接字段中有http://www.facebook.com

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

4

4 回答 4

2

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

 INSERT INTO `scrapping_table`
    (`url`)
    VALUES
    ("www.facebook.com")
    ON DUPLICATE KEY UPDATE
    `date_updated` = `datetime.now()`
于 2012-08-16T17:51:26.947 回答
1

调查ON DUPLICATE KEY行动

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

基本上使您关注的列具有唯一键写入您的插入语句,然后添加

ON DUPLICATE KEY UPDATE col = overwriting value
于 2012-08-16T17:42:54.997 回答
0

谨防!!

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

独特的 url 台球桌:

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

防止重复结果搜索:

  • 如果您在上述方法中对 url 进行了索引,则不应找到重复的 url,如果有,则表示您的抓取操作存在问题。

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

祝你好运!

于 2013-03-24T23:24:51.650 回答
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'

只要确保您的链接字段是唯一的,如果您的列中有更多唯一字段,我建议使用第二种方法,因为他们建议避免在具有多个唯一索引的表上使用 ON DUPLICATE KEY 子句。

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

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

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

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

于 2012-08-16T18:11:45.903 回答