Вот некоторый рабочий код для того, что вы хотите сделать:
import scrapy
from urllib.parse import urlsplit, urljoin
class HomedepotSpider(scrapy.Spider):
name = 'homedepot'
start_urls = ['https://www.homedepot.com/b/N-5yc1v/Ntk-ProductInfoMatch/Ntt-zline?NCNI-5&experienceName=default&Nao=0']
def parse(self, response):
# Here you do something with your items
next_page = response.css('a.hd-pagination__link[title=Next]::attr(href)').get()
if next_page is not None:
o = urlsplit(response.url)
base_url = f'{o.scheme}://{o.netloc}'
next_page_url = urljoin(base_url,next_page)
yield response.follow(next_page_url, callback=self.parse)
Основные моменты, на которые я хотел бы указать вам в этом коде:
- Проверьте селектор на следующая страница Он проверяет атрибут title и выбирает только элемент с заголовком «Next». То есть идентифицировать последнюю кнопку в нумерации страниц. Я не уверен, что в вашем примере указана правильная кнопка
- На следующей странице вы видите относительный URL. Для этого используйте urljoin, чтобы получить базовую часть текущего URL (
response.url
), а затем добавьте к этому относительному значению, которое вы получаете, с помощью urljoin - Получив URL следующей страницы, вы можете просто используйте response.follow, чтобы указать пауку, чтобы добавить этот URL с выбранным обратным вызовом в список URL для сканирования
Также здесь есть журналы Scrapy, показывающие, что он просканировал 31 страницу. Это то, что вы должны получить, если выполните его
2020-02-21 10:42:04 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 44799,
'downloader/request_count': 31,
'downloader/request_method_count/GET': 31,
'downloader/response_bytes': 1875031,
'downloader/response_count': 31,
'downloader/response_status_count/200': 31,
'dupefilter/filtered': 1,
'elapsed_time_seconds': 13.690273,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2020, 2, 21, 10, 42, 4, 145686),
'log_count/DEBUG': 32,
'log_count/INFO': 10,
'memusage/max': 52195328,
'memusage/startup': 52195328,
'request_depth_max': 31,
'response_received_count': 31,
'scheduler/dequeued': 31,
'scheduler/dequeued/memory': 31,
'scheduler/enqueued': 31,
'scheduler/enqueued/memory': 31,
'start_time': datetime.datetime(2020, 2, 21, 10, 41, 50, 455413)}
2020-02-21 10:42:04 [scrapy.core.engine] INFO: Spider closed (finished)
Надеюсь, это поможет !!