如何从分页表格中爬取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
相关产品推荐
相关产品推荐

