Персинг не переходит на следующую страницу

Рейтинг: 0Ответов: 1Опубликовано: 28.06.2023

Есть код парсинга сайта с помощью scrapy crawl

import scrapy


class OstrovSpider(scrapy.Spider):
    name = "ostrov"
    allowed_domains = ['ostrov-shop.by']
    start_urls = [
        "https://ostrov-shop.by/catalog/produkty-pitaniya/bakaleya/maslo-rastitelnoe-uksus-ketchupy-gorchitsa-khren-soevye-sousy/",
        ]

    def parse(self, response):
        for link in response.css('div.item-title a::attr(href)'):
            yield response.follow(link, callback=self.parse_ostrov)

        pages_count = int(response.css('div.nums a.dark_link:last-child::text').get()) + 1 
        for i in range (1, pages_count):
            next_page = f"https://ostrov-shop.by/catalog/produkty-pitaniya/bakaleya/maslo-rastitelnoe-uksus-ketchupy-gorchitsa-khren-soevye-sousy/?PAGEN_1={i}&btn_load=Y&ajax_get=Y&AJAX_REQUEST=Y&bitrix_include_areas=N"
            yield response.follow(next_page, callback=self.parse)

        next_page = response.css('a.flex-next::attr(href)').get()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

    def parse_ostrov(self, response):
        yield {
            'Название': response.css('#pagetitle::text').get(),
            'Штрихкод': response.css('.prod-properties > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)::text').get().strip(),
            }   

Парсится только первая страница. Дальше парсинг останавливается. Через scrapy shell я получаю верное количество страниц. Переход на следующую страницу может быть выполнен через номер страницы или через кнопку следующая страница. Так же на сайте есть кнопка Показать еще. Что нужно сделать, чтобы был правильный переход на следующую страницу?

Ответы

▲ 0

Использовать Scrapy, чтобы запарсить три странички, эхх… Здесь Scrapy не нужен, достаточно банального и под данную задачу, геморроя будет меньше.

Но‥ ладно, хотите фреймворк, используйте фреймворк. Возможно вы хотите изучить его на банальных примерах, почему нет. Только с минимальным, самодостаточным и воспроизводимым примером здесь явно сложнее, т.к. проект обычно не ограничивается одним Spider. И, помимо изучения фреймоврка неплохо бы изучить как дебажить проекты в Scrapy, крайне полезно. Но здесь нет необходимости делать точки остановы, достаточно запустить проект, закомментировав получение названий и штрихкодов, т.к. они работают, и посмотреть что идёт не так в макрочасти кода, а там, в консоли:

2023-06-28 22:16:41 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://ostrov-shop.by/robots.txt> (referer: None)
2023-06-28 22:16:42 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://ostrov-shop.by/catalog/produkty-pitaniya/bakaleya/maslo-rastitelnoe-uksus-ketchupy-gorchitsa-khren-soevye-sousy/> (referer: None)
2023-06-28 22:16:42 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: <GET https://ostrov-shop.by/catalog/produkty-pitaniya/bakaleya/maslo-rastitelnoe-uksus-ketchupy-gorchitsa-khren-soevye-sousy/?PAGEN_1=1&btn_load=Y&ajax_get=Y&AJAX_REQUEST=Y&bitrix_include_areas=N>
2023-06-28 22:16:42 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: <GET https://ostrov-shop.by/catalog/produkty-pitaniya/bakaleya/maslo-rastitelnoe-uksus-ketchupy-gorchitsa-khren-soevye-sousy/?PAGEN_1=2>
2023-06-28 22:16:42 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: <GET https://ostrov-shop.by/catalog/produkty-pitaniya/bakaleya/maslo-rastitelnoe-uksus-ketchupy-gorchitsa-khren-soevye-sousy/?PAGEN_1=3&btn_load=Y&ajax_get=Y&AJAX_REQUEST=Y&bitrix_include_areas=N>
2023-06-28 22:16:42 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: <GET https://ostrov-shop.by/catalog/produkty-pitaniya/bakaleya/maslo-rastitelnoe-uksus-ketchupy-gorchitsa-khren-soevye-sousy/?PAGEN_1=2&btn_load=Y&ajax_get=Y&AJAX_REQUEST=Y&bitrix_include_areas=N>

Как говорится, ухх ты!
Да, используя Scrapy в стандартных настройках можно поиметь различные палки в колёса, всё же проект с открытым кодом, и исповедует принципы белого парсинга, если сайт в robots.txt просит не ходить по отдельно взятым ссылкам, значит ходить туда и не надо.
Легко решается через settings.py, ключ ROBOTSTXT_OBEY.

Дальше:

pages_count = 4
for i in range (1, pages_count):
    print(i, end=', ') # 1, 2, 3,

Зачем нужна первая, если она уже загружена?
В принципе блок с pages_count лишний, достаточно кликать на стрелочку, а когда её не будет, цикл закончится. Собственно именно так вы и делаете с next_page, там селектор правильный, но if next_page is not None: — оксюморон. Достаточно if next_page:. Да и длинная ссылка, которая уходит за экран в вопросе совершенно не нужна, блока с urljoin вполне достаточно.

И всё равно это всё дело не заработает, стоит посмотреть в сторону CrawlSpider и, если есть желание поработать с длинными AJAX ссылками, поизучать как работать с AJAX в Scrapy.