Python爬取NBA选秀体测数据:绕过前端渲染,直击API数据源

聖光之護
发布: 2025-11-01 12:31:17
原创
772人浏览过

Python爬取NBA选秀体测数据:绕过前端渲染,直击API数据源

本教程演示如何使用python高效爬取nba选秀体测数据。针对网页前端动态渲染的挑战,我们摒弃传统的beautifulsoup解析html方法,转而通过分析网络请求,直接调用nba官方api接口,以json格式获取结构化数据,并利用pandas进行数据处理,从而实现稳定可靠的数据抓取。

传统HTML解析的局限性

在进行网页数据抓取时,许多开发者习惯使用requests库获取网页内容,再结合BeautifulSoup库解析HTML结构来提取所需数据。然而,对于现代的动态网页,尤其是那些数据通过JavaScript在客户端渲染的页面,这种方法往往会遇到瓶颈。

例如,当我们尝试从NBA官网的选秀体测数据页面(如https://www.nba.com/stats/draft/combine-anthro?SeasonYear=2022-23)抓取表格数据时,如果仅使用requests.get()获取HTML内容,然后用BeautifulSoup.find_all("table")来查找表格,很可能会发现返回的表格列表是空的。这是因为页面上的数据表格并非直接嵌入在初始HTML文档中,而是通过JavaScript异步请求(AJAX)从后端API获取数据后,再由前端动态生成。

识别API数据源

解决动态网页数据抓取的关键在于绕过前端渲染,直接找到数据背后的API接口。这通常可以通过浏览器的开发者工具(通常按F12打开)来完成:

  1. 打开目标网页: 访问https://www.nba.com/stats/draft/combine-anthro?SeasonYear=2022-23。
  2. 打开开发者工具: 切换到“Network”(网络)选项卡。
  3. 刷新页面: 重新加载页面,观察网络请求。
  4. 筛选XHR/Fetch请求: 在“Network”选项卡中,通常会有“XHR”或“Fetch/XHR”过滤器,点击它以只显示异步数据请求。
  5. 查找数据请求: 仔细查看这些请求的URL和响应内容。我们会发现一个指向https://stats.nba.com/stats/draftcombineplayeranthro的请求,其响应类型为JSON,且包含了页面上显示的所有体测数据。

通过分析这个API请求,我们可以确定以下关键信息:

立即学习Python免费学习笔记(深入)”;

怪兽AI数字人
怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44
查看详情 怪兽AI数字人
  • API URL: https://stats.nba.com/stats/draftcombineplayeranthro
  • 请求方法: GET
  • 查询参数(Payload): LeagueID (通常为"00"表示NBA), SeasonYear (例如"2022-23")。
  • 请求头(Headers): 为了模拟浏览器行为,通常需要包含Referer(引用页)和User-Agent(用户代理)等。

Python实现数据抓取

一旦确定了API接口及其调用方式,就可以使用Python的requests库来直接获取JSON数据,并利用pandas库将其转换为结构化的DataFrame。

import requests
import pandas as pd

# 1. 定义API接口URL
api_url = "https://stats.nba.com/stats/draftcombineplayeranthro"

# 2. 定义请求参数 (Payload)
# 这些参数对应了API请求中的查询字符串,用于指定获取哪个赛季的数据等
payload = {
    "LeagueID": "00",  # 00通常代表NBA联盟
    "SeasonYear": "2022-23" # 指定要查询的赛季年份
}

# 3. 定义请求头 (Headers)
# 模拟浏览器行为,避免被服务器识别为爬虫或拒绝访问
headers = {
    "Referer": "https://www.nba.com/",  # 引用页,模拟从NBA官网跳转
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" # 用户代理,模拟主流浏览器
}

# 4. 发送GET请求并获取JSON响应
# 使用params参数传递payload,headers参数传递请求头
try:
    response = requests.get(api_url, params=payload, headers=headers)
    response.raise_for_status() # 检查HTTP请求是否成功 (状态码200)
    data = response.json() # 将响应内容解析为JSON格式
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
    exit()

# 5. 解析JSON数据并创建Pandas DataFrame
# NBA API的JSON结构通常包含'resultSets',其中每个元素包含'headers'和'rowSet'
if data and "resultSets" in data and len(data["resultSets"]) > 0:
    # 提取列名
    columns = data["resultSets"][0]["headers"]
    # 提取数据行
    rows = data["resultSets"][0]["rowSet"]

    # 使用Pandas创建DataFrame
    df = pd.DataFrame(rows, columns=columns)
    print("成功获取并处理数据:")
    print(df.head()) # 打印DataFrame的前5行
    print(f"\nDataFrame形状: {df.shape}")
else:
    print("JSON数据结构不符合预期或无数据。")
登录后复制

代码解释:

  • api_url: NBA选秀体测数据的API端点。
  • payload: 一个字典,包含了发送给API的查询参数。LeagueID用于指定联赛,SeasonYear用于指定需要查询的赛季。
  • headers: 一个字典,包含了HTTP请求头信息。Referer告知服务器请求来源于哪个页面,User-Agent则模拟了浏览器的身份。这些头信息对于成功访问某些API至关重要。
  • requests.get(): 发送GET请求到API URL,并传入params和headers。
  • response.raise_for_status(): 这是一个良好的实践,它会在HTTP请求返回错误状态码(如4xx或5xx)时抛出异常,便于错误处理。
  • response.json(): 将API返回的JSON格式响应体解析成Python字典或列表。
  • 数据解析: NBA API的数据通常封装在resultSets列表中,每个resultSets元素包含headers(列名)和rowSet(数据行)。通过索引[0]可以访问第一个结果集。
  • pd.DataFrame(): 使用解析出的列名和数据行创建pandas.DataFrame,方便后续的数据分析和处理。

输出示例

运行上述代码,你将得到一个包含NBA选秀体测数据的Pandas DataFrame,其部分输出可能如下:

   TEMP_PLAYER_ID  PLAYER_ID FIRST_NAME  ... BODY_FAT_PCT HAND_LENGTH HAND_WIDTH
0         1630534    1630534      Ochai  ...         5.40        8.75       9.50
1         1631116    1631116    Patrick  ...         8.90        8.75       9.50
2         1631094    1631094      Paolo  ...          NaN         NaN        NaN
3         1630599    1630599      Jaden  ...         4.80        9.00       9.75
4         1631100    1631100       Dyson  ...         4.90        9.50      10.00

[5 rows x 18 columns]

DataFrame形状: (83, 18)
登录后复制

注意事项与最佳实践

  1. API稳定性: 官方API接口可能会发生变化,导致上述代码失效。在实际应用中,应定期检查API的可用性和响应结构。
  2. 请求频率: 避免在短时间内发送大量请求,以免被服务器封禁IP。可以引入time.sleep()进行延迟,或遵循API提供方的速率限制策略。
  3. 错误处理: 使用try-except块捕获网络请求和JSON解析可能出现的错误,增强代码的健壮性。
  4. 动态参数: 如果需要抓取不同赛季的数据,可以通过循环或修改payload字典中的SeasonYear参数来实现。
  5. 数据清洗: 抓取到的数据可能包含NaN值或需要进一步格式化。pandas提供了丰富的数据清洗和转换功能。

总结

对于前端动态渲染的网页,直接解析HTML往往效率低下或根本无法获取数据。通过利用浏览器的开发者工具分析网络请求,我们可以发现隐藏在背后的API接口。这种直接调用API的方式,不仅能够稳定、高效地获取结构化数据,而且避免了处理复杂的HTML解析逻辑,是现代网页数据抓取的一种主流且推荐的方法。掌握这种技巧,将大大提升数据获取的成功率和效率。

以上就是Python爬取NBA选秀体测数据:绕过前端渲染,直击API数据源的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号