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

Python爬取ATP网站球员出生日期:无法定位元素问题求助

解决ATP球员出生日期爬取问题

为什么requests返回的HTML和开发者工具显示的不一致?

ATP官网的球员数据多通过JavaScript动态渲染,requests只能获取服务器返回的初始静态HTML,不会执行页面JS代码,因此拿不到动态加载的内容,包括你要定位的table-birthday元素。

两种可行解决方案

方法一:用浏览器自动化工具(Selenium/Playwright)

这类工具会模拟真实浏览器行为,加载页面并执行JS,能获取和开发者工具一致的完整HTML,适合验证页面结构的场景。

以Selenium为例,代码示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化Chrome浏览器(需提前配置对应版本的ChromeDriver)
driver = webdriver.Chrome()

# 访问目标球员详情页(替换为实际球员URL)
driver.get("https://www.atptour.com/en/players/novak-djokovic/d643/overview")

try:
    # 等待目标元素加载完成,最长等待10秒
    birthday_element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "table-birthday"))
    )
    # 提取出生日期文本
    birthday = birthday_element.text
    print(birthday)
finally:
    # 关闭浏览器
    driver.quit()

方法二:直接调用ATP后端API

批量爬取1662名球员时,调用API比模拟浏览器更高效。你可以在Chrome开发者工具的「网络」标签中,筛选XHR/Fetch请求,找到返回球员信息的API接口(通常返回JSON格式数据,包含出生日期字段)。

代码示例:

import requests

# 替换为实际的球员API接口(从开发者工具中获取真实接口)
api_url = "https://api.atptour.com/players/d643/overview"
# 添加请求头模拟浏览器访问,避免被拦截
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"
}

response = requests.get(api_url, headers=headers)
player_data = response.json()

# 从JSON数据中提取出生日期(具体字段需根据API返回结构调整)
birthday = player_data.get("player", {}).get("dateOfBirth")
print(birthday)

批量爬取注意事项

  • 设置合理的请求间隔,避免短时间内发送大量请求导致IP被封禁;
  • 整理好球员ID或URL列表,循环处理每个球员的请求;
  • 添加异常处理逻辑,应对页面加载失败、API返回错误等情况,保证爬取稳定性。

内容的提问来源于stack exchange,提问作者simao-af

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:53:24