能否下载网页部分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
相关产品推荐
相关产品推荐

