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

无法用cURL复现Chrome请求,Python requests登录TennisTV失败求助

解决TennisTV登录请求失败的问题

我来帮你排查下这个登录失败的问题——这类情况大多是请求头不完整、会话状态没维护,或者网站的反爬机制在起作用,咱们一步步来解决:

1. 必须维护会话状态

直接发POST请求很容易失败,因为网站会通过Cookie识别会话。你需要用requests.Session()来维持登录前后的会话,它会自动帮你保存和携带Cookie:

import requests

session = requests.Session()

2. 补全关键请求头

浏览器发送请求时会带上很多标识字段,网站会以此判断请求是否来自真实用户。你需要把Chrome开发者工具里看到的请求头完整复制过来,重点关注这几个:

  • User-Agent:完全照搬浏览器的UA字符串,别用默认的requests UA
  • Referer:设置为登录页面的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:06:12