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

能否下载网页部分HTML用于Python抓取?批量获取USTA青少年网球排名

解决方案:直接抓取API数据替代Selenium,高效获取完整排名

核心结论

完全可以直接获取完整的青少年网球排名数据,无需逐页浏览或使用Selenium,通过抓取网站后台的API接口,能大幅提升数据获取速度,完美适配你每周更新的需求。

具体实现步骤

1. 找到排名数据的API接口

打开目标页面后,按F12打开浏览器开发者工具,切换到「Network」标签,刷新页面并筛选「XHR」请求:

  • 页面加载排名时,会向后台发送类似/api/rankings/junior的请求(具体接口地址从请求列表中提取)
  • 请求参数包含你设置的筛选条件:juniorListType=seeding、rankListGender=M、ageRestriction=Y14,还有分页参数page(页码)和perPage(每页条数)
  • 响应内容是JSON格式的结构化数据,包含所有选手的排名、姓名、积分等完整信息

2. 用Python批量获取全量数据

使用requests库直接调用API,循环遍历所有页码即可获取全部10000条数据,示例代码如下:

import requests
import pandas as pd
import time

# 基础API地址和参数,根据抓包结果调整
BASE_URL = "https://www.usta.com/api/rankings/junior"
PARAMS = {
    "juniorListType": "seeding",
    "rankListGender": "M",
    "ageRestriction": "Y14",
    "perPage": 100,
    "page": 1
}

# 请求头,模拟浏览器避免被拦截
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"
}

all_players = []

# 循环获取100页数据
for page in range(1, 101):
    PARAMS["page"] = page
    response = requests.get(BASE_URL, params=PARAMS, headers=HEADERS)
    
    if response.status_code == 200:
        data = response.json()
        players = data.get("items", [])
        all_players.extend(players)
        print(f"已获取第{page}页,累计{len(all_players)}条数据")
    else:
        print(f"获取第{page}页失败,状态码:{response.status_code}")
    
    # 加短暂延迟,避免请求过于频繁
    time.sleep(0.5)

# 保存为CSV文件方便后续查询
df = pd.DataFrame(all_players)
df.to_csv("usta_junior_rankings.csv", index=False, encoding="utf-8-sig")
print("全量数据已保存到usta_junior_rankings.csv")

3. 快速查询选手排名

有了本地CSV文件后,查询选手排名无需再访问网站,直接读取文件即可,示例代码:

import pandas as pd

# 读取本地排名数据
df = pd.read_csv("usta_junior_rankings.csv")

def get_player_ranking(name):
    # 可根据需求调整匹配逻辑,比如精确匹配姓名
    result = df[df["playerName"].str.contains(name, case=False)]
    if not result.empty:
        return result[["rank", "playerName", "points"]].to_dict("records")
    else:
        return "未找到该选手"

# 示例查询
print(get_player_ranking("John Doe"))

为什么比Selenium高效?

  • Selenium需要模拟浏览器加载页面、渲染JS、等待元素,单条请求耗时远高于直接API调用
  • API直接返回结构化数据,无需解析HTML,批量获取10000条数据仅需几分钟,而Selenium可能需要数小时
  • 本地保存数据后,查询操作几乎即时,完全解决你当前抓取32名选手耗时久的问题

注意事项

  • 遵守网站使用条款,避免过于频繁的请求,必要时增加延迟时间
  • 若API需要验证信息(如Cookie),可从浏览器请求头中复制对应字段添加到HEADERS中
  • 每周三重新运行脚本即可获取最新排名数据

内容的提问来源于stack exchange,提问作者Programmer0403

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:40:00