【问题标题】:How to increase Scrapy crawling speed when there are many duplicates links重复链接较多时如何提高 Scrapy 的爬取速度
【发布时间】:2020-01-28 09:52:18
【问题描述】:

我正在使用 Scrapy 抓取一个包含数百万个页面的网站,我需要关注这些页面并从中提取信息。

爬虫目前每分钟只能抓取 200 页,我需要加快速度。

对于每个页面,爬虫都会提取其链接并跟踪它们。问题是每个页面有大约 600 个链接,其中大部分都在所有页面上,我认为这就是为什么爬虫为所有链接调用请求函数需要这么长时间的原因,即使它们是重复的。

这是我的代码的简化版本:

def parse_data(self, response):
    item = URL() 
    outlinks_extrated = [l.url for l in LinkExtractor(allow_domains=self.allowed_domains, deny_extensions = self.reg_deny, unique=False, restrict_xpaths=self.xpath_outlinks, tags=self.tags, deny = self.regex_denied).extract_links(response)]
    for url in outlinks_extrated: 
        yield scrapy.Request(url, callback=self.parse_data) 
    item['url'] = response.request.url
    yield item 

我已经尝试设置每个域的并发请求和并发请求但没有成功。

有谁知道为什么爬行需要这么长时间以及如何加快速度?

【问题讨论】:

  • 这次抓取运行期间您的 CPU 使用率是多少? Scrapy 默认使用默认启用的RFPDupefilter 过滤重复的 url。

标签: python scrapy web-crawler


【解决方案1】:

如果我理解正确,您遇到的问题之一是重复链接。为什么不简单地解析一组链接并检查您要针对该组解析的所有链接?这就是我的意思:

links_visited = set()

def parse_data(self, response):
    item = URL() 
    outlinks_extrated = [l.url for l in LinkExtractor(allow_domains=self.allowed_domains, deny_extensions = self.reg_deny, unique=False, restrict_xpaths=self.xpath_outlinks, tags=self.tags, deny = self.regex_denied).extract_links(response)]
    for url in outlinks_extrated:
        if url not in links_visited:
            yield scrapy.Request(url, callback=self.parse_data)
            links_visited.add(url)
    item['url'] = response.request.url
    yield item 

这样您就可以确保不会重新访问 URL。

编辑:也许更好的解决方案是将scrapy.Request 实例化一次;这样您就可以使用dont_filter 参数(查看https://docs.scrapy.org/en/latest/topics/request-response.html 了解更多信息;默认情况下您的请求将被过滤,因此您不会访问重复的网址)。

【讨论】:

  • 谢谢!使用该设置,爬虫每分钟可以抓取两倍的页面。 dont_filter 参数已默认设置为 true,因此它不会访问重复的 URL,但我不知道为什么在没有跟随重复链接的情况下对所有链接使用 Request 函数时会花费更多时间。
  • 您写道:“问题是每个页面有大约 600 个链接,并且大部分都在所有页面上” 但是每次实例化一个新的Request 时,您只需给它一个 URL;这些实例没有关于您使用此类的先前实例访问的那些链接的信息。并且在每个循环中,URL 的某些部分是重复的,因此您必须检查这一点。所以可能最好的(或至少有效的)解决方案是使用集合。另请注意,启用过滤dont_filter 必须是False
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2021-08-09
相关资源
最近更新 更多