You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Requests库无法获取Bearer Token:如何动态获取含Bearer的请求头

解决Python Requests获取Bearer Token并传入请求头的问题

我来帮你梳理下问题和解决方案:你现在的代码直接访问API只能拿到响应头,但你需要的是用于请求的Bearer Token——这类Token通常需要先完成网站的会话初始化,甚至从页面内容或特定接口中提取。

问题分析

Rappi这类网站的API需要先建立有效会话(通过访问前端页面获取必要的Cookie、会话标识),然后才能获取到合法的Bearer Token。你当前的代码跳过了会话初始化步骤,直接请求API,自然拿不到需要的Token。

解决方案步骤

  1. 初始化会话并访问前端页面:先访问目标店铺页面,让网站为你的Session设置必要的Cookie和会话信息。
  2. 提取Bearer Token:通常这类Token会出现在页面的JavaScript代码中,或者后续的某个API响应里(比如你请求的web-proxy/dynamic-list/cpgs/接口可能需要先带Cookie请求,然后从响应或返回的某个字段里拿到Token)。
  3. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:52:52