如何用Python抓取Statcast动态加载的Park Factors表格?
解决Statcast Park Factors表格抓取问题
问题根源
原代码通过By.TAG_NAME抓取页面第一个表格,而目标包含wOBACon、BACON等字段的Park Factors表格并非页面首个表格;同时原等待条件仅判断是否存在任意表格,未等待目标表格完成AJAX加载,导致定位失败或索引越界。
修正后的Selenium抓取代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd from io import StringIO import time # 目标Park Factors页面URL url = "https://baseballsavant.mlb.com/leaderboard/statcast-park-factors?type=year&year=2024&batSide=L&stat=index_wOBA&condition=All&rolling=" # 初始化WebDriver(以Firefox为例,Chrome需替换为webdriver.Chrome()) driver = webdriver.Firefox() driver.get(url) try: # 滚动到页面底部,触发动态数据加载(部分表格内容需滚动后渲染) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) # 等待目标表格(ID为parkFactors)可见,延长超时时间确保AJAX加载完成 park_table = WebDriverWait(driver, 15).until( EC.visibility_of_element_located((By.ID, "parkFactors")) ) # 提取表格HTML并解析为DataFrame table_html = park_table.get_attribute("outerHTML") df = pd.read_html(StringIO(table_html))[0] # 输出结果 print(df) finally: # 确保浏览器关闭 driver.quit()
本地HTML文件测试方案
如果使用本地保存的HTML副本练习,可直接通过pandas遍历所有表格,定位目标表格:
import pandas as pd # 读取本地HTML中的所有表格 tables = pd.read_html("本地文件路径.html") # 遍历表格列表,通过列名识别目标表格 for idx, table in enumerate(tables): columns = table.columns.tolist() # 检查是否包含目标字段(如wOBACon、BACON) if "wOBACon" in columns and "BACON" in columns: target_df = table print(f"找到目标表格,索引为{idx}") print(target_df) break
额外排查点
- 若
By.ID="parkFactors"仍定位失败:检查浏览器开发者工具,确认表格是否嵌套在iframe内。若是,需先切换iframe:# 切换到包含表格的iframe(需根据实际iframe元素调整选择器) iframe = driver.find_element(By.TAG_NAME, "iframe") driver.switch_to.frame(iframe) - 若表格数据不完整:可增加滚动次数或延长等待时间,确保所有动态加载的行渲染完成。
内容的提问来源于stack exchange,提问作者gredow1979
相关产品推荐
相关产品推荐

