You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BS4从巴塞罗那官网获取西甲24-25赛季积分榜数据失败,仅返回23-24赛季数据

使用BS4从巴塞罗那官网获取西甲24-25赛季积分榜数据失败,仅返回23-24赛季数据

嘿,我来帮你分析下问题根源,以及对应的解决方案~

你遇到的情况其实很典型:巴塞罗那官网的24-25赛季积分榜是动态加载的。你用requests.get()拿到的只是页面的初始静态HTML,而页面默认渲染的是上一赛季(23-24)的数据,最新赛季的内容是在页面加载完成后,通过JavaScript异步请求后端接口获取并渲染出来的。requests没法执行页面里的JavaScript,所以自然拿不到动态加载的新赛季数据。

下面给你两种可行的解决思路:

方案一:用Selenium模拟浏览器加载动态内容

Selenium可以模拟真实浏览器打开页面,等待JavaScript渲染完成后再抓取数据,完美适配动态加载的场景。

步骤和代码示例:

  1. 先安装Selenium和对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配)
  2. 用代码模拟打开页面,切换到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格式的数据,速度更快。

操作步骤:

  1. 打开巴塞罗那官网的积分榜页面,按F12打开开发者工具,切换到「Network」标签
  2. 点击页面上的赛季切换按钮,选择24/25赛季
  3. 在Network的请求列表里,筛选「XHR」类型的请求,找到返回积分榜数据的接口(通常是类似standings、table相关的URL)
  4. 复制这个接口的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:24:29