Scrapy: как извлечь данные со страницы, которая загружает их через ajax? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь извлечь данные из результата поиска, который частично построен с помощью ajax:

https://www.vitalsana.com/catalogsearch/result/?q=ibuprofen

Требуемые данные PZN: 16336937 каким-то образом введено после загрузки страницы:

xpath возвращает пустой результат:

//[@id="maincontent"]/div[3]/div[1]/div[2]/div[4]/ol/li[1]/form/div/div[2]/p[2]/span[2]/span

Sanme переходит к данным verfügbar. Я думаю, он загружается после загрузки страницы через этот API: https://www.vitalsana.com/catalogsearch/searchTermsLog/save/?q=ibuprofen

Я заметил, что некоторая информация находится внутри JS, но получить только это JS сложно. Я пробовал последний раз, но, похоже, это проигнорировали. Он получает все JS, включая желаемую информацию:

response.xpath('//script[last()]/text()').extract()

Я использую scrapy 2.1.0. Есть ли способ получить эти данные?

1 Ответ

0 голосов
/ 30 мая 2020

PZN: 16336937 отсутствует в результатах поиска (витамин D3! = Ибупрофен).

Чтобы получить номер PZN продукта (8 цифр), вы можете извлечь его из элемента img каждого товар. Например, для первого результата поиска ([1]):

response.xpath('substring(substring-before((//img[@class="product-image-photo img-fluid"])[1]/@src,"_"),string-length(substring-before((//img[@class="product-image-photo img-fluid"])[1]/@src,"_"))-7,8)').extract()

Вывод: 07728561

Вы также можете извлечь значение непосредственно из элемента скрипта, но вы нужно выяснить, как избежать одинарных кавычек в scrapy. XPath:

substring-after(substring-before(//script[contains(.,"Suche")],'",'),'"id": "')

Вывод: 07728561

Примечание: использование регулярных выражений вместо функций подстроки может быть более чистым.

Вы также можете попробовать «перестроить "json из элемента скрипта, загрузите json, затем запросите его. Примерно так должно работать:

import json

products = response.xpath('substring(substring-after(//script[contains(.,"Suche")],"] ="),1,string-length(substring-after(//script[contains(.,"Suche")],"] ="))-1)').extract()

result = json.loads(products)
for i in result:
    print i['id']

Последний вариант: запросить данные напрямую из API (с правильно сформированной полезной нагрузкой, действительным токеном и подходящим методом).

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