Scrapy-如果response.status == 404,则跳出循环

埃里克·瓦伦特(Eric Valente)

我有一个循环,如果后续yield请求的response.status为404,我会尝试中断该循环。我正在迭代页码,但不知道有多少页可用。最终,我将到达一个页面,该页面将是404,并且我希望它打破while循环。我已将其硬编码为40页,但超过40页

def parse(self, response):
    cat = json.loads(response.body_as_unicode())
    for c in cat:
        while **RESPONSE.STATUS == 200**:
            url = 'http://www.url.com/'+str(c)+'/'+str(page)+'.json'
            page += 1
            yield Request(url, callback=self.parse_cats)

def parse_cats(self, response):
    if response.status  == '404':
        **BREAK ABOVE LOOP**

我看着Request(errback =),但是不确定这是否是正确的方法。

任何帮助将不胜感激!

ec

由于Scrapy基于一个名为的异步网络库twisted-该行为是非阻塞和异步的。不能中断请求回调的循环


但是,您可以具有某种seen_404可以在Spider实例上使用标志。一旦你看到404的状态-一套它True并打破循环的情况下,self.seen_404True这不是一个可靠的解决方案,因为这又是异步的-您将不知道在调用回调并将seen_404其设置为时循环经过了多少次迭代True但是,例如,如果您知道在一个404页面之后,所有接下来的页面也将具有404状态-那么这可能没问题:

def parse(self, response):
    cat = json.loads(response.body_as_unicode())
    for c in cat:
        if self.seen_404:
            break

        url = 'http://www.url.com/'+str(c)+'/'+str(page)+'.json'
        page += 1
        yield Request(url, callback=self.parse_cats)

def parse_cats(self, response):
    if response.status == '404':
        self.seen_404 = True

另一种选择是通过传递请求列表(队列)以使其在请求本身内部(内部使其同步meta

def parse(self, response):
    cat = json.loads(response.body_as_unicode())
    urls = ['http://www.url.com/%s/%s.json' % (c, page) 
            for page, c in enumerate(cat)]  # if you want page to start with 1: enumerate(cat, start=1)

    url = urls.pop(0)
    yield Request(url, meta={'urls': urls}, callback=self.parse_cats)

def parse_cats(self, response):
    if response.status == '404':
        # stop crawling
        raise CloseSpider('404 found at %s' % response.url)

    urls = response.meta['urls']
    try:
        url = urls.pop(0)
    except IndexError:
        raise CloseSpider('No more urls to go')

    yield Request(url, meta={'urls': urls}, callback=self.parse_cats)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scrapy-如果response.status == 404,则跳出循环

来自分类Dev

如果函数返回值,如何跳出循环

来自分类Dev

如果我的Pharo图像陷入无限循环,我该如何跳出循环?

来自分类Dev

带有 Scrapy 的 For 循环

来自分类Dev

如果满足一定条件,如何在for循环中停止产生scrapy spider?

来自分类Dev

Scrapy FormRequest form_response

来自分类Dev

Scrapy FormRequest form_response

来自分类Dev

如果满足条件则终止Scrapy

来自分类Dev

scrapyd {“ status”:“错误”,“ message”:“使用\” scrapy \“查看可用命令”

来自分类Dev

循环中的Scrapy通话请求

来自分类Dev

在Tkinter循环中跳出

来自分类Dev

无法跳出 While 循环

来自分类Dev

在 DFDL 中跳出循环

来自分类Dev

Scrapy response.xpath not returning anything for a query

来自分类Dev

Scrapy-response.xpath将项目分开

来自分类Dev

Scrapy FormRequest.from_response 错误

来自分类Dev

Scrapy:如果是302,如何停止请求?

来自分类Dev

如何在Scrapy中循环响应元素?

来自分类Dev

在循环中使用Scrapy Itemloader

来自分类Dev

在Scrapy上循环无法正常工作

来自分类Dev

Scrapy & Selenium:如何循环 XPATH 并执行点击

来自分类Dev

循环一个scrapy脚本

来自分类Dev

Scrapy 识别重定向并停止循环

来自分类Dev

Angular response.status未运行

来自分类Dev

Javascript CORS撷取response.status = 0

来自分类Dev

通过调用方法跳出循环

来自分类Dev

如果status = N,则需要结果集;如果status = N,并且status = P,则不显示结果

来自分类Dev

response.status和response.writeHead之间的区别?

来自分类Dev

Scrapy response.xpath不为查询返回任何内容