Scrapy:如何在 302 的情况下停止请求?

Scrapy: How to stop requesting in case of 302?

我正在使用 Scrapy 2.4 从 start_urls 列表中抓取特定页面。这些 URL 中的每一个大概有 6 个结果页面,所以我请求它们全部。

然而,在某些情况下,只有 1 个结果页面和所有其他分页页面 return a 302 to pn=1。在这种情况下,我不想跟随那个 302,也不想继续寻找第 3、4、5、6 页,而是继续查找列表中的下一个 URL。

如果出现 302/301,如何退出(继续)这个 for 循环以及如何不遵循 302?

def start_requests(self):
    for url in self.start_urls:
        for i in range(1,7): # 6 pages
            yield scrapy.Request(
                url=url + f'&pn={str(i)}'
            )

def parse(self, request):

    # parse page
    ...

    # recognize no pagination and somehow exit the for loop
    if not response.xpath('//regex'): 
        # ... continue somehow instead of going to page 2

您的方法的主要问题是,根据 start_requests 我们无法提前知道存在多少有效页面。

这种情况的常见方法
是以这种方式一个接一个地安排请求,而不是循环:

class somespider(scrapy.Spider):
...
    def start_requests(self):
        ...
        for u in self.start_urls:
            # schedule only first page of each "query"
            yield scrapy.Request(url=u+'&pn=1', callback=self.parse)

    def parse(self, response):
        r_url, page_number = response.url.split("&pn=")
        page_number = int(page_number)
        ....
        if next_page_exists:
            yield scrapy.Request(
            url = f'{r_url}&pn={str(page_number+1)}',
            callback = self.parse)
       else:
           # something else
           ...