Python requests调用纳斯达克API首次GET请求返回400错误求助
问题原因
- 直接触发400错误的原因是请求头命名不符合规范:你定义的
cache - control字段中间存在多余空格,HTTP请求头名不允许出现空格,正确写法为Cache-Control,修正后即可解决「无效请求头名称」的报错。 - 你观察到的浏览器访问后代码可正常运行的现象确实和Cookie校验相关:纳斯达克官方接口配置了基础反爬策略,首次访问接口时服务器会下发会话Cookie用于身份校验,浏览器访问时会自动完成Cookie存储、后续请求自动携带的逻辑,而你原有代码每次发起的都是独立无状态请求,不会自动保存Cookie,所以首次请求会被拦截;浏览器访问后同IP下的会话会被临时放行,短时间内代码就能正常请求成功。
修正后可直接运行的代码
import requests # 初始化会话,自动管理Cookie,无需手动处理 session = requests.Session() symbol = 'ALB' url = f"https://api.nasdaq.com/api/quote/{symbol}/historical?assetclass=stocks&fromdate=2021-07-06&todate=2021-07-07" headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "en-US,en;q=0.9", "Connection": "keep-alive", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", # 修正错误的头名,删除多余空格 "Cache-Control": "max-age=0, no-cache, no-store", "upgrade-insecure-requests": "1", # 补充来源页头,适配反爬校验规则 "Referer": "https://www.nasdaq.com/" } # 使用会话发起请求,自动携带服务器下发的Cookie response = session.get(url, headers=headers, verify=True) if response.status_code != 200: print(f"download response code:{response.status_code}") print(f"download response text:{response.text}") else: print(response.text)
如果需要批量请求不同的股票代码,复用同一个session实例即可,不需要每次新建会话,就能避免更换symbol后需要重新验证的问题。
内容的提问来源于stack exchange,提问作者Madhavi D
相关产品推荐
相关产品推荐

