如何使用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
相关产品推荐
相关产品推荐

