我正在使用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 我已经尝试设置并发请求和每个域的并发请求,但不起作用。
有人知道为什么爬行需要这么长时间吗?我怎样才能加快爬行速度?
发布于 2020-01-28 18:03:35
如果我没理解错的话,其中一个问题就是重复链接。为什么不简单地创建一组已解析的链接,并检查您将要解析的所有链接呢?我的意思是:
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)。
https://stackoverflow.com/questions/59946072
复制相似问题