使用BS4从巴塞罗那官网获取西甲24-25赛季积分榜数据失败,仅返回23-24赛季数据
使用BS4从巴塞罗那官网获取西甲24-25赛季积分榜数据失败,仅返回23-24赛季数据
嘿,我来帮你分析下问题根源,以及对应的解决方案~
你遇到的情况其实很典型:巴塞罗那官网的24-25赛季积分榜是动态加载的。你用requests.get()拿到的只是页面的初始静态HTML,而页面默认渲染的是上一赛季(23-24)的数据,最新赛季的内容是在页面加载完成后,通过JavaScript异步请求后端接口获取并渲染出来的。requests没法执行页面里的JavaScript,所以自然拿不到动态加载的新赛季数据。
下面给你两种可行的解决思路:
方案一:用Selenium模拟浏览器加载动态内容
Selenium可以模拟真实浏览器打开页面,等待JavaScript渲染完成后再抓取数据,完美适配动态加载的场景。
步骤和代码示例:
- 先安装Selenium和对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配)
- 用代码模拟打开页面,切换到24-25赛季,再提取数据:
from bs4 import BeautifulSoup 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 import time url = 'https://www.fcbarcelona.com/en/football/first-team/standings' # 初始化Chrome浏览器驱动(确保ChromeDriver已在系统PATH中,或者指定路径) driver = webdriver.Chrome() driver.get(url) try: # 等待赛季切换按钮加载完成,并点击切换到24/25赛季 season_switch = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//button[contains(text(), '24/25')]")) ) season_switch.click() time.sleep(2) # 给页面一点时间刷新数据 # 等待积分榜元素加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "team-row__name--short")) ) # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'html.parser') # 提取球队名称 team_names = [ team.text.replace("\n", "").strip() for team in soup.find_all("span", class_="team-row__name--short") ] print("24-25赛季球队列表:", team_names) # 提取积分 points = [ point.text.replace("\n", "").strip() for point in soup.find_all("td", class_="table-stat-row table-stat-row--points") ] print("对应积分:", points) finally: # 关闭浏览器 driver.quit()
方案二:直接抓取动态数据的API接口(更高效)
如果不想用Selenium,你可以通过浏览器的开发者工具找到页面加载积分榜的API接口,直接请求这个接口获取JSON格式的数据,速度更快。
操作步骤:
- 打开巴塞罗那官网的积分榜页面,按F12打开开发者工具,切换到「Network」标签
- 点击页面上的赛季切换按钮,选择24/25赛季
- 在Network的请求列表里,筛选「XHR」类型的请求,找到返回积分榜数据的接口(通常是类似
standings、table相关的URL) - 复制这个接口的URL,直接用
requests请求它,解析JSON数据即可
代码示例(假设找到的API接口如下,实际需要你自己抓包确认):
import requests # 替换为你实际抓包得到的24-25赛季积分榜API接口 api_url = "https://api.fcbarcelona.com/v1/football/first-team/standings/2024-2025" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36" } response = requests.get(api_url, headers=headers) response.raise_for_status() # 检查请求是否成功 standings_data = response.json() # 解析JSON提取球队和积分(具体字段根据API返回结构调整) team_names = [item["team"]["shortName"] for item in standings_data["data"]] points = [item["points"] for item in standings_data["data"]] print("24-25赛季球队列表:", team_names) print("对应积分:", points)
小提示:
API接口可能会随着网站更新而变化,如果你发现接口失效了,重新抓包找新的接口就行;另外,请求时尽量带上浏览器的User-Agent头,避免被网站拦截。
备注:内容来源于stack exchange,提问作者Manas Sujal Abraham
相关产品推荐
相关产品推荐

