You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

每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接口,可靠获取实时数据。

  1. 安装依赖:
pip install yfinance
  1. 示例代码:
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执行完成后再抓取数据。

  1. 安装依赖:
pip install selenium

需要提前下载对应浏览器的驱动(如ChromeDriver),确保驱动版本与浏览器版本匹配。

  1. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:27:47