【问题标题】:Persistent Duplicate Filtering in ScrapyScrapy 中的持久重复过滤
【发布时间】:2014-09-17 10:13:56
【问题描述】:

我刚开始使用scrapy,我想要一种方法来保存以前抓取过的网址,这样我就可以运行后续的抓取,并且只从未知的网址中获取新数据。我看到了几种过滤重复项的不同方法和几种持久化数据的方法。我想知道在scrapy 0.24版中推荐的进行这些活动的方法是什么。以下是我看到的选项:

用于重复过滤

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

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

用于持续重复跟踪

我曾尝试使用scrapy-redis 来保留以前被抓取的 URL,以便它们可以被重复过滤器使用,但似乎我正在使用的任何DUPEFILTER_CLASS 都被忽略了。我还看到如果您在运行时使用JOBDIR 选项,spider.state 将存储一个字典,但这似乎不是用于重复过滤的最佳选择。

谁能给我一个代码示例,该示例可用于在批次之间保存数据并进行重复过滤?

【问题讨论】:

    标签: python redis scrapy web-scraping


    【解决方案1】:

    我没有代码 sn-p 也没有足够的代表来评论您的问题,但这里是对持久 url 重复过滤想法的建议。

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

    实现一个下载器中间件,它执行以下操作(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 将过滤此蜘蛛实例的重复请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多