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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:57:04