使用Python Requests访问NSE预开盘网站时请求超时问题排查
问题分析与解决
你的请求超时主要是因为NSE印度交易所的服务器会拦截非浏览器发起的请求,代码缺少模拟浏览器的关键请求头,且未设置超时机制。以下是具体问题和修复方案:
1. 错误的请求头设置
你设置的Content-Type: text完全不适用于GET请求(GET请求无请求体),反而会让服务器识别出这不是合法的浏览器请求。需要替换为符合浏览器标准的请求头,比如User-Agent、Accept等。
2. 缺少超时机制
未设置超时参数会导致请求无限等待,添加超时可以避免程序挂起。
3. Cookie管理(可选但推荐)
NSE部分页面需要验证会话Cookie,使用requests.Session()可自动管理Cookie,提升请求成功率。
修复后的代码
import requests url = 'https://www.nseindia.com/market-data/pre-open-market-cm-and-emerge-market' # 模拟MacOS Chrome浏览器的请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', } # 使用Session自动管理Cookie session = requests.Session() try: # 先请求主页获取必要Cookie session.get('https://www.nseindia.com', headers=headers, timeout=10) # 发起预开盘页面请求 response = session.get(url, headers=headers, timeout=10) response.raise_for_status() # 捕获HTTP错误状态码 print(response.text) except requests.exceptions.RequestException as e: print(f"请求出错: {e}")
关键说明
- User-Agent:必须设置,让服务器认为请求来自真实浏览器。
- 超时参数:
timeout=10表示10秒内无响应则终止请求。 - Session对象:自动保存和发送Cookie,避免被服务器拦截。
- 异常处理:捕获超时、HTTP错误等各类请求异常,让程序更健壮。
内容的提问来源于stack exchange,提问作者Dsp guy sam
相关产品推荐
相关产品推荐

