当存在多个重复链接时,如何提高爬行速度

2024-09-29 21:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

对于每个页面,爬虫将提取其链接并跟踪它们。问题是每个页面都有大约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 

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

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


Tags: inselfurlfordataparse链接response
1条回答
网友
1楼 · 发布于 2024-09-29 21:28:33

如果我理解正确,你的问题之一是重复链接。为什么不简单地对一组链接进行解析,并根据该集合检查要解析的所有链接?我的意思是:

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)

相关问题 更多 >

    热门问题