Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy增量爬网以过滤重复项_Python_Scrapy_Web Crawler - Fatal编程技术网

Python Scrapy增量爬网以过滤重复项

Python Scrapy增量爬网以过滤重复项,python,scrapy,web-crawler,Python,Scrapy,Web Crawler,我想定期运行Scrapy以获取所有新内容。生成的项目存储在数据库中。当Scrapy再次爬行时,最好的方法是什么来验证已经产生的项目没有作为副本存储 给项目一个散列是验证这一点的好方法吗?我不想在我的数据库中有重复的项目 谢谢 如果您在不同的爬网之间同时抓取项目,那么检查TomášLinhart引用的数据库管道中是否存在重复项是一个有意义的选择 否则,我认为在scrapy范围内执行复制过程是更好的选择。 例如,由社区提供,它在爬行器中间件中过滤重复项以进行增量(增量)爬网 DeltaFetch通过

我想定期运行Scrapy以获取所有新内容。生成的项目存储在数据库中。当Scrapy再次爬行时,最好的方法是什么来验证已经产生的项目没有作为副本存储

给项目一个散列是验证这一点的好方法吗?我不想在我的数据库中有重复的项目


谢谢

如果您在不同的爬网之间同时抓取项目,那么检查TomášLinhart引用的数据库管道中是否存在重复项是一个有意义的选择

否则,我认为在scrapy范围内执行复制过程是更好的选择。 例如,由社区提供,它在爬行器中间件中过滤重复项以进行增量(增量)爬网

DeltaFetch通过拦截spider回调中生成的每个项和请求对象来工作。对于项目,它计算相关的请求标识符(也称为指纹)并将其存储到本地数据库(嵌套)。对于请求,Deltafetch计算请求指纹,如果数据库中已经存在请求,则删除请求

正确安装和配置此插件后。然后运行爬虫并查看Scrapy最后记录的统计信息。您可以看到关于deltafetch的新添加项

2017-12-25 16:36:17 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'deltafetch/skipped': 88,
 'deltafetch/stored': 262,
 'downloader/request_count': 286,
 'finish_reason': 'finished',
  ...
 'item_scraped_count': 262,
  ...
}

在spider开始之前将所有项目加载到一个列表中,在让步时,只需检查该列表中是否存在该项目,最佳解决方案取决于两个方面。如何在数据库中存储项目?您是将它们存储在spider类中还是使用管道?是否要跳过所有已有的项目,或者最好在数据库中更新它们(以防它们发生更改)。你使用什么数据库?在回答了这些问题之后,最好的解决方案会更加清晰。你好@TomášLinhart。我使用关系数据库MySQL来存储数据。我使用项目类中的项目,并使用管道来处理爬网数据并将其导出到数据库。我还不确定跳过或更新该项目是否是最佳选择。但我可以想象,检查数据库的开销会减慢爬虫程序的速度,不是吗?如果使用管道,检查数据库是否存在重复也会降低爬虫程序的速度。这不会影响爬行性能,我理解。我是否必须设置scrapy来执行数据库验证,或者这是内置的?此外,此功能是否也适用于MongoDB?