无法用cURL复现Chrome请求,Python requests登录TennisTV失败求助
解决TennisTV登录请求失败的问题
我来帮你排查下这个登录失败的问题——这类情况大多是请求头不完整、会话状态没维护,或者网站的反爬机制在起作用,咱们一步步来解决:
1. 必须维护会话状态
直接发POST请求很容易失败,因为网站会通过Cookie识别会话。你需要用requests.Session()来维持登录前后的会话,它会自动帮你保存和携带Cookie:
import requests session = requests.Session()
2. 补全关键请求头
浏览器发送请求时会带上很多标识字段,网站会以此判断请求是否来自真实用户。你需要把Chrome开发者工具里看到的请求头完整复制过来,重点关注这几个:
User-Agent:完全照搬浏览器的UA字符串,别用默认的requests UAReferer:设置为登录页面的URL(https://www.tennistv.com/login)X-Requested-With:如果是AJAX请求,这个字段通常是XMLHttpRequest- 可能存在的
X-CSRF-Token:有些网站会在登录页面的HTML里嵌入这个token,需要先提取
3. 提取并携带CSRF Token(如果存在)
很多网站会要求请求携带CSRF Token来防止跨站请求伪造。你可以先访问登录页面,从HTML里提取这个token:
from bs4 import BeautifulSoup # 先访问登录页面,获取页面内容和会话Cookie login_page = session.get("https://www.tennistv.com/login") soup = BeautifulSoup(login_page.text, "html.parser") # 尝试提取CSRF Token(不同网站的meta标签名可能不同,比如csrf-token、XSRF-TOKEN) csrf_token = None meta_tag = soup.find("meta", attrs={"name": "csrf-token"}) if meta_tag: csrf_token = meta_tag.get("content")
4. 完整的登录请求示例
把上面的步骤整合起来,完整代码如下:
import requests from bs4 import BeautifulSoup # 初始化会话 session = requests.Session() # 访问登录页面,获取必要的Cookie和CSRF Token login_page_url = "https://www.tennistv.com/login" response = session.get(login_page_url) soup = BeautifulSoup(response.text, "html.parser") # 提取CSRF Token(如果页面存在的话) csrf_token = soup.find("meta", attrs={"name": "csrf-token"})["content"] if soup.find("meta", attrs={"name": "csrf-token"}) else None # 构造请求头,完全匹配浏览器的请求头 headers = { "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": login_page_url, "X-Requested-With": "XMLHttpRequest", "Accept": "application/json, text/plain, */*" } if csrf_token: headers["X-CSRF-Token"] = csrf_token # 登录负载 payload = { "Email": "your_email@example.com", "Password": "your_password_here" } # 发送登录请求 login_api_url = "https://www.tennistv.com/api/users/v1/login" login_response = session.post(login_api_url, json=payload, headers=headers) # 检查结果 print(f"状态码: {login_response.status_code}") print(f"响应内容: {login_response.text}")
5. 如果还是失败,排查这些点
- 对比请求头:把代码里的请求头和Chrome里的完全对比,看有没有遗漏的字段(比如
Origin、Sec-Fetch-*系列字段) - 查看响应错误:如果返回403,大概率是反爬机制(比如Cloudflare人机验证);如果是400,检查payload的格式是否正确,有没有拼写错误(比如字段名是
email还是Email) - Cloudflare验证:如果网站用了Cloudflare,单纯用requests是绕不过的,这时候需要用
undetected-chromedriver这类工具模拟真实浏览器行为
内容的提问来源于stack exchange,提问作者beta
相关产品推荐
相关产品推荐

