使用requests.get访问URL无响应但火狐浏览器可正常打开如何解决
问题原因
- NSE印度国家证券交易所的公开API做了多层反爬校验,仅携带User-Agent无法通过校验,服务端会直接拦截请求返回403/超时等异常
- 浏览器能正常访问是因为浏览器访问时会自动携带主站下发的有效会话Cookie,同时发送完整的Referer、Accept等请求头,符合服务端的校验规则
- 现有代码还存在响应处理错误:requests返回的response对象不能直接传入
pd.read_json,需要先提取响应的JSON内容
修正方案
import requests import pandas as pd import pprint url = "https://www.nseindia.com/api/option-chain-equities?symbol=ACC" # 补充完整的请求头参数 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", "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Referer": "https://www.nseindia.com/", "X-Requested-With": "XMLHttpRequest" } # 用Session保持会话Cookie,先访问主站获取合法Cookie session = requests.Session() # 先请求主站触发Cookie下发 session.get("https://www.nseindia.com", headers=headers, timeout=10) # 再请求目标API response = session.get(url, headers=headers, timeout=10) # 先校验状态码 print(response.status_code) if response.status_code == 200: # 先提取JSON数据再转DataFrame data = response.json() df = pd.json_normalize(data['records']['data']) pprint.pprint(df.head(1))
注意事项
- 如果请求仍然失败,可以更新User-Agent为你本地浏览器的真实UA
- 需先确认当前网络可以正常访问NSE官网
内容的提问来源于stack exchange,提问作者zircon
相关产品推荐
相关产品推荐

