URL浏览器可正常访问 但Python requests/urllib/webdriver请求超时
问题成因
NSE(印度国家证券交易所)的接口配置了反爬规则,直接发起API请求会被服务端拦截:拦截后服务端不会返回4xx/5xx错误码,只会挂起TCP连接不返回响应内容,最终表现就是不设置超时参数时请求会一直处于加载状态。
这类拦截的核心校验逻辑有两点:
- 请求携带的
User-Agent不能是Python类库默认的爬虫标识 - 请求会话必须有前置访问NSE站点的Cookie记录,模拟真实用户从页面跳转请求API的路径
可用实现代码
requests 版本
import requests # 初始化会话自动维护Cookie s = requests.Session() # 配置和普通浏览器一致的基础请求头 s.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "Accept": "application/json, text/plain, */*", "Referer": "https://www.nseindia.com/option-chain" }) # 先访问期权链页面,获取服务端下发的合法Cookie s.get("https://www.nseindia.com/option-chain", timeout=10) # 再请求目标API接口 resp = s.get("https://www.nseindia.com/api/option-chain-indices?symbol=BANKNIFTY", timeout=10) resp.raise_for_status() data = resp.json() print(data)
urllib 版本
import urllib.request import json import http.cookiejar # 初始化Cookie处理器维持会话状态 cookie_jar = http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie_jar)) # 配置请求头 opener.addheaders = [ ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"), ("Accept", "application/json, text/plain, */*"), ("Referer", "https://www.nseindia.com/option-chain") ] # 先访问页面获取合法Cookie opener.open("https://www.nseindia.com/option-chain", timeout=10) # 请求目标API with opener.open("https://www.nseindia.com/api/option-chain-indices?symbol=BANKNIFTY", timeout=10) as resp: data = json.loads(resp.read().decode()) print(data)
注意事项
- 必须先访问站点页面拿Cookie,不能直接请求API地址,这是之前方案失效的核心原因
- 所有请求建议设置10秒左右的超时时间,避免网络异常导致程序永久卡死
- 如果请求仍然失败,可以在请求头中补加和自己浏览器一致的
Accept-Language参数,不要随意添加br压缩相关的编码配置,避免解压失败 - 短时间内不要高频请求接口,否则会被IP封禁
内容的提问来源于stack exchange,提问作者Dileep Kumar
相关产品推荐
相关产品推荐

