
本文详解使用selenium替代requests+beautifulsoup抓取fbref英超积分榜时出现的链接重复、混入非英超球队等问题,提供可复现的css选择器方案与健壮性处理技巧。
本文详解使用selenium替代requests+beautifulsoup抓取fbref英超积分榜时出现的链接重复、混入非英超球队等问题,提供可复现的css选择器方案与健壮性处理技巧。
FBref(https://www.php.cn/link/9cad0858e4ff44b60027bce772794a09。
更关键的是,FBref为不同赛季生成唯一ID表格(如#results2024-202591_overall),且每行球队单元格(<td>)通过<code>data-stat="team"属性标识,内部嵌套<a></a>标签。这意味着:必须等待JS完全加载目标表格后,再精准定位该特定tbody下的团队链接——这超出了requests的能力边界。
✅ 正确解法是采用浏览器自动化工具 Selenium + ChromeDriver,模拟真实用户行为,确保页面完全渲染后再提取:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 配置无头模式(后台运行,不弹窗)
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
url = "https://fbref.com/en/comps/9/Premier-League-Stats"
with webdriver.Chrome(options=chrome_options) as driver:
driver.get(url)
# 等待目标表格中的所有球队链接加载完成(显式等待,比time.sleep()更可靠)
wait = WebDriverWait(driver, 15)
selector = "#results2024-202591_overall tbody tr td[data-stat='team'] a"
team_links = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, selector)))
# 提取并去重(尽管Selenium已精准定位,仍建议去重保障鲁棒性)
urls = list(set(link.get_attribute("href") for link in team_links))
urls.sort() # 可选:按字母序排列便于验证
print(f"成功抓取 {len(urls)} 支英超球队链接:")
for u in urls:
print(u)
? 关键要点说明:
-
CSS选择器
#results2024-202591_overall tbody tr td[data-stat='team'] a是核心:它严格限定在当季英超主表格内(ID含年份与联赛编号),避免抓取导航栏、历史赛季或全球其他联赛的squads链接; -
presence_of_all_elements_located确保元素真实可见,而非仅存在于HTML源码; -
set()去重可防御极少数因页面重绘导致的临时重复(虽Selenium已大幅降低此风险); - 若需长期维护,建议将赛季ID(如
2024-202591)改为动态解析:先用Selenium定位<div id="meta">中赛季标题,再拼接生成对应表格ID,实现版本自适应。<p>⚠️ 注意事项: </p> <ul> <li>务必安装匹配版本的ChromeDriver(<a href="https://www.php.cn/link/da2ffb5687d0e20069a8921eff310602" rel="nofollow" target="_blank">https://www.php.cn/link/da2ffb5687d0e20069a8921eff310602</a>),或使用<code>webdriver-manager自动管理; - 遵守
robots.txt及网站条款,添加time.sleep(1)间隔请求,避免高频访问; - FBref明确禁止商业用途爬取,学术/个人学习请标注数据来源。
通过以上方案,你将获得一份纯净、准确、无冗余的当季英超20支参赛队官方数据页链接列表——这才是Web Scraping工程化落地的关键一步。










