#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())