You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在不使用Selenium的情况下用Python从印度NSE网站下载CSV文件

如何在不使用Selenium的情况下用Python从印度NSE网站下载CSV文件

嘿,我之前也踩过NSE这个坑!它的网页确实不会直接给你明晃晃的CSV下载链接,因为数据都是通过后端API动态加载的,但完全不用Selenium就能搞定,用requestspandas(或者纯csv模块)就行,我给你一步步说:

核心思路

NSE的「Most Active Underlying」数据其实是通过API接口返回的,我们只需要找到这个接口,模拟浏览器请求获取数据,再转成CSV文件就行——关键是要带上正确的请求头,不然NSE会直接拒绝你的访问。

具体步骤和代码

  1. 先装需要的库
    如果你还没装requestspandas,先在终端里跑一下安装命令:

    pip install requests pandas
    
  2. 模拟浏览器请求头
    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'
    }
    
  3. 方法一:从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}")
    
  4. 方法二:直接下载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

火山引擎 最新活动