如何修复Selenium批量抓取足球赛事数据无输出无报错的代码
Selenium足球赛事批量抓取及入库修正方案
需求背景
用于非盈利个人学习,目标是抓取瑞典超级联赛26轮赛事数据,每轮包含8条比赛记录,单条记录包含字段:轮次(Round)、日期(Date)、主队(Team_Home)、客队(Team_Away)、主队得分(Result_Home)、客队得分(Result_Away),最终批量存入SQLite数据库。
预期输出格式示例:
#SWEDEN ALLSVENKAN #Round, Date, Team_Home, Team_Away, Result_Home, Result_Away Round 1, 11/31/2021 20:45, AIK Stockholm, Malmo, 2, 1 Round 1, 11/31/2021 20:45, Elfsborg, Gothenburg, 2, 3 ... Round 2, 06/12/2021 20:45, Gothenburg, AIK Stockholm, 0, 1 ...
原有代码核心问题
- 循环逻辑错误:未定义
multiple_scraping就直接作为循环遍历对象,代码无法进入循环,自然没有输出 - 元素操作错误:
find_elements返回的是元素列表,不能直接调用.text属性获取内容 - CSS选择器错误:给轮次、比赛时间等元素添加了
a[href^='/squadra']的错误限制,这类元素并非指向球队页面的链接,会导致无法匹配到元素 - 缩进与语法错误:数据库插入代码缩进错误、
driver.close未加括号属于未调用方法、插入数据库时元组多嵌套了一层,不符合executemany的参数要求 - 匹配逻辑错误:一次性拉取所有轮次、日期、主队列表,无法保证不同列表的索引一一对应,容易出现数据错位
修正后完整可运行代码
import sqlite3 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait # 初始化驱动 driver = webdriver.Chrome() wait = WebDriverWait(driver, 15) Values_Allsvenskan = [] # 加载目标页面 driver.get("替换为你的目标赛事页面链接") driver.implicitly_wait(12) # 循环点击加载更多按钮,直到所有比赛都加载完成 while True: try: load_more_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[id='event__more event__more--static']"))) load_more_btn.click() # 等待加载完成 driver.implicitly_wait(3) except: break # 获取所有行:包含轮次标题行 + 比赛记录行 all_rows = driver.find_elements(By.CSS_SELECTOR, "div[class^='event__round'],div[class^='event__match']") results = [] # 存储当前遍历到的轮次,默认初始值为? current_round = '?' for row in all_rows: classes = row.get_attribute('class') # 判断当前行是轮次标题行 if 'event__round' in classes: current_round = row.text.strip() continue # 判断当前行是比赛记录行,提取字段 elif 'event__match' in classes: try: date = row.find_element(By.CSS_SELECTOR, "div[class^='event__time']").text.strip() team_home = row.find_element(By.CSS_SELECTOR, "div[class^='event__participant event__participant--home']").text.strip() team_away = row.find_element(By.CSS_SELECTOR, "div[class^='event__participant event__participant--away']").text.strip() score_home = row.find_element(By.CSS_SELECTOR, "div[class^='event__score event__score--home']").text.strip() score_away = row.find_element(By.CSS_SELECTOR, "div[class^='event__score event__score--away']").text.strip() # 组装为一条记录存入结果列表 results.append((current_round, date, team_home, team_away, score_home, score_away)) # 打印验证 print(f"{current_round}, {date}, {team_home}, {team_away}, {score_home}, {score_away}") except Exception as e: # 单条记录抓取失败跳过,避免整个程序崩溃 print(f"单条记录抓取失败:{e}") continue # 关闭浏览器 driver.close() # 批量插入SQLite数据库 con = sqlite3.connect('database.db') cursor = con.cursor() sqlite_insert_query_Allsvenskan = 'INSERT INTO All_Score(current_round, date, team_home, team_away, score_home, score_away) VALUES (?, ?, ?, ?, ?, ?);' cursor.executemany(sqlite_insert_query_Allsvenskan, results) con.commit() con.close() print(f"共成功插入{cursor.rowcount}条记录")
逻辑说明
- 页面预加载:先循环点击加载更多按钮,把所有26轮的比赛记录全部加载出来,避免只能抓到第一页数据
- 行遍历匹配:页面所有数据行只有两类,轮次标题行和比赛记录行,遍历到轮次标题就更新当前轮次变量,后续的所有比赛记录都归属到该轮次下,完全避免轮次和比赛匹配错位的问题
- 相对路径查找:所有比赛字段都在当前比赛行内部查找,不需要维护多个列表的索引对应关系,数据准确性更高
- 异常兼容:单条记录抓取失败会跳过不影响整体运行,插入完成后会打印成功插入的条数方便校验
内容的提问来源于stack exchange,提问作者Erling Olsen
相关产品推荐
相关产品推荐

