Получение текущей цены акций (Yahoo) с помощью beautifulsoup

#python #python-3.x #web-scraping #beautifulsoup #stock

#python #python-3.x #очистка веб-страниц #beautifulsoup #акции

Вопрос:

У меня возникли проблемы с использованием beautiful soup (python3) для получения последней цены акций

введите описание изображения здесь

 import requests
from money import Money
from bs4 import BeautifulSoup 

response = requests.get("https://finance.yahoo.com/quote/VTI?p=VTI")
soup = BeautifulSoup(response.content, "lxml")
price = soup.find('span', attrs = {"data-reactid": "34"})
  

Это возвращает значение «None». Есть ли что-то, чего я не понимаю? Используя другую страницу, следующее сработало просто отлично:

 response = requests.get("https://finance.yahoo.com/lookup?s=VTI")
soup = BeautifulSoup(response.content,"lxml")
price = soup.find('td', attrs={"data-reactid": "59"})
  

К сожалению, эта страница поиска не всегда идеально соответствует первому результату (поиск VXUS возвращает vxus в качестве второго результата вместо этого), поэтому я надеюсь найти что-то, что работает стабильно, и я решил, что извлечение с фактической страницы будет работать лучше всего.

Какой был бы наилучший способ получить значение 141,28?

Ответ №1:

Цена указана и выбирается по классу (второй самый быстрый метод выбора после id)

 import requests
from bs4 import BeautifulSoup as bs

res = requests.get('https://finance.yahoo.com/quote/VXUS?p=VXUS')   # https://finance.yahoo.com/quote/VTI?p=VTI
soup = bs(res.content, 'lxml')
price = soup.select_one('.Trsdu(0.3s)').text
print(price)
  

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

1. В этом решении нет жестко заданного индекса, более того, оно чистое и лаконичное. Я полагаю, что это должно быть выбрано.

2. @QHarr — какова функция начального периода в '.Trsdu(0.3s)' ?

3. @JackFleeting Это селектор класса css

Ответ №2:

 import requests
from bs4 import BeautifulSoup 


response = requests.get("https://finance.yahoo.com/quote/VTI?p=VTI")
soup = BeautifulSoup(response.content, "lxml")

for stock in  soup.find_all('span', class_='Trsdu(0.3s) Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(b)'):
    print(stock.get_text())
  

Это вернет 141,28

Ответ №3:

 import requests
from bs4 import BeautifulSoup
import json

response = requests.get("https://finance.yahoo.com/quote/VTI?p=VTI")
soup = BeautifulSoup(response.content)
price = soup.findAll('script')
regularMarketPrice

a = price[-3].contents[0]

jjj = json.loads(a[111:-12])

jjj['context']['dispatcher']['stores']['StreamDataStore']['quoteData']['VTI']['regularMarketPrice']
  

это может вам помочь, сначала получите scriptdata, затем преобразуйте его в json, вы сможете найти нужные данные

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

1. метод @Robert Carlos более полезен, если вам просто нужна цена акций прямо сейчас

Ответ №4:

итак, это обходной путь, но поскольку это просто проект для развлечения, для получения правильного ответа (хотя я бы предпочел правильное, расширяемое решение) работает следующее

 response = requests.get("https://finance.yahoo.com/lookup/etf?s=vxus")
soup = BeautifulSoup(response.content,"lxml")
price = soup.select('table td')
print(price[2].text)
  

Ответ №5:

Вот решение, которое работает для меня, но элемент внутри class_ может измениться, если элементы веб-сайта будут обновлены, поэтому я бы скопировал и вставил самый актуальный элемент из проверки веб-сайта, если решение не удалось.

 import requests
from bs4 import BeautifulSoup as bs

res = requests.get('https://finance.yahoo.com/quote/SQQQ/')   
soup = bs(res.content, 'lxml')
for stock in soup.find_all('span', class_='Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)'):
    print(stock.get_text())