浏览器可正常访问NSE网站但Python requests请求返回401错误
问题成因
- NSE(印度国家证券交易所)官网配置了多层反爬校验规则,仅携带User-Agent的无状态裸请求会被直接拦截:
- 所有API接口请求必须携带首次访问官网主页时服务端下发的合法Cookie(核心校验字段为
nseappid),跳过前置访问步骤直接请求API,服务端会判定请求非法,返回401状态码与Resource not found页面 - 仅配置单个User-Agent字段不符合真实浏览器的请求特征,真实浏览器发起请求时会携带Accept、Referer等标准头字段,缺失这些字段会被反爬规则直接识别为爬虫流量
- 低版本requests库的TLS握手指纹和真实Chrome浏览器存在差异,即使请求头、Cookie配置正确,也可能被校验规则拦截
- 所有API接口请求必须携带首次访问官网主页时服务端下发的合法Cookie(核心校验字段为
解决方法
- 使用
requests.Session()创建会话对象,自动维护请求过程中产生的Cookie,不要直接调用无状态的requests.get()发起请求 - 补全真实浏览器会携带的基础请求头,至少要包含Referer(指向NSE站内对应页面)、Accept字段,不要只传User-Agent
- 严格按照浏览器真实访问路径发起请求:先访问NSE主页获取合法Cookie,再请求目标API接口
- 如果上述操作后仍被拦截,可以升级requests、urllib3到最新版本,或替换为
curl_cffi库模拟真实Chrome的TLS指纹绕过校验
可运行参考代码
import requests # 初始化会话,自动维护Cookie session = requests.Session() # 配置和真实浏览器一致的请求头 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': 'application/json, text/plain, */*', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Referer': 'https://www.nseindia.com/market-data/top-gainers-loosers' } # 先访问主页,获取服务端下发的合法Cookie session.get('https://www.nseindia.com', headers=headers, timeout=10) # 再请求目标API接口 api_url = 'https://www.nseindia.com/api/live-analysis-variations?index=gainers&type=NIFTY' response = session.get(api_url, headers=headers, timeout=10) print(response.status_code) # 接口返回JSON格式数据,可直接解析使用 print(response.json())
注意:请求时控制访问频率,高频请求会触发IP临时封禁规则,建议相邻请求间隔不短于2秒。
内容的提问来源于stack exchange,提问作者user18083011
相关产品推荐
相关产品推荐

