Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当存在多个重复链接时,如何提高爬行速度_Python_Scrapy_Web Crawler - Fatal编程技术网

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

Python 当存在多个重复链接时,如何提高爬行速度,python,scrapy,web-crawler,Python,Scrapy,Web Crawler,我正在使用Scrapy来抓取一个有数百万个页面的网站,我需要跟踪这些页面并从中提取信息 爬虫目前每分钟只抓取两百页,我需要加快速度 对于每个页面,爬虫将提取其链接并跟踪它们。问题是每个页面都有大约600个链接,其中大部分都在所有页面上,我认为这就是为什么爬虫程序调用所有链接的请求函数(即使它们是重复的)要花这么长时间的原因 以下是我的代码的简化版本: def parse_data(self, response): item = URL() outlinks_extrated =

我正在使用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 
我已经尝试设置并发请求和每个域的并发请求,但没有成功


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

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

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
一次;通过这种方式,您可以使用
don\u filter
参数(查看更多信息;您的请求将在默认情况下被过滤,这样您就不会访问重复的URL)。

谢谢!使用该设置,爬虫程序每分钟可以刮取两倍的页面。默认情况下,
dont\u filter
参数已设置为true,因此它不会访问重复的URL,但我不知道如果它不跟踪重复的链接,为什么对所有链接使用请求函数会花费更多时间。您写道:“问题是每个页面有大约600个链接,其中大多数都在所有页面上”但每次实例化一个新的
请求
时,只需给它一个URL;这些实例没有关于您使用以前的此类实例访问的链接的信息。在每个循环中,URL的某些部分是重复的,因此您必须检查这一点。所以最好的(或者至少是有效的)解决方案可能是使用集合。另外,请注意,要启用筛选
dont\u filter
必须为
False
。在该刮削运行期间,您的CPU使用情况如何?Scrapy过滤器默认情况下使用默认启用的
RFPDupefilter
复制URL。