gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:45:21 24 4
gpt4 key购买 nike

如果后续 yield Request 的 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=) 但不确定这是否是解决此问题的正确方法。

如有任何帮助,我们将不胜感激!

最佳答案

由于 Scrapy 基于名为 twisted 的异步网络库 - 行为是非阻塞和异步的。您无法从请求回调中打破循环


尽管如此,您可以拥有某种 seen_404 标志,该标志将在蜘蛛实例上可用。一旦您看到 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)

关于python - Scrapy - 如果 response.status == 404 则跳出循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28706229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com