Scrapy response. css имеет пустой список - PullRequest
0 голосов
/ 30 апреля 2020

Нужно получить название продукта и цену с этой страницы https://www.lazada.com.my/shop-smart-tvs/

Начато с

scrapy shell "https://www.lazada.com.my/shop-smart-tvs/ "

Вывод, который я получил, был следующим. ответ <200 <a href="https://www.lazada.com.my/shop-smart-tvs/" rel="nofollow noreferrer">https://www.lazada.com.my/shop-smart-tvs/>

Я также использовал прокси и пользовательские агенты, чтобы убедиться, что не было никаких блоков.

Но когда я использовал

ответ. css (". C13VH6, .c16H9d a"). css (':: text'). Extract () и ответ. css ( ".c16H9d a :: attr (title)"). extract ()

Я получаю пустые списки [] Пробовал такой же подход с другим сайтом, это работает.

PS Я использовал виджет селектора Chrome CSS, чтобы получить селекторы CSS.

Скажите, пожалуйста, где я ошибся.

1 Ответ

0 голосов
/ 30 апреля 2020

Данные, вероятно, загружаются динамически, поэтому вам придется визуализировать страницу с чем-то вроде Spla sh или Selenium, чтобы ваше CSS выражение работало.

Когда вы go переходите на страницу источник, вы можете видеть, что данные о продукте присутствуют в большом json -файле, поэтому я просто загрузил бы json в виде python словаря и получил оттуда нужные данные:

import scrapy
import json


class LazadaSpider(scrapy.Spider):
    name = 'lazada'
    allowed_domains = ['lazada.com']
    start_urls = ['https://www.lazada.com.my/shop-smart-tvs/']

    def parse(self, response):
        script = response.xpath(
            "//script[starts-with(text(), 'window.pageData')]/text()"
        ).extract_first()
        first = script.index('{')
        last = len(script)
        products = json.loads(script[first:last])
        items = products['mods']['listItems']
        for item in items:
            name = item['name']
            price = item['price']
            yield {'name': name,
                   'price': price}

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