Как я могу взять данные со всех страниц? - PullRequest
0 голосов
/ 13 февраля 2020

это первый раз, когда я использую Scrapy Framework для python.

. Итак, я создал этот код.

# -*- coding: utf-8 -*-
import scrapy


class SpiderSpider(scrapy.Spider):
    name = 'spider'
    start_urls = [
        'https://www.emag.ro/televizoare/c'
    ]

    def parse(self, response):
        for i in response.xpath('//div[@class="card-section-wrapper js-section-wrapper"]'):
            yield {
                'product-name': i.xpath('.//a[@class="product-title js-product-url"]/text()')
                                .extract_first().replace('\n','')
            }

        next_page_url = response.xpath('//a[@class="js-change-page"]/@href').extract_first()
        if next_page_url is not None:
            yield scrapy.Request(response.urljoin(next_page_url))

, когда я смотрю на веб-сайт, который имеет более 800 товаров. но мой сценарий занимает только первые 2 страницы почти 200 продуктов ...

Я пытался использовать css селектор и xpath, оба одинаковые ошибки.

Может кто-нибудь выяснить, где находится проблема?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Я наконец выясняю, как это сделать.

# -*- coding: utf-8 -*-
import scrapy
from ..items import ScraperItem


class SpiderSpider(scrapy.Spider):
    name = 'spider'
    page_number = 2
    start_urls = [
        'https://www.emag.ro/televizoare/c'
    ]

    def parse(self, response):

        items = ScraperItem()

        for i in response.xpath('//div[@class="card-section-wrapper js-section-wrapper"]'):

            product_name = i.xpath('.//a[@class="product-title js-product-url"]/text()').extract_first().replace('\n                        ','').replace('\n                    ','')

            items["product_name"] = product_name

            yield items

            next_page = 'https://www.emag.ro/televizoare/p' + str(SpiderSpider.page_number) + '/c'

            if SpiderSpider.page_number <= 28:
                SpiderSpider.page_number += 1
                yield response.follow(next_page, callback = self.parse)
0 голосов
/ 13 февраля 2020

Сайт, который вы пытаетесь сканировать, получает данные из API. Когда вы нажимаете на ссылку нумерации страниц, он отправляет ajax запрос в API, чтобы получить больше продуктов и показать их на странице.

Поскольку

Scrapy не моделирует браузер сама среда.

Таким образом, вы можете

  1. проанализировать запрос на вкладке сети браузера для проверки конечной точки и параметров

  2. Создайте аналогичный запрос самостоятельно в scrapy

  3. Позвоните этой конечной точке с соответствующими аргументами, чтобы получить продукты из API.

Также вам нужно извлечь следующую страницу из ответа json, полученного из API. Обычно существует ключ с именем pagination, который содержит информацию, относящуюся к общему количеству страниц, следующая страница и т. Д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...