首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当有许多重复链接时,如何提高抓取速度

当有许多重复链接时,如何提高抓取速度
EN

Stack Overflow用户
提问于 2020-01-28 17:52:18
回答 1查看 262关注 0票数 0

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

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

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

以下是我的代码的简化版本:

代码语言:javascript
复制
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 

我已经尝试设置并发请求和每个域的并发请求,但不起作用。

有人知道为什么爬行需要这么长时间吗?我怎样才能加快爬行速度?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-28 18:03:35

如果我没理解错的话,其中一个问题就是重复链接。为什么不简单地创建一组已解析的链接,并检查您将要解析的所有链接呢?我的意思是:

代码语言:javascript
复制
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)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59946072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档