данные сайта не заполняются как браузер, несмотря на рендеринг с html -запросами - PullRequest
0 голосов
/ 05 августа 2020

Я экспериментирую с html-requests на разных сайтах, и у меня возникли проблемы с извлечением цены акции на этом конкретном сайте:

https://www.morningstar.com/stocks/xnys/BABA/quote

Я использую html -запросы и использую html.render для рендеринга javascript. Несмотря на это, данные, похоже, не заполняются, поскольку они находятся в браузере.

from requests_html import HTMLSession
import requests_html
from bs4 import BeautifulSoup as bs


user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
requests_html.DEFAULT_USER_AGENT = user_agent



def get_request(ticker):
    
    session = HTMLSession()
    print(url)
    res = session.get(url)
    try:
        res.raise_for_status()
    except ValueError as e:
        raise('Dead link')

    return res


def mstar():
    
    url = 'https://www.morningstar.com/stocks/xnys/BABA/quote'
    
    res = get_requesturl)
    res.html.render()
    
    price = res.html.find('div#message-box-price.message-partial.fill.up')[0].text
    print(price)

    price = res.html.find('div.message-partial.fill.up')[0].text
    print(price)
    
    change = res.html.find('div#message-box-percentage')[0].text
    print(change)

Ожидаемый результат:

262.20
4.26 | 1.65%

Однако либо я просто символы возврата: - или %, но без фактических цен.

Есть предложения? Спасибо.

1 Ответ

1 голос
/ 05 августа 2020

Данные генерируются API JSON, а затем динамически вставляются на веб-сайт через JavaScript, поэтому python requests не может их видеть. Вы можете проверить это самостоятельно, выполнив curl https://www.morningstar.com/stocks/xnys/baba/quote и попытавшись найти на нем 1.65% - его там нет просто потому, что его нет в источнике HTML.

Я бы предложил используйте вместо него selenium и проанализируйте данные следующим образом:

elements = driver.find_element(By.ID, "div")
for element in elements:
    print element.text
    print element.get_attribute('message-box-price.message-partial.fill.up')
...