You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在不使用Yahoo API的情况下用Python动态获取Yahoo Finance实时股价

嘿,我之前也踩过这个坑!Yahoo Finance的实时成交价是通过JavaScript动态加载的,BeautifulSoup只能抓取页面初始HTML里的静态内容,自然拿不到这些动态生成的数据。给你两个靠谱的解决方案,亲测有效:

方法1:直接调用Yahoo的隐藏API(推荐)

这个方法最高效,不需要模拟浏览器,直接请求Yahoo内部用的API接口,返回JSON格式的数据,解析起来很方便。Yahoo其实有个未公开的报价接口,我们可以直接用它来获取实时成交价:

import requests

def get_real_time_price(symbol):
    # Yahoo Finance的报价API端点
    url = "https://query1.finance.yahoo.com/v7/finance/quote"
    # 请求参数,symbols是你要查询的股票代码,比如AAPL、GOOGL
    params = {
        "symbols": symbol,
        "region": "US",
        "lang": "en-US"
    }
    # 加上User-Agent伪装成浏览器请求,避免被拦截
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    
    response = requests.get(url, params=params, headers=headers)
    data = response.json()
    
    # 解析返回的JSON数据,提取实时成交价
    if data["quoteResponse"]["result"]:
        return data["quoteResponse"]["result"][0]["regularMarketPrice"]
    else:
        return None

# 使用示例:查询苹果公司的实时成交价
print(get_real_time_price("AAPL"))

这个方法的优势是速度快、资源占用低,不需要额外安装浏览器驱动,适合批量查询。

方法2:用Selenium渲染动态页面

如果上面的API哪天失效了,或者你需要抓取更多动态渲染的页面内容,可以用Selenium模拟浏览器加载整个页面,这样就能获取到JS生成后的实时价格:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time

def get_real_time_price_selenium(symbol):
    # 配置Chrome的无头模式(不显示浏览器窗口)
    chrome_options = Options()
    chrome_options.add_argument("--headless=new")
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
    
    # 初始化浏览器驱动(需要提前安装对应版本的ChromeDriver)
    driver = webdriver.Chrome(options=chrome_options)
    driver.get(f"https://finance.yahoo.com/quote/{symbol}")
    
    # 等待页面加载完成(可以根据网络情况调整等待时间)
    time.sleep(2)
    
    try:
        # 通过CSS选择器定位实时价格元素
        price_element = driver.find_element(By.CSS_SELECTOR, "fin-streamer[data-field='regularMarketPrice']")
        return price_element.text
    except Exception as e:
        print(f"获取价格失败: {str(e)}")
        return None
    finally:
        # 关闭浏览器
        driver.quit()

# 使用示例:查询谷歌的实时成交价
print(get_real_time_price_selenium("GOOGL"))

这个方法的缺点是速度较慢、资源占用高,但胜在稳定,只要页面结构变化不大就能正常工作。

注意事项

  • 不管用哪种方法,都要带上合理的User-Agent请求头,避免被Yahoo的反爬机制拦截
  • 不要频繁发送请求,建议给请求加个1-2秒的时间间隔,防止IP被封禁
  • Yahoo的页面结构或API端点可能会不定期更新,要是突然失效了,记得检查一下接口参数或CSS选择器有没有变化

内容的提问来源于stack exchange,提问作者Stanley Sing Fai Li

火山引擎 最新活动