Scrapy 异步写入mysql时部分数据重复问题

scrapy爬取百度新闻,参考网上回答修改Pipeline部分代码:

def process_item(self,item,spider):
    asynItem = copy.deepcopy(item)
    query=self.dbpool.runInteraction(self.do_insert,asynItem)
    query.addErrback(self.handle_error)

def handle_error(self,failure):
    print(failure)

def do_insert(self,cursor,item):
    check_sql = "select count(*) from `company_news_scrapy` where (`link`,`company_name`) =({},{})".format("'" + item['link'] + "'","'" + item['company_name'] + "'")
    cursor.execute(check_sql)
    rest = cursor.fetchall()
    if rest[0]['count(*)']==0:
        insert_sql = "insert into `company_news_scrapy`(`company_name`,`link`) values(%s,%s);"
        cursor.execute(insert_sql, (item['company_name'],item['link']))
        

仍然出现部分数据重复插入问题,求帮助。

阅读 5.2k
4 个回答

会不会在你 select count(*) 之后,insert之前,别的线程插入了该数据呢?
要不你多打印点日志,看看问题出在哪。
另外,你可以试试:设置一下 唯一性约束,然后使用:
insert ... on duplicate key update ...
来操作:无则插入,有则更新

看不到你的爬取代码
1.有可能是本身页面数据重复问题,建议看一下网页源代码
2.有可能是爬取规则不够明确导致的页面重复爬取,建议看一下爬取规则是否完善

我也赞同楼上说的页面新闻内容重复或者就是自己点重复爬取

新手上路,请多包涵

同求。我知道原因,但是不知道怎么改,原因是因为写数据库异步的,我们写数据库的时候直接拿数据的item的值,但是很有可能item的请求时间慢。这样我们在下一次写数据的时候就是写的就还是上次的数据。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题