如何修改Python爬虫代码抓取网页第二个表格的门将统计数据
NHL数据爬取问题解决方案
问题背景
需要从2021-2022赛季NHL联赛统计页面爬取球员数据,现有代码可正常爬取滑手统计数据,但将CSS选择器修改为.goalie-stats尝试爬取门将数据时运行报错。
原有可正常爬取滑手数据的代码如下:
import requests import pandas as pd from bs4 import BeautifulSoup dfs = [] for page in range(1,10): url = f"https://www.eliteprospects.com/league/nhl/stats/2021-2022?sort=tp&page={page}" print(f"Loading {url=}") soup = BeautifulSoup(requests.get(url).content, "html.parser") df = ( pd.read_html(str(soup.select_one(".player-stats")))[0] .dropna(how="all") .reset_index(drop=True) ) dfs.append(df) df_final = pd.concat(dfs).reset_index(drop=True) print(df_final) df_final.to_csv("data.csv", index=False)
报错原因
修改选择器后报错的核心原因是带sort=tp参数的请求返回的HTML中,根本不存在class为goalie-stats的表格元素:
- 站点的滑手、门将数据分模块独立加载,
sort=tp是滑手总得分排序参数,请求该类页面时只会渲染滑手统计表(.player-stats) - 门将数据需要使用门将专属的排序参数发起请求,页面才会渲染门将统计表(
.goalie-stats),常用的门将排序参数有svp(扑救率)、gaa(场均失球)、wins(胜场)、so(零封场次) - 两类数据的分页互相独立,不能直接复用滑手的分页遍历逻辑
可正常爬取门将数据的修改后代码
import requests import pandas as pd from bs4 import BeautifulSoup goalie_dfs = [] # 以扑救率排序为例遍历门将数据页 for page in range(1, 15): url = f"https://www.eliteprospects.com/league/nhl/stats/2021-2022?sort=svp&page={page}" print(f"正在加载: {url=}") resp = requests.get(url) resp.raise_for_status() soup = BeautifulSoup(resp.content, "html.parser") goalie_table = soup.select_one(".goalie-stats") # 无表格时终止遍历 if not goalie_table: print(f"第{page}页无更多门将数据,爬取结束") break df = ( pd.read_html(str(goalie_table))[0] .dropna(how="all") .reset_index(drop=True) ) goalie_dfs.append(df) df_goalies = pd.concat(goalie_dfs).reset_index(drop=True) print(df_goalies) df_goalies.to_csv("nhl_2021-2022_goalies.csv", index=False)
补充说明
- 如果需要按其他维度排序门将数据,直接替换url中
sort=后的参数即可 - 如果需要同时爬取滑手和门将数据,分开编写两个遍历循环即可,单次请求只会返回对应排序模块的单个表格,不要尝试在同一个页面响应中同时解析两个表格
内容的提问来源于stack exchange,提问作者KauaiGuy
相关产品推荐
相关产品推荐

