Python使用requests库无法抓取JSESSIONID该如何解决?
可行解决方案
核心原因
JSESSIONID是服务端在用户首次初始化会话时下发的Cookie值,你之前直接跳步请求后端API接口,等于跳过了会话初始化的流程,服务端不会给非法会话下发JSESSIONID,自然拿不到对应Cookie。
具体操作步骤
步骤1:先模拟正常访问流程,初始化会话
先请求站点首页,触发服务端下发JSESSIONID,同时给Session设置完整的浏览器请求头,避免被爬虫拦截:
import requests query = 'Example%20query' # 初始化会话 s = requests.Session() # 配置和浏览器一致的请求头,不要用requests默认UA,极易被拦截 s.headers.update({ "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": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive" }) # 第一步先访问站点首页,触发服务端下发JSESSIONID s.get("https://www.examplewebsite.nl/") # 此时即可正常获取到JSESSIONID print(s.cookies.get("JSESSIONID")) # 再请求目标API接口,会话会自动携带JSESSIONID suggest = s.get(f'https://www.examplewebsite.nl/api_route/suggest?query={query}').json()
步骤2:特殊场景适配
如果完成步骤1后仍无法获取JSESSIONID,按以下顺序排查:
- 补全所有请求头参数:把你手动调用接口时的所有请求头(包括Referer、Origin、Sec-*系列参数)都配置到Session的headers中,不要缺项
- 解决TLS指纹识别:部分站点会校验请求的TLS指纹,requests的默认指纹特征会被识别为爬虫,可替换为和requests用法一致的
curl_cffi库模拟浏览器指纹,即可绕过校验 - 手动设置Cookie作用域:如果服务端下发的JSESSIONID domain/path和接口不匹配,可手动设置Cookie到会话中:
s.cookies.set("JSESSIONID", "获取到的JSESSIONID值", domain="www.examplewebsite.nl", path="/")
内容的提问来源于stack exchange,提问作者Jeroen Vermunt
相关产品推荐
相关产品推荐

