重复链接多时如何提高Scrapy爬取速度
How to increase Scrapy crawling speed when there are many duplicates links
我正在使用 Scrapy 抓取一个包含数百万个页面的网站,我需要关注这些页面并从中提取信息。
爬虫目前每分钟只能抓取 200 页,我需要加快速度。
对于每个页面,抓取工具都会提取其链接并跟踪它们。问题是每个页面都有大约 600 个链接,其中大部分都在所有页面上,我认为这就是为什么爬虫为所有链接调用 Request 函数需要这么长时间的原因,即使它们是重复的。
这是我的代码的简化版本:
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
我已经尝试设置并发请求数和每个域的并发请求数但没有成功。
有谁知道为什么爬行需要这么长时间,我怎样才能加快速度?
如果我对您的理解正确,您遇到的问题之一是重复链接。为什么不简单地解析一组链接并检查您要针对该集合解析的所有链接?这就是我的意思:
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 了解更多信息;默认情况下您的请求将被过滤,因此您不会访问重复的 URL)。
我正在使用 Scrapy 抓取一个包含数百万个页面的网站,我需要关注这些页面并从中提取信息。
爬虫目前每分钟只能抓取 200 页,我需要加快速度。
对于每个页面,抓取工具都会提取其链接并跟踪它们。问题是每个页面都有大约 600 个链接,其中大部分都在所有页面上,我认为这就是为什么爬虫为所有链接调用 Request 函数需要这么长时间的原因,即使它们是重复的。
这是我的代码的简化版本:
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
我已经尝试设置并发请求数和每个域的并发请求数但没有成功。
有谁知道为什么爬行需要这么长时间,我怎样才能加快速度?
如果我对您的理解正确,您遇到的问题之一是重复链接。为什么不简单地解析一组链接并检查您要针对该集合解析的所有链接?这就是我的意思:
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 了解更多信息;默认情况下您的请求将被过滤,因此您不会访问重复的 URL)。