Scrapy中的持久重复过滤

时间:2014-07-25 14:10:30

标签: python redis scrapy web-scraping

我刚刚开始使用scrapy,我想要一种方法来保留以前被抓取过的URL,这样我就可以运行后续的抓取并只接收来自未知URL的新数据。我看到了几种不同的方法来过滤重复项和几种方法来保存数据。我想知道做这些活动的推荐方法是scrapy版本0.24。以下是我看到的选项:

重复过滤

DUPEFILTER_CLASS文件中的settings.py仍然在文档中引用。我还看到文档提到在ItemPipeline中放置一个重复的过滤器,如下所示:http://doc.scrapy.org/en/latest/topics/item-pipeline.html?highlight=duplicates#duplicates-filter

人们是否使用DUPEFILTER_CLASS或将dupefilter放入项目管道中?

用于持续重复跟踪

我尝试使用scrapy-redis来保留先前已被删除的网址,以便它们可以被重复的过滤器使用,但似乎我使用的任何DUPEFILTER_CLASS都会被忽略。如果在运行时使用spider.state选项,我还会看到JOBDIR会存储字典,但这似乎不是最适合用于重复过滤的。

有人能指出我可以用来在批次之间保存数据并进行重复过滤的代码示例吗?

1 个答案:

答案 0 :(得分:1)

我没有代码片段,也没有足够的代表对您的问题发表评论,但这里是对持久性网址欺骗过滤理念的建议。

保留已抓取网址的数据库。

实现执行以下操作的下载程序中间件(pythonish伪代码):

if url isn't present: 
   add url to databse
   return None    # this tells scrapy to keep handling request as normal
else:
   raise IgnoreRequest

HTH

编辑: http://doc.scrapy.org/en/latest/topics/downloader-middleware.html

如果您使用的是爬网蜘蛛,则可以执行此操作以进行非持久性过滤:

    rules = (
        Rule(SgmlLinkExtractor(unique=True,
                           deny=[r'.*QuickInfo.*'],
                           allow_domains=allowed_domains,
                           restrict_xpaths=['//*[starts-with(@id, "e")]//a',
                                            '//*[starts-with(@id, "HP_Priority")]//a']),
         follow=True),)

unique = True将过滤此蜘蛛实例的重复请求。