Я использую Scrapy 2.4 для сканирования определенных страниц из списка start_urls. Каждый из этих URL-адресов имеет предположительно 6 страниц результатов, поэтому я запрашиваю их все.
Однако в некоторых случаях имеется только одна страница результатов, а все остальные страницы с разбивкой на страницы возвращают 302 на pn=1. В этом случае я не хочу следовать этому 302 и не хочу продолжать поиск страницы 3,4,5,6, а скорее переходить к следующему URL-адресу в списке.
Как выйти (продолжить) из этого цикла for в случае 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
мы не можем заранее знать, сколько существует действительных страниц.
Обычный подход для таких случаев
заключается в планировании запросов один за другим таким образом, а не в цикле:
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
...
Да. Я понимаю. example.html
и example.thml?pn=1
могут иметь одинаковый вывод, однако эта реализация не имеет запроса на example.html
и не будет отправлять запросы на одну и ту же страницу дважды.
Большой! Это не только работает, но и помогло мне лучше понять, как работает Scrapy, чтобы я мог еще больше улучшить алгоритм. Спасибо!
Я понимаю, однако это приводит к моей основной проблеме, которая у меня была: stackoverflow.com/questions/65423455/… Ваше решение очень похоже на мой первый подход, который привел к этому обходному пути, что привело к этой проблеме.