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

使用BeautifulSoup爬取Coinmarketcap比特币历史数据返回空DataFrame求助

问题排查与修复方案

核心问题梳理

  • 反爬拦截:未携带请求头的requests请求会被平台识别为爬虫,返回的页面无有效表格数据
  • 参数缺失:默认请求仅返回最近3个月数据,未指定2021年的时间范围参数
  • 代码逻辑错误:
    1. 未过滤表头行,表头tr内只有th标签无td,直接取索引会报错,导致最终无有效数据
    2. 行数据存储逻辑错误,不应将全量字段列表每次塞入结果集,只需存储当前行的对应字段值

修复后代码

from bs4 import BeautifulSoup
import requests
import pandas as pd

# 配置请求头,模拟浏览器访问
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
# 拼接时间范围参数:start对应2021-01-01 00:00:00的毫秒级时间戳,end对应2021-09-30 00:00:00的毫秒级时间戳
website = 'https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=1609459200000&end=1633017600000'

r = requests.get(website, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')

tr_list = soup.find_all('tr')
FullData = []
# 遍历行时跳过表头(第一行是表头,所以从索引1开始)
for item in tr_list[1:]:
    td_list = item.find_all('td')
    # 过滤空行、广告行等无效行
    if len(td_list) < 6:
        continue
    date = td_list[0].text.strip()
    high = td_list[2].text.strip()
    low = td_list[3].text.strip()
    close = td_list[4].text.strip()
    volume = td_list[5].text.strip()
    FullData.append([close, volume, date, high, low])

df_columns = ["close", "volume", "date", "high", "low"]
df = pd.DataFrame(FullData, columns=df_columns)
print(df)
# 导出csv直接调用df.to_csv("btc_data.csv", index=False, encoding="utf_8_sig")即可

补充说明

如果运行后仍出现少量数据缺失,可在requests.get时增加timeout=10参数避免请求超时,多次刷新请求即可拉取到完整数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:24:03