如何抓取网站动态表格?Sofascore球员统计表格爬取求助
解决Sofascore球员统计表格抓取问题
原代码核心问题分析
- 动态类名定位不可靠:你使用的
sc-c347313f-8.kLmLmP是前端框架生成的动态类名,页面刷新或网站更新后会失效,无法稳定定位表格元素。 - 未触发表格加载:Player Statistics表格位于页面底部,不滚动到该区域时,页面不会主动加载表格内容。
- 忽略前置交互:网站存在Cookie授权弹窗,不处理会阻塞后续元素的渲染和定位。
- 等待条件不合理:
presence_of_element_located仅确认元素存在于DOM,但表格可能还未完成渲染,应使用确认元素可见的等待条件。
修改后的可运行代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains import pandas as pd driver = webdriver.Chrome() url = "https://www.sofascore.com/tournament/football/azerbaijan/misli-premier-league/709#id:64075" try: driver.get(url) wait = WebDriverWait(driver, 30) # 处理Cookie授权弹窗(若存在) try: accept_cookie_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Accept')]"))) accept_cookie_btn.click() except: pass # 无弹窗则跳过 # 滚动到Player Statistics区域,触发表格加载 player_stats_title = wait.until(EC.visibility_of_element_located((By.XPATH, "//h2[text()='Player Statistics']"))) ActionChains(driver).move_to_element(player_stats_title).perform() # 等待表格可见,通过标题关联的父容器定位,避免依赖动态类 table = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@class, 'sc-c347313f-0')]//table"))) # 等待所有表格行加载完成 rows = wait.until(EC.presence_of_all_elements_located((By.XPATH, ".//tr"))) table_data = [] for row in rows: # 同时获取表头(th)和数据单元格(td) cells = row.find_elements(By.XPATH, ".//td | .//th") row_data = [cell.text.strip() for cell in cells if cell.text.strip()] if row_data: table_data.append(row_data) # 整理表头与数据,生成规范DataFrame df = pd.DataFrame(table_data[1:], columns=table_data[0]) print("抓取到的球员统计数据:") print(df) df.to_csv("player_statistics.csv", index=False) finally: driver.quit()
关键改动说明
- 稳定定位逻辑:通过
Player Statistics标题文本锁定目标区域,再查找下方表格,彻底摆脱对动态类名的依赖。 - 强制触发加载:通过滚动到标题位置,触发页面加载底部的表格内容。
- 交互阻塞处理:增加Cookie弹窗处理逻辑,避免页面交互阻塞后续操作。
- 优化等待策略:使用
visibility_of_element_located确保表格可见,presence_of_all_elements_located等待所有行加载完成,避免抓取不完整数据。 - 规范数据结构:将第一行表头与后续数据行分离,生成结构规范的DataFrame。
内容的提问来源于stack exchange,提问作者Isgender Ceferli
相关产品推荐
相关产品推荐

