You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从分页表格中爬取MLB春训球员数据?

修正MLB春训球员数据爬取代码(含分页迭代)

原代码存在的问题

  • 模块导入错误:import request 拼写错误,应为 import requests
  • 变量引用错误:调用requests.get(url2)时,url2未定义,需替换为已声明的url
  • 表头提取逻辑错误:错误依赖th内的button元素提取表头,部分表头无button,且循环赋值会导致值覆盖
  • 球员姓名提取逻辑错误:错误从th中获取球员名,实际球员名位于表格每行的第一个td标签内
  • 数据填充逻辑错误:使用datos_mlb.iloc[:,1:] = data_fila会将所有行的后续列覆盖为当前行数据,而非追加新行
  • 缺少分页处理:未实现多页数据的请求与整合逻辑

修正后的完整代码

import requests
import pandas as pd
from bs4 import BeautifulSoup

def scrape_mlb_spring_training(page_num):
    # 构造分页URL,MLB分页使用page参数
    url = f'https://www.mlb.com/es/stats/spring-training?page={page_num}'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    }
    # 发送请求,添加请求头模拟浏览器
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'lxml')
    
    # 定位表格
    table = soup.find('table', class_="bui-table is-desktop-sKqjv9Sb")
    if not table:
        return pd.DataFrame()
    
    # 提取表头:优先取button文本,无button则直接取th文本
    headers = []
    for th in table.find_all('th'):
        button = th.find('button')
        if button:
            headers.append(button.text.strip())
        else:
            headers.append(th.text.strip())
    
    # 提取表格行数据
    rows = []
    for tr in table.find_all('tr')[1:]:  # 跳过表头行
        row_data = []
        for td in tr.find_all('td'):
            # 处理球员名(包含链接的文本)
            a_tag = td.find('a')
            if a_tag:
                row_data.append(a_tag.text.strip())
            else:
                row_data.append(td.text.strip())
        if row_data:
            rows.append(row_data)
    
    # 转为DataFrame
    df = pd.DataFrame(rows, columns=headers)
    return df

# 主逻辑:遍历所有分页,直到返回空DataFrame(无更多数据)
all_data = pd.DataFrame()
page = 1
while True:
    print(f"正在爬取第 {page} 页...")
    page_df = scrape_mlb_spring_training(page)
    if page_df.empty:
        break
    all_data = pd.concat([all_data, page_df], ignore_index=True)
    page += 1

# 保存数据到CSV
all_data.to_csv('mlb_spring_training_stats.csv', index=False, encoding='utf-8-sig')
print("爬取完成,数据已保存到mlb_spring_training_stats.csv")

代码说明

  • 新增请求头:模拟浏览器请求,避免被网站拦截
  • 分页处理:通过page参数构造分页URL,循环请求直到无数据返回
  • 表头提取优化:兼容有/无button的表头元素,避免遗漏
  • 数据提取修正:正确从每行td中提取数据,处理球员名的链接文本
  • 数据整合:用pd.concat逐页合并数据,最后保存为CSV文件

内容的提问来源于stack exchange,提问作者Esteban Madrigal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:10:28