Когда дело доходит до нумерации страниц, оптимальный подход действительно зависит от того, какой тип нумерации используется.
Если вы:
- знаете формат страницы URL, например, аргумент URL
page
указывает на какую страницу вы - знаете общее количество страниц
Тогда вы можете запланировать все страницы сразу:
def parse_listings_page1(self, response):
"""
here parse first page, schedule all other pages at once!
"""
# e.g. 'http://shop.com/products?page=1'
url = response.url
# e.g. 100
total_pages = int(response.css('.last-page').extract_first())
# schedule every page at once!
for page in range(2, total_pages + 1):
page_url = add_or_replace_parameter(url, 'page', page)
yield Request(page_url, self.parse_listings)
# don't forget to also parse listings on first page!
yield from self.parse_listings(response)
def parse_listings(self, response):
for url in response.css('.listing::attr(href)'):
yield Request(url, self.parse_product)
Огромные преимущества этого подходаскорость - здесь вы можете использовать асинхронную логику и сканировать все страницы одновременно!
В качестве альтернативы.
Если вы:
- не знаете ничего, кроме следующей страницыURL-адрес находится на странице
Затем вы должны запланировать синхронное планирование страниц 1 на 1:
def parse(self, response):
for product in response.css('.product::attr(href)'):
yield Request(product, self.parse_product)
next_page = response.css('.next-page::attr(href)').extract_first()
if next_page:
yield Request(next_page, self.parse)
else:
print(f'last page reached: {response.url}')
В вашем примере вы используете второй синхронный подход и ваши опасения здесь необоснованны, вы просто должны убедиться, что ваш селектор xpath выбирает правильную страницу.