如何在不使用Selenium的情况下用Python从印度NSE网站下载CSV文件
如何在不使用Selenium的情况下用Python从印度NSE网站下载CSV文件
嘿,我之前也踩过NSE这个坑!它的网页确实不会直接给你明晃晃的CSV下载链接,因为数据都是通过后端API动态加载的,但完全不用Selenium就能搞定,用requests和pandas(或者纯csv模块)就行,我给你一步步说:
核心思路
NSE的「Most Active Underlying」数据其实是通过API接口返回的,我们只需要找到这个接口,模拟浏览器请求获取数据,再转成CSV文件就行——关键是要带上正确的请求头,不然NSE会直接拒绝你的访问。
具体步骤和代码
先装需要的库
如果你还没装requests和pandas,先在终端里跑一下安装命令:pip install requests pandas模拟浏览器请求头
NSE的服务器会检查请求是否来自真实浏览器,所以必须带上User-Agent这些关键头,不然会返回403错误。我给你一个通用的头配置,你也可以换成自己浏览器的User-Agent: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', 'Accept-Language': 'en-US,en;q=0.9', 'Accept-Encoding': 'gzip, deflate, br' }方法一:从JSON数据转CSV
大部分情况下,NSE的API返回的是JSON格式数据,我们可以用pandas轻松把它转成CSV:import requests import pandas as pd # 这是我最近测试有效的API接口,要是以后NSE更新了,你自己找新的就行 api_url = "https://www.nseindia.com/api/most-active?symbol=equity" # 发送请求 response = requests.get(api_url, headers=headers) # 先检查请求是否成功 if response.status_code == 200: # 解析返回的JSON数据 data = response.json() # NSE的JSON里,表格数据一般存在'data'字段下,直接转成DataFrame df = pd.DataFrame(data['data']) # 保存成CSV文件,index=False是去掉自动生成的索引列 df.to_csv('nse_most_active.csv', index=False) print("CSV文件已经成功保存到当前目录啦!") else: print(f"哎呀,请求失败了,状态码是:{response.status_code}")方法二:直接下载CSV格式的响应
有时候NSE的API支持直接返回CSV,只需要在接口地址后面加个&csv=true参数,就能省掉转格式的步骤:import requests api_url = "https://www.nseindia.com/api/most-active?symbol=equity&csv=true" response = requests.get(api_url, headers=headers) if response.status_code == 200: # 直接把响应的二进制内容写入文件 with open('nse_most_active.csv', 'wb') as csv_file: csv_file.write(response.content) print("CSV文件下载完成!") else: print(f"请求出错,状态码:{response.status_code}")
几个重要提醒
- API可能会不定期更新:如果上面的接口突然不能用了,你自己用浏览器开发者工具找新的就行:按F12打开工具→切换到「Network」标签→选「XHR」分类→刷新页面,找和数据相关的请求,它的「Request URL」就是新的API地址。
- 别频繁发送请求:短时间内发太多请求会被NSE封IP,最好每次请求后加个延迟,比如
import time; time.sleep(2)。 - 灵活调整JSON解析路径:如果解析JSON时报错,打开响应的JSON内容看看结构,可能数据存在
rows或者其他字段下,调整一下提取路径就行。
内容来源于stack exchange




