使用Python爬取网页中大学运动员NIL数据表格的问题
爬取大学运动员NIL数据的问题与解决方案
需求说明
需要从目标网站爬取每位运动员的以下信息,并整理为Pandas DataFrame:
- 运动员姓名
- 赞助商列表(若有多个赞助商,姓名、院校、项目需与每个赞助商对应成行)
- 所属院校
- 运动项目
原代码问题
原代码存在多处逻辑错误,导致无法正确提取数据:
- 函数
scrapeDeals的参数url未被使用,直接调用全局变量urlopen_req pd.read_html的调用无实际作用,未正确处理表格结构- 遍历表格行时未跳过表头,会导致提取表头文本时出错
- 提取赞助商的逻辑错误,重复添加同一赞助商且未拆分多赞助商条目
- 未实现院校和项目信息的提取逻辑
修正后的完整代码
import pandas as pd import requests from bs4 import BeautifulSoup # 请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36' } def scrape_nil_data(): # 获取页面内容 url = "https://nilcollegeathletes.com/athletes" response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 定位目标表格 table = soup.find('table') if not table: print("未找到目标表格") return pd.DataFrame() # 初始化数据存储列表 nil_data = [] # 遍历表格行,跳过表头行 rows = table.find_all('tr')[1:] for row in rows: cols = row.find_all('td') if len(cols) < 4: # 跳过列数不足的异常行 continue # 提取基础信息 athlete_name = cols[0].get_text(strip=True) college = cols[2].get_text(strip=True) sport = cols[3].get_text(strip=True) # 提取赞助商列表 sponsor_col = cols[1] sponsors = sponsor_col.find_all('li') if sponsors: # 每个赞助商对应一行数据 for sponsor in sponsors: sponsor_name = sponsor.get_text(strip=True) nil_data.append({ '姓名': athlete_name, '赞助商': sponsor_name, '所属院校': college, '运动项目': sport }) else: # 处理无赞助商的情况 nil_data.append({ '姓名': athlete_name, '赞助商': None, '所属院校': college, '运动项目': sport }) # 转换为DataFrame df = pd.DataFrame(nil_data) return df # 执行爬取并输出结果 if __name__ == "__main__": result_df = scrape_nil_data() print(result_df.head()) # 可选:保存数据到CSV文件 # result_df.to_csv('nil_athlete_data.csv', index=False, encoding='utf-8-sig')
代码说明
- 请求处理:使用
requests带上合法User-Agent获取页面,避免被反爬拦截 - 表格定位:通过BeautifulSoup定位目标表格,直接跳过表头行处理数据
- 信息提取:按列依次提取姓名、院校、项目,再拆分赞助商列的多个条目
- 数据结构化:将每个赞助商与运动员基础信息一一对应,生成符合要求的行数据
- 异常处理:跳过列数不足的异常行,处理无赞助商的边界情况,避免程序崩溃
内容的提问来源于stack exchange,提问作者Sweet_T
相关产品推荐
相关产品推荐

