scrapy 无限循环中的剪贴请求,直到特定回调结果

9o685dep  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(116)

我想从start_requests调用N个scrappy requests。这个值是动态的,因为我想遍历API中的所有页面。我之前不知道页面的限制数量。但是我知道当我超过页面数量时,API的响应将是一个空json。我想做如下操作:

url = "https://example.com?page={}"
def start_requests(self):
    page = 0
    while True:
        page += 1
        yield scrapy.Request(url=url.format(page), callback=self.parse)

def parse(self, response, **kwargs):
    data = json.loads(response.body)
    if 'key' in data:
        # parse and yield an item
        pass
    else: 
        # do not yield an item and break while loop in start_requests

我不知道如何实现这一点。我可以return一个值从回调(而不是yield)当条件满足?

pbwdgjma

pbwdgjma1#

不能,但是您可以将class属性设置为一个标志,指示start_requests不应继续:
例如:

class MySpider(scrapy.Spider):
    
    url = "https://example.com?page={}"
    keep_crawling = True
    def start_requests(self):
        page = 0
        while self.keep_crawling:
            page += 1
            yield scrapy.Request(url=url.format(page), callback=self.parse)

    def parse(self, response, **kwargs):
        data = json.loads(response.body)
        if 'key' in data:
            # parse and yield an item
            pass
        else: 
            self.keep_crawling = False

相关问题