每5秒抓取Yahoo Finance实时股票数据的技术求助
问题描述
尝试每5秒从Yahoo Finance抓取某只股票的价格,但无法获取最新实时价格,仅能拿到开盘价和收盘价。推测问题在于抓取的是动态变化的数据,求解决方案。
用户当前使用的代码:
import requests from bs4 import BeautifulSoup #Which Symbol are you searching #t_symbol = input("What stock are you searching?") def getData(t_symbol): url = f'https://finance.yahoo.com/quote/{t_symbol}'+f'?p={t_symbol}&.tsrc=fin-srch' r = requests.get(url) soup = BeautifulSoup(r.text, 'html.parser') price = soup.find('fin-streamer', {'class':'Fw(b) Fz(36px) Mb(-4px) D(ib)'}).get('value') print(price) #webbrowser.open(url) return price getData('NIO')
解决方案
方案1:使用yfinance库调用官方API
requests+BeautifulSoup只能获取页面初始加载的静态数据,实时价格是前端通过JS动态拉取的。使用第三方库yfinance可以直接调用Yahoo Finance的API接口,可靠获取实时数据。
- 安装依赖:
pip install yfinance
- 示例代码:
import yfinance as yf import time def get_real_time_price(t_symbol): stock = yf.Ticker(t_symbol) # 提取实时价格 real_time_price = stock.info['currentPrice'] print(f"{t_symbol} 实时价格: {real_time_price}") return real_time_price # 每5秒执行一次抓取 while True: get_real_time_price('NIO') time.sleep(5)
方案2:用Selenium渲染动态页面
如果不想依赖第三方库,可以用Selenium模拟浏览器加载页面,等待JS执行完成后再抓取数据。
- 安装依赖:
pip install selenium
需要提前下载对应浏览器的驱动(如ChromeDriver),确保驱动版本与浏览器版本匹配。
- 示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def get_real_time_price(t_symbol): url = f'https://finance.yahoo.com/quote/{t_symbol}?p={t_symbol}&.tsrc=fin-srch' # 初始化Chrome浏览器(需提前配置好ChromeDriver路径) driver = webdriver.Chrome() driver.get(url) try: # 等待目标元素加载完成,最长等待10秒 price_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'fin-streamer[class="Fw(b) Fz(36px) Mb(-4px) D(ib)"]')) ) real_time_price = price_element.get_attribute('value') print(f"{t_symbol} 实时价格: {real_time_price}") return real_time_price finally: driver.quit() # 每5秒执行一次抓取 while True: get_real_time_price('NIO') time.sleep(5)
注意事项
- 频繁抓取可能触发Yahoo的反爬机制,建议适当调整抓取间隔,避免短时间内大量请求。
yfinance为第三方维护库,若Yahoo API有变动,可能需要更新库版本适配。- 使用Selenium时,可开启无头模式(
options.add_argument('--headless=new'))减少资源占用。
内容的提问来源于stack exchange,提问作者automatedbb99
相关产品推荐
相关产品推荐

