Сбор данных из интерактивного графика с веб-сайта

#python #selenium #web-scraping #beautifulsoup

#python #селен #извлечение веб-страниц #beautifulsoup

Вопрос:

Я пытаюсь получить доступ к данным из графика с указанного ниже веб-сайта https://www.prisjakt.nu/produkt.php?pu=5183925

Я могу получить доступ и извлечь данные из таблицы под графиком. Но я не могу извлечь данные из графика, который вызывается динамически с помощью javascript? Я знал, что здесь недостаточно использовать beautifulsoup api. Я попытался обойти консоль веб-страницы, чтобы просмотреть содержимое графика, но мне это не удалось.

Я также попытался заглянуть в view-source:https://www.prisjakt.nu/produkt.php?pu=5183925 как это вызывается.

 <div class="graph" data-testid="graph" data-test="PriceHistoryGraph">
 

Я пытаюсь распечатать историю цен на товар с веб-сайта. Например, что-то похожее на приведенный ниже фрагмент текста в формате json, который я нашел в разделе «просмотр источника».

 "nodes":[{"date":"2019-09-10","lowestPrice":13195},{"date":"2019-09-11","lowestPrice":12990},{"date":"2019-09-12","lowestPrice":12990},
 

Я подозреваю, что вышеуказанные данные можно найти по адресу

 <rect class = "vx-bar" ...... where data="[Object Object][Object Object][Object Object]..." 
 

представляет собой список массивов с двумя элементами в каждом массиве. Что-то похожее на приведенный выше фрагмент «узлы». Не так ли?

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

 my_url = 'https://www.prisjakt.nu/produkt.php?pu=5183925'
driver.get(my_url)
sleep(3)

page = requests.get(my_url, headers=headers)
soup = soup(page.content, 'html.parser')
data = soup.findAll(id="statistics")
print(data)
 

Мне помогут любые предложения с примером или решением. Заранее спасибо!

Ответ №1:

Вы правы, график строится динамически, но вы можете легко получить эти данные.

Вот как:

 import requests

response = requests.get('https://www.prisjakt.nu/_internal/graphql?release=2020-11-20T07:33:45Z|db08e4bcamp;version=6f2bf5amp;main=productamp;variables={"id":5183925,"offset":0,"section":"statistics","statisticsTime":"1970-01-02","marketCode":"se","personalizationExcludeCategories":[],"userActions":true,"badges":true,"media":true,"campaign":true,"relatedProducts":true,"campaignDeals":true,"priceHistory":true,"recommendations":true,"campaignId":2,"personalizationClientId":"","pulseEnvironmentId":"sdrn:schibsted:environment:undefined"}').json()


for node in response["data"]["product"]["statistics"]["nodes"]:
    print(f"{node['date']} - {node['lowestPrice']}")
 

Вывод:

 2019-09-10 - 13195
2019-09-11 - 12990
2019-09-12 - 12990
2019-09-13 - 12605
2019-09-14 - 12605
2019-09-15 - 12605
2019-09-16 - 12970
2019-09-17 - 12970
2019-09-18 - 12970
2019-09-19 - 12969
2019-09-20 - 12969
2019-09-21 - 12969
2019-09-22 - 12969
2019-09-23 - 9195
2019-09-24 - 12970
and so on...
 

Комментарии:

1. Вау, ты супер быстрый. Я действительно рад, что, будучи новичком, я посмотрел на правильные места. Но я не знал техники доступа и извлечения для формата json. Теперь я знаю, что мне интересно, как вы нашли URL-адрес, который вы использовали в переменной ‘response’?

2. Совет профессионала: научитесь использовать инструмент разработчика вашего браузера. Я нашел ссылку на запрос в инструменте разработчика -> Сеть -> вкладка XHR.

3. Я нашел это в инструменте разработчика -> Сеть -> вкладка XHR-> заголовки. Спасибо! 🙂