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
...
我正在使用 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
...