如何在Python中通过登录凭证获取请求头Authorization密钥?
问题描述
想用requests库访问某需要携带Authorization请求头的网站数据,但手动获取的密钥几分钟就失效,希望通过登录凭证自动获取该密钥。尝试过多种代码方案:前两种提交登录请求返回404;第三种用HTTPBasicAuth得到200状态码,但响应头中没有Authorization字段,不知道如何提取密钥。
用户尝试的代码示例:
代码1(返回404)
import requests headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"} login_url = 'https://example.com/login' login_data = { 'username': 'username', 'password': 'password' } session = requests.session() login_response = session.post(login_url, data=login_data, headers=headers) print(login_response.status_code) # always gives 404
代码2(返回404)
import requests headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"} username = "username", password = "pass", url = "https://url.com/login" with requests.session() as session: reponse = session.post(url, auth=(username, password), headers=headers) print(reponse) # it gives 404 also
代码3(返回200但未获取到Authorization密钥)
import requests from requests.auth import HTTPBasicAuth headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"} username = "user", password = "pass", url = "https://url.com" response = requests.get(url, auth=HTTPBasicAuth(username, password), headers=headers) print(response) # 200 print(response.headers) #doesnt have "authorization"
解决方案
核心分析
HTTPBasicAuth是将用户名密码编码为Base64直接放在Authorization头中,但多数现代网站的登录流程是提交表单后返回Token(如JWT),或把Token存入Cookie/响应体,而非直接在响应头返回Authorization字段。你得到200说明身份验证成功,但密钥不在响应头里,需要从响应体或Cookie中提取。
具体操作步骤
1. 抓包确认真实登录流程
用浏览器开发者工具(F12→「网络」标签)手动登录一次,重点观察:
- 真实的登录请求URL(绝非猜测的
/login,常见格式如/api/auth/login) - 请求方法(大概率是POST)
- 请求体参数名(可能不是
username/password,比如user_account/passwd,部分网站还需携带csrf_token) - 登录成功后Token的存储位置:是在响应体的JSON数据中(如
{"token": "Bearer xxx"}),还是Cookie的某个字段里(如access_token)
2. 调整代码适配真实流程
示例1:Token在响应体中返回
import requests headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"} # 替换为抓包得到的真实登录接口URL login_url = "https://xxx.com/api/auth/login" # 按抓包到的参数名填写 login_data = { "user_account": "你的用户名", "passwd": "你的密码", "csrf_token": "抓包获取的csrf值" # 若网站需要,先访问登录页获取 } session = requests.Session() # 先访问登录页面,获取必要的Cookie或csrf_token(如果需要) session.get("https://xxx.com/login", headers=headers) login_response = session.post(login_url, data=login_data, headers=headers) if login_response.status_code == 200: # 解析响应体提取Token result = login_response.json() auth_token = result.get("token") # 替换为实际返回的键名 # 构造Authorization请求头 headers["Authorization"] = f"Bearer {auth_token}" # 用Session访问需要授权的接口 data_response = session.get("https://xxx.com/api/data", headers=headers) print(data_response.text)
示例2:Token存储在Cookie中
import requests headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"} login_url = "https://xxx.com/api/auth/login" login_data = {"username": "你的用户名", "password": "你的密码"} session = requests.Session() login_response = session.post(login_url, data=login_data, headers=headers) if login_response.status_code == 200: # 从Cookie中提取Token(替换为实际的Cookie键名) auth_token = session.cookies.get("access_token") headers["Authorization"] = f"Bearer {auth_token}" data_response = session.get("https://xxx.com/api/data", headers=headers) print(data_response.text)
3. 解决之前的404问题
之前的代码返回404,核心原因是登录URL错误,必须使用抓包得到的真实接口,而非自行猜测。此外,部分网站要求登录请求携带Referer头,或需先访问首页获取Cookie后再提交登录请求。
注意事项
- 若网站有验证码,需额外处理(如调用验证码识别工具)
- Token前缀(如
Bearer)需与抓包到的格式一致,不能随意修改 - 使用
requests.Session()可自动维持Cookie,避免重复处理身份验证信息
内容的提问来源于stack exchange,提问作者Rachid
相关产品推荐
相关产品推荐

