使用BeautifulSoup爬取Coinmarketcap比特币历史数据返回空DataFrame求助
问题排查与修复方案
核心问题梳理
- 反爬拦截:未携带请求头的
requests请求会被平台识别为爬虫,返回的页面无有效表格数据 - 参数缺失:默认请求仅返回最近3个月数据,未指定2021年的时间范围参数
- 代码逻辑错误:
- 未过滤表头行,表头
tr内只有th标签无td,直接取索引会报错,导致最终无有效数据 - 行数据存储逻辑错误,不应将全量字段列表每次塞入结果集,只需存储当前行的对应字段值
- 未过滤表头行,表头
修复后代码
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
相关产品推荐
相关产品推荐

