使用pandas.read_csv从URL读取CSV文件时遇EmptyDataError错误
解决pandas直接读取MarketWatch动态CSV链接的EmptyDataError问题
问题核心在于网站会校验请求的User-Agent标识:直接用pd.read_csv()访问链接时,pandas默认的请求头不被网站识别,返回空内容或非CSV数据,触发EmptyDataError;而手动下载时浏览器会自动带上完整请求头,能拿到正确的CSV文件。
解决方案:用requests模拟浏览器请求获取数据后再读取
- 先安装
requests库(未安装的话执行):
pip install requests
- 核心代码实现:
import pandas as pd import requests from io import StringIO # 目标CSV链接 csv_url = "https://www.marketwatch.com/games/stackoverflowq/download?view=holdings&pub=4JwsLs_Gm4kj&isDownload=true" # 模拟浏览器请求头,关键是User-Agent字段 browser_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 发送请求获取CSV内容 response = requests.get(csv_url, headers=browser_headers) response.raise_for_status() # 请求失败时直接抛出异常 # 将返回文本转为pandas可读取的对象 df = pd.read_csv(StringIO(response.text)) # 验证结果 print(df.head())
批量处理优化
把读取逻辑封装成函数,方便批量处理多个链接:
def load_marketwatch_csv(url): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } resp = requests.get(url, headers=headers) resp.raise_for_status() return pd.read_csv(StringIO(resp.text)) # 批量处理示例 target_urls = [ "https://www.marketwatch.com/xxx/download?xxx", "https://www.marketwatch.com/yyy/download?yyy", # 添加更多需要处理的链接 ] # 批量读取所有CSV到DataFrame列表 dataframes = [load_marketwatch_csv(url) for url in target_urls]
内容的提问来源于stack exchange,提问作者Alpha_Ursae_Minoris
相关产品推荐
相关产品推荐

