Yahoo Finance BTC-USD日涨跌幅爬取异常:固定返回-661.20求助
问题排查:Yahoo Finance BTC-USD日涨跌幅爬取数值固定的问题
问题描述
尝试爬取Yahoo Finance上BTC-USD的日涨跌幅数值,运行代码后返回结果始终固定为-661.20,与网页实时显示数值不符。用户代码如下:
import requests, json from bs4 import BeautifulSoup btc_url = 'https://finance.yahoo.com/quote/BTC-USD' btc_page = requests.get(btc_url) btc_soup = BeautifulSoup(btc_page.content, 'html.parser') btc_change = btc_soup.find('div' , class_='D(ib) Mend(20px)').find('fin-streamer' ,class_ ='Fw(500) Pstart(8px) Fz(24px)').text print (btc_change)
原因分析
Yahoo Finance当前的行情数据采用JavaScript动态加载机制:直接用requests获取的是页面初始HTML,其中包含的是静态占位数据(或缓存的旧数据),并非实时更新的行情数值。实时数据是页面加载完成后通过AJAX请求从后端接口拉取的,因此静态解析HTML无法获取最新值。
解决方案
方案1:使用Selenium模拟浏览器加载动态内容
通过模拟浏览器完整渲染页面,等待JavaScript加载完成后再提取数据:
- 安装依赖:
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 driver = webdriver.Chrome() # 若驱动不在环境变量,需指定executable_path参数 driver.get('https://finance.yahoo.com/quote/BTC-USD') # 等待目标元素加载完成 wait = WebDriverWait(driver, 10) btc_change = wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, 'div.D(ib).Mend(20px) fin-streamer.Fw(500).Pstart(8px).Fz(24px)') )).text print(btc_change) driver.quit()
方案2:使用Yahoo Finance官方API封装库(推荐)
使用yfinance库直接调用官方接口,无需页面解析,更稳定高效:
- 安装依赖:
pip install yfinance
- 示例代码:
import yfinance as yf btc = yf.Ticker("BTC-USD") # 获取最新单日行情数据 hist = btc.history(period="1d") # 计算日涨跌幅数值 daily_change = hist['Close'].iloc[-1] - hist['Open'].iloc[-1] # 获取日涨跌幅百分比 daily_change_pct = btc.info['regularMarketChangePercent'] * 100 print(f"日涨跌幅数值: {daily_change:.2f}") print(f"日涨跌幅百分比: {daily_change_pct:.2f}%")
内容的提问来源于stack exchange,提问作者Uros76
相关产品推荐
相关产品推荐

