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

如何使用Requests和BeautifulSoup从Yahoo Finance抓取BTC交易量数据?

问题:如何用BeautifulSoup获取Yahoo Finance上BTC的交易量数据

我尝试用BeautifulSoup从Yahoo Finance获取BTC的交易量数据,目标页面为BTC-USD报价页。页面相关源码片段如下:

<tr class="Bxz(bb) Bdbw(1px) Bdbs(s) Bdc($seperatorColor) H(36px) ">
    <td class="C($primaryColor) W(51%)"><span>Volume</span></td>
    <td class="Ta(end) Fw(600) Lh(14px)" data-test="TD_VOLUME-value">
        <fin-streamer data-symbol="BTC-USD" data-field="regularMarketVolume" data-trend="none" data-pricehint="2" data-dfield="longFmt" value="12,728,260,608" active="">12,728,260,608</fin-streamer>
    </td>
</tr>

<tr class="Bxz(bb) Bdbw(1px) Bdbs(s) Bdc($seperatorColor) H(36px) ">
    <td class="C($primaryColor) W(51%)"><span>Volume (24hr)</span></td>
    <td class="Ta(end) Fw(600) Lh(14px)" data-test="TD_VOLUME_24HR-value">12.73B</td>
</tr>
<tr class="Bxz(bb) Bdbw(1px) Bdbs(s) Bdc($seperatorColor) H(36px) Bdbw(0)! ">
    <td class="C($primaryColor) W(51%)"><span>Volume (24hr) All Currencies</span></td>
    <td class="Ta(end) Fw(600) Lh(14px)" data-test="TD_VOLUME_24HR_ALLCURRENCY-value">12.73B</td>
</tr>

我编写的代码返回None:

url1v = "https://finance.yahoo.com/quote/BTC-USD"
page1v = requests.get(url1v)
html_page1v = BeautifulSoup(page1v.content, "html.parser")

btc_volume = html_page1v.find("span", {"class":"e3b14781 dde7f18a"})
print(btc_volume)

问题原因

你代码中指定的class="e3b14781 dde7f18a"不存在于目标页面的交易量相关元素中,导致无法匹配到内容。页面的交易量数据要么在带有特定data-test属性的<td>标签内,要么在<fin-streamer>标签中。

正确代码示例

方法1:通过data-test属性获取完整格式交易量

import requests
from bs4 import BeautifulSoup

url1v = "https://finance.yahoo.com/quote/BTC-USD"
# 添加请求头模拟浏览器,避免被反爬拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}
page1v = requests.get(url1v, headers=headers)
html_page1v = BeautifulSoup(page1v.content, "html.parser")

# 定位完整数值的Volume
volume_td = html_page1v.find("td", {"data-test": "TD_VOLUME-value"})
if volume_td:
    btc_volume = volume_td.find("fin-streamer").text
    print(f"BTC Volume: {btc_volume}")
else:
    print("未找到完整交易量数据")

方法2:获取24小时简化格式交易量

# 定位24小时交易量(12.73B格式)
volume_24h_td = html_page1v.find("td", {"data-test": "TD_VOLUME_24HR-value"})
if volume_24h_td:
    btc_volume_24h = volume_24h_td.text
    print(f"BTC 24小时交易量: {btc_volume_24h}")

方法3:直接通过<fin-streamer>的属性定位

# 直接通过data-field属性找到目标fin-streamer标签
streamer = html_page1v.find("fin-streamer", {"data-field": "regularMarketVolume"})
if streamer:
    btc_volume = streamer.text
    print(f"BTC Volume: {btc_volume}")

注意事项

  • Yahoo Finance的页面结构可能会随时间变动,若后续代码失效,需重新检查页面元素的属性或结构。
  • 频繁无请求头的访问可能会触发反爬机制,建议始终携带User-Agent请求头模拟浏览器访问。

内容的提问来源于stack exchange,提问作者Jackie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:35:22