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



我使用Scrapy 2.4从start_urls列表中抓取特定页面。这些URL中的每一个都有6个结果页面,所以我请求所有结果页面。

然而,在某些情况下,只有1个结果页面,并且所有其他分页页面返回302到pn=1。在这种情况下,我不想遵循302,也不想继续寻找第3、4、5、6页,而是继续到列表中的下一个URL。

在302/301的情况下,如何退出(继续(循环,以及如何不遵循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我们无法提前知道存在多少有效页面。

这类情况的常见方法
是以这种方式逐个调度请求istead of loop:

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
...

最新更新