Получить стоимость акций от Morningstar / BeautifulSoup
Так и происходит. Наконец, я должен задать свой первый вопрос о Stackru.
Я пытаюсь узнать текущую цену акций Morningstar ( https://www.morningstar.com/stocks/xnas/tsla/quote.html) и для этого использую Beautifulsoup.
В HTML-коде есть уникальный идентификатор ("message-box-price"). Я хочу использовать это, чтобы получить Прайс после этого, но, к сожалению, я не могу найти решение. Было бы здорово, если кто-нибудь может мне помочь.
Мой код для получения сайта:
import bs4
import requests
res = requests.get('https://www.morningstar.com/stocks/xnas/tsla/quote.html')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'lxml')
Я перепробовал много разных методов, но я подумал, что это самые перспективные:
Номер 1:
price = soup.find(id='message-box-price')
price2 = price.find_next()
print(price2)
Номер 2:
price = soup.select("#message-box-price")
price2 = price.find_all_next()
print(price2)
Номер 3:
price = soup.find_all(id="message-box-price")
print(price)
Также я попробовал некоторые варианты этого и использовал.text, чтобы получить значения, например.
Ошибки были:
- AttributeError: у объекта 'NoneType' нет атрибута 'find_previous'
- AttributeError: у объекта 'list' нет атрибута 'text'
- TypeError: select () получил неожиданный аргумент ключевого слова 'attrs'
- Или я только что получил пустой список -> [ ]
2 ответа
Страница динамическая. Вы можете использовать Selenium, чтобы открыть страницу, дать ей визуализироваться и получить информацию:
import pandas as pd
import bs4
from selenium import webdriver
url = 'https://www.morningstar.com/stocks/xnas/tsla/quote.html'
browser = webdriver.Chrome()
browser.get(url)
html = browser.page_source
soup = bs4.BeautifulSoup(html,'html.parser')
price = soup.find('div', {'id':'message-box-price'})
price2 = price.text.strip()
print(price2)
browser.close()
Выход:
print(price2)
$312.21
Как @chitown88 и @rukh-ta, упомянутые в их ответах, чтобы получить эту цену, я должен использовать селен. В этом случае мне лучше использовать pyautogui, чтобы загрузить всю ценовую историю акций как CSV.
Мой код для этого выглядит так:
from selenium import webdriver
import time
import pyautogui
url = 'https://www.morningstar.com/stocks/xnas/tsla/quote.html'
browser = webdriver.Firefox()
browser.get(url)
time.sleep(7)
pyautogui.click(139, 833, button='left')
time.sleep(10)
pyautogui.click(973, 289, button='left')
time.sleep(2)
pyautogui.click(1649, 236, button='left')
time.sleep(1)
pyautogui.typewrite(['down'])
time.sleep(1)
pyautogui.typewrite(['enter'])
browser.close()
Если у кого-то есть более простой и / или более быстрый способ, пожалуйста, не стесняйтесь упоминать об этом.
(Кроме того, если вам интересно, почему я не использую другие API-интерфейсы для акций. Дело в том, что я делаю проект, в котором я использую биржевые тикеры вселенной Morningstar. По этой причине, чтобы получить цены также Morningstar более эффективен, потому что тикеры часто меняются, и в автоматизированном процессе многие запросы не выполняются.)