#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-> заголовки. Спасибо! 🙂