快速导航×

Python爬取NBA选秀体测数据:绕过前端渲染,直击API数据源2025-11-01 12:31:17

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

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

传统HTML解析的局限性

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

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

识别API数据源

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

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

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

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

Python实现数据抓取

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

短影AI 短影AI

长视频一键生成精彩短视频

短影AI 170 查看详情 短影AI
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": "2025-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数据源的详细内容,更多请关注其它相关文章!


# javascript  # python  # linux  # 官网  # 青岛网站优化教程哪家好  # 选项卡  # 动态网页  # 直接调用  # 网站优化哪里不错  # 天津手动网站建设收费  # 凌河区网络推广招聘网站  # 深圳网站建设忧化  # 信誉好的镇江seo  # 营销推广课程平台开发  # seo更新排名  # 北京抖音seo代理价格  # 网站建设高端公司有哪些  # 包含了  # 可以通过  # 我们可以  # 结构化  # 直击  # 选秀  # 工具  # app  # 浏览器  # ajax  # json  # 前端  # js  # html  # java 


相关栏目: 【 企业资讯168 】 【 行业动态20933 】 【 网络营销52431 】 【 网络学院91036 】 【 运营推广7012 】 【 科技资讯60970


相关推荐: Golang如何使用new_Go new分配内存机制讲解  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  Excel Power Pivot如何处理XML数据源 构建高级数据模型  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  如何在 Excel Online 和 Google 表格中更改日期格式  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  《噬血代码2》新预告片发布 展示游戏剧情  Pandas DataFrame:高效添加条件计算列  4399体育竞技小游戏_4399小游戏赛事入口  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  outlook中文官网入口地址 outlook官方中文版直达首页链接  微博网页版官方账号登录 微博网页版内容浏览使用指南  J*aScript实现单选按钮与关联输入框的联动禁用教程  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  三星GalaxyS24怎样用相机拍摄夜景流光_iPhoneGalaxyS24相机拍摄夜景流光【夜拍技法】  excel怎么制作工资条 excel快速生成工资条的方法  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  ArrayList与LinkedList操作复杂度详解:遍历与修改  Fabric模组开发:自定义物品与物品组的现代管理方法  在Socket.IO连接中实现Access Token自动更新与动态重连  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  PySpark中从现有列右侧提取可变长度字符创建新列的教程  星露谷物语官网入口 星露谷物语游戏官网入口  qq游戏跨平台入口_qq游戏多设备同步登录  最新韩小圈网页版登录入口_官网在线观看官方链接  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  AngularJS $http POST请求数据传递与Go后端接收实践  利用Bokeh CustomJS动态控制DataTable列可见性  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  必由学在线入口 必由学网页版快速登录入口  在Qt QML中通过Python字典动态更新TextEdit内容的教程  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  Golang如何优雅处理error_Golang error处理最佳实践总结  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  J*aScript异步迭代器_j*ascript异步遍历  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新