Python Requests库无法获取Bearer Token:如何动态获取含Bearer的请求头
解决Python Requests获取Bearer Token并传入请求头的问题
我来帮你梳理下问题和解决方案:你现在的代码直接访问API只能拿到响应头,但你需要的是用于请求的Bearer Token——这类Token通常需要先完成网站的会话初始化,甚至从页面内容或特定接口中提取。
问题分析
Rappi这类网站的API需要先建立有效会话(通过访问前端页面获取必要的Cookie、会话标识),然后才能获取到合法的Bearer Token。你当前的代码跳过了会话初始化步骤,直接请求API,自然拿不到需要的Token。
解决方案步骤
- 初始化会话并访问前端页面:先访问目标店铺页面,让网站为你的Session设置必要的Cookie和会话信息。
- 提取Bearer Token:通常这类Token会出现在页面的JavaScript代码中,或者后续的某个API响应里(比如你请求的
web-proxy/dynamic-list/cpgs/接口可能需要先带Cookie请求,然后从响应或返回的某个字段里拿到Token)。 - 将Token加入请求头:拿到Token后,在后续的API请求中添加
Authorization: Bearer {token}的请求头。
修改后的示例代码
import requests import re url_site = 'https://www.rappi.com.br/lojas/900520986-makro-atacadista-nc/mercearia' url_api = 'https://services.rappi.com.br/api/ms/web-proxy/dynamic-list/cpgs/' with requests.session() as r: # 第一步:访问前端页面,初始化会话 site_response = r.get(url_site) # 检查是否成功获取页面 if site_response.status_code != 200: print("Failed to load the site page") exit() # 第二步:从页面内容中提取Bearer Token(示例,实际需根据页面结构调整正则) # 假设Token在页面的脚本里,格式类似: window.__APP_STATE__ = {"auth":{"token":"Bearer xxx..."}} token_match = re.search(r'"token":"Bearer (\w+\.\w+\.\w+)"', site_response.text) if token_match: bearer_token = f"Bearer {token_match.group(1)}" print(f"获取到Token: {bearer_token}") else: # 备选方案:如果页面里没有,尝试请求API,看响应中是否有Token相关字段 api_response = r.get(url_api) # 检查API响应的JSON内容(假设API返回JSON) try: api_data = api_response.json() # 这里需要根据实际API返回结构找Token,比如api_data.get('auth', {}).get('token') bearer_token = api_data.get('token') except: print("未能从页面或API中提取Token,请检查页面结构或API响应") bearer_token = None # 第三步:使用Token发送请求 if bearer_token: headers = { 'Authorization': bearer_token, # 可根据需要添加其他必要请求头,比如User-Agent 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 带Token请求API protected_response = r.get(url_api, headers=headers) print("带Token的API响应状态码:", protected_response.status_code) # 打印响应内容(如果需要) # print(protected_response.json()) else: print("未获取到有效Bearer Token")
注意事项
- 正则表达式需调整:实际页面中的Token存储格式可能不同,你可以打开浏览器的开发者工具(F12),查看页面源代码,搜索"Bearer"找到准确的匹配格式,再修改正则。
- Cookie的重要性:一定要用同一个Session访问页面和API,这样会话上下文才会保持一致,网站才会认可你的请求。
- 请求头模拟:记得添加
User-Agent等常见请求头,避免被网站识别为爬虫而拒绝请求。
内容的提问来源于stack exchange,提问作者automation_m
相关产品推荐
相关产品推荐

