我正在使用 Scrapy 2.4 从 start_urls 列表中抓取特定页面。这些 URL 中的每一个可能都有 6 个结果页面,因此我请求全部结果页面。
然而,在某些情况下,只有 1 个结果页面,所有其他分页页面都会返回 302 到 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
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)