
Rotowire 的 MLB 优化器页面使用 JavaScript 动态加载表格,直接用 pd.read_html() 无法获取真实数据;需绕过前端 iframe,调用其后台 API 接口,传入正确参数(如 siteID、slateID)获取 JSON 格式结构化数据并转为 DataFrame。
rotowire 的 mlb 优化器页面使用 javascript 动态加载表格,直接用 `pd.read_html()` 无法获取真实数据;需绕过前端 iframe,调用其后台 api 接口,传入正确参数(如 siteid、slateid)获取 json 格式结构化数据并转为 dataframe。
Rotowire 的每日 MLB 优化器(如 DraftKings 赛程页)看似是普通 HTML 表格,实则由前端 JavaScript 渲染,原始 HTML 中仅包含空容器或占位符——这也是你调用 pd.read_html() 后只看到全 NaN 行的根本原因。read_html() 仅解析静态 HTML 源码,无法执行 JS,因此对 iframe 内动态内容完全失效。
幸运的是,Rotowire 提供了稳定的内部 API 接口:
https://www.rotowire.com/daily/tables/optimizer-mlb.php
该接口接受标准查询参数,返回结构清晰的 JSON 数据。关键参数包括:
-
siteID: 平台标识(DraftKings =1,FanDuel =2,Yahoo =3) -
slateID: 当日赛程唯一 ID(需实时获取,见下文说明) -
projSource: 预测模型来源(常用'RotoWire') -
rst: 同样设为'RotoWire'以确保一致性
✅ 完整可运行示例:
import pandas as pd
import requests
# 替换为最新 slateID(见下方获取方式)
payload = {
'siteID': '1', # DraftKings
'slateID': '6441', # 示例 ID,需动态更新
'projSource': 'RotoWire',
'rst': 'RotoWire'
}
url = 'https://www.rotowire.com/daily/tables/optimizer-mlb.php'
response = requests.get(url, params=payload)
response.raise_for_status() # 检查请求是否成功
data = response.json()
df = pd.DataFrame(data)
print(f"成功加载 {len(df)} 名球员数据")
print(df[['playerID', 'name', 'team', 'position', 'salary', 'fpts', 'value']].head())⚠️ 注意事项:
-
slateID是动态的:每天不同,且可能因比赛延期/取消而变更。建议通过主页面 HTML 解析<script></script>中的slateID变量,或访问https://www.rotowire.com/daily/mlb/optimizer.htm后检查 Network 面板中/tables/optimizer-mlb.php请求的真实参数。 - 字段名区分大小写(如
'fpts'而非'Fpts.'),原始 JSON 键名为小驼峰格式,与网页表头不完全一致,需查阅返回结构确认列名。 - 接口无公开文档,但参数稳定;高频请求建议添加
headers={'User-Agent': 'Mozilla/5.0...'}并控制频率,避免被限流。
? 小结:面对 JS 渲染页面,优先排查是否存在配套 API —— 这比启动 Selenium 等重量级方案更高效、稳定、易维护。Rotowire 的此接口正是典型范例:轻量、结构化、免登录,只需掌握参数逻辑即可可靠获取生产级数据。

















