如何使用Python Requests库实现ESPN登录以爬取梦幻橄榄球联赛数据
问题根因分析
- 缺少必要的请求头:ESPN的登录接口会校验请求头的
User-Agent、Referer、Content-Type等字段,默认的requests请求头特征过于明显,会被接口直接拦截 - Authorization头取值错误:你当前代码直接把完整的响应JSON塞进了授权头,而接口要求的是Bearer格式的token值。且你当前拿到的是失败响应,本身就没有有效token,自然会返回
AUTHORIZATION_INVALID_OR_EXPIRED_TOKEN错误 - 缺少前置凭证:该迪士尼体系的登录接口需要先获取匿名会话凭证才能发起登录请求,你直接发起POST请求没有前置校验参数,也会被判定为非法请求
修正后的实现方案
import requests import json def login(mail, password): s = requests.session() # 先更新基础请求头,模拟浏览器特征 s.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": "https://www.espn.com/", "Content-Type": "application/json", "Accept": "application/json" }) # 第一步:先获取匿名会话凭证 pre_res = s.get("https://registerdisney.go.com/jgc/v6/client/ESPN-ONESITE.WEB-PROD/guest/anonymous?langPref=en-US") pre_data = pre_res.json() if pre_data.get("data"): # 把匿名token先加到请求头里 s.headers.update({"authorization": f"Bearer {pre_data['data']['token']}"}) payload = { 'email': mail, 'password': password } res = s.post('https://registerdisney.go.com/jgc/v6/client/ESPN-ONESITE.WEB-PROD/guest/login?langPref=en-US', json=payload) login_data = res.json() if login_data.get("data"): # 登录成功,替换为正式的授权token s.headers.update({"authorization": f"Bearer {login_data['data']['token']}"}) print("登录成功") else: # 打印具体错误方便排查 print(f"登录失败,错误代码:{login_data.get('error', {}).get('errors', [{}])[0].get('code')}") return s session = login('你的邮箱', '你的密码')
备选方案(如果上述方案仍被拦截)
如果接口添加了设备指纹、人机校验等反爬策略,用纯requests很难绕过,可以先用Selenium模拟人工登录拿到有效Cookie后,再把Cookie同步到requests会话中进行后续的数据爬取,既能绕过登录校验,也能保证后续爬取的效率。
内容的提问来源于stack exchange,提问作者kevinvi8
相关产品推荐
相关产品推荐

