You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python从NSE获取数据遇阻:UDiFF格式切换后代码无响应求解

解决NSE数据下载请求无响应的问题

核心原因分析

NSE服务器现在会对未合规的请求静默挂起连接(既不返回错误也不触发超时),主要是因为请求缺少必要的浏览器模拟头信息,触发了基础反爬校验。

具体修复方案

1. 修复后的完整代码

import requests

csvfile = 'BhavCopy_NSE_CM_0_0_0_20240712_F_0000.csv.zip'

try:
    print(f'Downloading {csvfile} from NSE')
    url = 'https://nsearchives.nseindia.com/content/cm/BhavCopy_NSE_CM_0_0_0_20240712_F_0000.csv.zip'
    
    # 添加模拟浏览器的请求头,绕过反爬校验
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    }
    
    # 设置超时时间,避免无限等待
    response = requests.get(url, stream=True, headers=headers, timeout=30)
    # 强制检查响应状态码,非200直接抛出异常
    response.raise_for_status()
    
    # 将下载内容写入本地文件
    with open(csvfile, 'wb') as f:
        for chunk in response.iter_content(chunk_size=8192):
            f.write(chunk)
    print(f'Successfully downloaded {csvfile}')
except requests.exceptions.RequestException as e:
    print(f'Could not download {csvfile} from NSE: {str(e)}')

2. 关键修改说明

  • 添加请求头:模拟真实浏览器的请求标识,通过NSE的基础反爬校验
  • 设置超时时间:给请求加上30秒超时限制,避免程序无限挂起
  • 状态码校验:response.raise_for_status()会在请求失败(如403、404)时直接抛出异常,便于快速定位问题
  • 补充文件写入逻辑:原代码仅打印二进制片段,修复后直接将内容保存为本地文件

3. UDiFF格式适配提示

如果需要获取UDiFF格式的最新数据,注意NSE的文件路径和命名规则已更新,需使用对应API接口请求。请求时同样需要携带上述合规请求头,否则仍会出现无响应的情况。

内容的提问来源于stack exchange,提问作者Sunil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:34:51