如何用Python循环爬取多页面NFL球员赛事统计数据?
NFL球员数据批量爬取与筛选实现方案
核心实现思路
- 将原有单页爬取逻辑封装为可复用函数,传入年份参数自动拼接目标URL
- 遍历指定年份列表批量爬取数据,合并为全量数据集
- 对全量数据做类型转换后,按球员分组筛选符合出场要求的首个赛季数据
- 增加请求延时,避免触发站点反爬机制
前置依赖
首先确认你已经导入所有需要的库:
import pandas as pd import time from bs4 import BeautifulSoup from urllib.request import urlopen
步骤1:封装单赛季数据爬取函数
这里会保留出场次数字段G用于后续筛选,同时额外增加season字段标记数据对应的赛季:
def get_season_passing_data(year): # 按格式拼接对应年份的URL url = f'https://www.pro-football-reference.com/years/{year}/passing.htm' # 发起请求解析页面 html = urlopen(url) stats_page = BeautifulSoup(html, 'html.parser') # 提取表头 column_headers = stats_page.findAll('tr')[0] column_headers = [i.getText() for i in column_headers.findAll('th')] # 提取表体数据 rows = stats_page.findAll('tr')[1:] qb_stats = [] for i in range(len(rows)): qb_stats.append([col.getText() for col in rows[i].findAll('td')]) # 转为DataFrame并处理列名 data = pd.DataFrame(qb_stats, columns = column_headers[1:]) new_columns = data.columns.values new_columns[-6] = 'y_sack' data.columns = new_columns # 增加赛季字段标记年份 data['season'] = year # 保留需要的字段:球员名、球队、出场数、目标统计维度、赛季 categories = ['Cmp%', 'Yds', 'TD', 'Int', 'Y/A', 'Rate'] data_radar = data[['Player', 'Tm', 'G'] + categories] return data_radar
步骤2:批量爬取指定年份数据
替换下方target_years为你实际需要爬取的年份列表即可:
# 替换为你需要爬取的年份列表 target_years = [2012, 2015, 2018, 2021, 2022] all_data = [] for year in target_years: season_data = get_season_passing_data(year) all_data.append(season_data) # 设置2秒延时,避免请求过频被站点封禁 time.sleep(2) # 合并所有赛季数据为全量数据集 df_all = pd.concat(all_data, ignore_index=True)
步骤3:筛选11名目标球员+首个出场超10场的赛季
# 替换为你要查询的11名目标球员名单 target_players = ['Mac Jones', 'xxx', 'xxx'] df_target = df_all[df_all['Player'].isin(target_players)].copy() # 将数值字段从字符串转为数值类型,方便后续计算筛选 num_cols = ['G', 'Cmp%', 'Yds', 'TD', 'Int', 'Y/A', 'Rate'] df_target[num_cols] = df_target[num_cols].apply(pd.to_numeric, errors='coerce') # 先过滤出场次>10的记录,再按球员分组,取赛季最小的第一条记录(即首个符合要求的赛季) df_result = df_target[df_target['G'] > 10].sort_values('season').groupby('Player').first().reset_index()
最终输出的df_result就是11名球员各自首个出场超10场赛季的目标维度数据,可直接用于和新秀数据做对比。
内容的提问来源于stack exchange,提问作者GLVieira
相关产品推荐
相关产品推荐

