如何将requests下载的NSE CSV文件转换为Pandas DataFrame?
解决NSE印度证券交易所CSV数据转Pandas DataFrame的问题
核心实现步骤
- 确认请求返回有效CSV内容
- 将CSV字符串/字节流转为Pandas可读取的格式
完整代码示例
import pandas as pd from io import StringIO import requests # 替换为你从开发者工具复制的完整请求头 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', 'Accept': 'text/csv,application/json,text/plain,*/*', 'Referer': 'https://www.nseindia.com/get-quotes/equity?symbol=ASIANPAINT', # 补充其他必要请求头(如Cookie、X-Requested-With等,从开发者工具复制) } # ASIANPAINT历史数据CSV接口URL(可自行调整日期范围) url = "https://www.nseindia.com/api/csv/historical/cm/equity?symbol=ASIANPAINT&series=[%22EQ%22]&from=01-01-2023&to=31-12-2023" # 发起请求 response = requests.get(url, headers=headers) response.encoding = 'utf-8' # 强制指定编码,避免乱码 # 转换为DataFrame if response.status_code == 200: # 用StringIO将CSV文本转为可读取的文件对象 csv_buffer = StringIO(response.text) # 若CSV开头有冗余说明行,添加skiprows参数跳过(例如skiprows=2) df = pd.read_csv(csv_buffer) print(df.head()) else: print(f"请求失败,状态码:{response.status_code}") print("检查请求头是否完整,尤其是User-Agent、Referer和Cookie参数")
常见问题处理
- 乱码问题:强制设置
response.encoding='utf-8'或utf-8-sig,确保编码匹配NSE返回的CSV格式 - CSV格式异常:打印
response.text前10行,确认是否为有效CSV。若有冗余说明行,调整skiprows=N参数跳过对应行数 - 请求被拦截:确保请求头完全复制开发者工具中的内容,尤其是Cookie和
X-Requested-With这类反爬参数
内容的提问来源于stack exchange,提问作者shantanu
相关产品推荐
相关产品推荐

