Получить стоимость акций от Morningstar / BeautifulSoup - PullRequest
0 голосов
/ 03 февраля 2019

так и происходит.Наконец, я должен задать свой первый вопрос о Stackoverflow.

Я пытаюсь получить текущую цену акции от 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 ]

0 голосов
/ 04 февраля 2019

Как @ 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 более эффективно, потому что тикеры часто меняются, и в автоматическом процессе многие запросы не выполняются.)

0 голосов
/ 03 февраля 2019

Страница динамическая.Вы можете использовать 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
...