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

使用Python requests下载NSE股票数据陷入无限循环如何解决

问题排查与解决方法

核心原因

NSE官网对API请求设置了反爬校验,直接用requests发起请求时,缺少浏览器的特征请求头、cookies信息,服务器不会返回正常数据,甚至会触发无限重定向或者无响应,再加上原代码未设置超时、未限制重定向次数,就会出现程序卡住的情况。

排查步骤

  • 先打印请求的响应状态码和响应头,确认是否出现3xx重定向、4xx/5xx错误:在requests.get之后加一行print(r.status_code, r.headers),先判断返回的状态是否为200,是否存在location字段说明需要重定向
  • 禁用默认的自动重定向,排查重定向逻辑:给requests.get加参数allow_redirects=False,如果返回302/307状态码,说明请求被跳转,默认requests无限制允许重定向就会陷入循环
  • 对比浏览器发起该API请求的请求头:打开浏览器F12开发者工具,切换到网络标签,找到对应API请求,复制User-Agent、Referer、Accept等请求头,加到requests的请求参数里

修复后的代码示例

import requests
from requests.exceptions import HTTPError, TooManyRedirects

# 屏蔽verify=False带来的SSL警告
requests.packages.urllib3.disable_warnings()

def download_url(url, save_path, chunk_size=1024):
    # 模拟浏览器的请求头,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",
        "Referer": "https://www.nseindia.com/market-data/live-equity-market?symbol=NIFTY%2050",
        "Accept": "text/csv,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"
    }
    # 配置会话,设置最大重定向次数为5次,避免无限循环
    session = requests.Session()
    session.max_redirects = 5
    try:
        # 加15秒超时参数,无响应就抛出异常避免卡住
        r = session.get(url, stream=True, verify=False, headers=headers, timeout=15, allow_redirects=True)
        r.raise_for_status()
    except TooManyRedirects:
        print("重定向次数超过上限,请检查请求头是否正确")
        return
    except HTTPError as http_err:
        print(f'访问URL出现HTTP错误: {http_err}')
        return
    except Exception as err:
        print(f'访问URL出现其他错误: {err}')
        return
    else:
        with open(save_path, 'wb') as fd:
            for chunk in r.iter_content(chunk_size=chunk_size):
                # 过滤keep-alive产生的空chunk
                if chunk:
                    fd.write(chunk)

# 调用示例
if __name__ == "__main__":
    target_url = "https://www.nseindia.com/api/equity-stockIndices?csv=true&index=SECURITIES%20IN%20F%26O"
    save_path = "./nse_fno_securities.csv"
    download_url(target_url, save_path)

补充说明

如果修改请求头后依然请求失败,可以先通过session请求一次NSE官网主页拿到合法cookies,再发起API请求,部分反爬规则会校验cookies的来源合法性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:27:01