Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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 在Scrapy中饲养CloseSpider会有什么影响?_Python_Web Scraping_Scrapy_Scrapy Spider_Scraper - Fatal编程技术网

Python 在Scrapy中饲养CloseSpider会有什么影响?

Python 在Scrapy中饲养CloseSpider会有什么影响?,python,web-scraping,scrapy,scrapy-spider,scraper,Python,Web Scraping,Scrapy,Scrapy Spider,Scraper,我想知道养蜘蛛有什么影响。在文档中没有关于它的信息。正如您所知,scrapy同时处理几个请求。如果在处理最后一个请求之前引发此异常,该怎么办?它会等待处理以前提出的rest请求吗? 例如: def parse(self, response): my_url = 'http://someurl.com/item/' for i in range(1, 100): my_url += str(i) if i == 50:

我想知道养蜘蛛有什么影响。在文档中没有关于它的信息。正如您所知,scrapy同时处理几个请求。如果在处理最后一个请求之前引发此异常,该怎么办?它会等待处理以前提出的rest请求吗? 例如:

def parse(self, response):
    my_url = 'http://someurl.com/item/'
    for i in range(1, 100):
         my_url += str(i)
         if i == 50:
             raise CloseSpider('')
         else:
             yield Request(url=my_url, callback=self.my_handler)

def my_handler(self, response):
     # handler
谢谢你的回复

======================== 可能的解决办法:

is_alive = True

def parse(self, response):
    my_url = 'http://url.com/item/'
    for i in range(1, 100):
        if not is_alive:
            break
        my_url += str(i)
        yield Request(url=my_url, callback=self.my_handler)

def my_handler(self, response):
    if (response do not contains new item):
        is_alive = False
根据,如果引发了
CloseSpider
异常,将执行
engine.close\u spider()
方法:

def handle_spider_error(self, _failure, request, response, spider):
    exc = _failure.value
    if isinstance(exc, CloseSpider):
        self.crawler.engine.close_spider(spider, exc.reason or 'cancelled')
        return
它本身将关闭spider并清除所有未完成的请求:

它还将为Scrapy架构的不同组件安排
close\u spider()
调用:下载程序、刮板、调度程序等。

根据,如果引发
CloseSpider
异常,
引擎。将执行close\u spider()
方法:

def handle_spider_error(self, _failure, request, response, spider):
    exc = _failure.value
    if isinstance(exc, CloseSpider):
        self.crawler.engine.close_spider(spider, exc.reason or 'cancelled')
        return
它本身将关闭spider并清除所有未完成的请求:


它还将为Scrapy架构的不同组件安排
close_spider()
调用:下载器、刮板、调度程序等。

谢谢您的回答。也许你知道:我如何关闭spider并在停止spider之前等待所有调用的请求?@OleksandrHubachov我认为它仍然会“在处理中”完成所有请求,我认为它负责管理要处理和不要处理的内容。希望能把事情弄清楚。你能描述一下你的用例和你想要改变的行为吗?谢谢,好问题!我有一个项目的网站。我的问题中的Url。我也不知道网站上到底有多少物品。我想解析所有这些。当我得到一个空页面时,我想阻止蜘蛛。在这个神奇的时刻到来之前接收所有来电请求是很重要的。那是我的problem@OleksandrHubachov有趣。我认为一旦你点击一个空页面,你就可以安全地抛出
CloseSpider
。测试一下,谢谢你。我用可能的解决方案编辑了我的帖子。我将尝试这两种方法,并将更新我的文章与正确的解决方案谢谢你的回答。也许你知道:我如何关闭spider并在停止spider之前等待所有调用的请求?@OleksandrHubachov我认为它仍然会“在处理中”完成所有请求,我认为它负责管理要处理和不要处理的内容。希望能把事情弄清楚。你能描述一下你的用例和你想要改变的行为吗?谢谢,好问题!我有一个项目的网站。我的问题中的Url。我也不知道网站上到底有多少物品。我想解析所有这些。当我得到一个空页面时,我想阻止蜘蛛。在这个神奇的时刻到来之前接收所有来电请求是很重要的。那是我的problem@OleksandrHubachov有趣。我认为一旦你点击一个空页面,你就可以安全地抛出
CloseSpider
。测试一下,谢谢你。我用可能的解决方案编辑了我的帖子。我将尝试这两种方法,并将更新我的帖子与正确的解决方案