Python调用带Header的URL API请求提示会话过期无法查看JSON数据
问题成因
你遇到的会话过期报错是两个核心问题导致的:
- 你写死在URL里的
sessionID、手动填写在请求头里的cookie都是无效值,没有获取网站下发的有效会话凭证 - 请求头里额外加了
method、path、scheme这类不需要手动设置的字段,反而可能触发网站的校验拦截
解决步骤
直接用requests自带的会话对象自动管理cookie,先访问预订首页拿到有效会话,再发起查询请求即可,修改后代码如下:
import requests # 创建会话对象,自动管理cookie s = requests.Session() # 先访问预订首页,获取服务器下发的有效会话 s.get("https://reservations.piratecoveresort.com/irmng/") url = "https://reservations.piratecoveresort.com/irmdata/api/irm?sessionID=_rdpirm01&arrival=2021-10-26&departure=2021-10-28&people1=1&people2=0&people3=0&people4=0&promocode=&groupnum=&rateplan=RACK&changeResNum=&roomtype=&roomnum=&propertycode=&locationcode=&preferences=&preferences=&preferences=&preferences=&preferences=WTF&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&preferences=&masterType=&page=&start=0&limit=12&multiRoom=false" # 只保留必要的请求头即可,不需要手动加method、path、scheme、cookie字段 headers = { 'accept': 'application/json, text/plain, */*', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'en-US,en;q=0.9', 'content-type': 'application/json; charset=utf-8', 'dnt': '0', 'referer': 'https://reservations.piratecoveresort.com/irmng/', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': "Windows", 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36', } response = s.get(url, headers=headers) print(response.text)
额外注意事项
- 把URL里的
arrival(入住日期)、departure(离店日期)改成你实际要查询的日期,示例里的2021年日期已经过期 - 不要短时间内频繁发起请求,否则可能被网站的反爬机制拦截
内容的提问来源于stack exchange,提问作者TMC FAMILY
相关产品推荐
相关产品推荐

