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

Python Scrapy爬取SofaScore足球直播站XPath无返回值问题

问题原因

你拿不到数据核心有3个问题:

  1. SofaScore的赛事数据全部是前端JavaScript异步加载的:Scrapy默认发起请求只会拿到页面初始返回的静态HTML,不会执行页面里的JS逻辑,你在浏览器里看到的赛事列表、比分这些内容,都是页面加载完成后再调用接口拉取数据渲染出来的,初始HTML里根本不存在这些DOM节点。你可以在parse方法里先加一句with open("test.html", "w", encoding="utf-8") as f: f.write(response.text),把Scrapy拿到的页面内容存到本地打开看,就会发现里面只有空的容器标签和JS资源引用,完全没有赛事相关内容,写再多层级的XPath也不可能找到结果。
  2. 你用的是从浏览器开发者工具直接复制的绝对XPath,这种路径完全靠数div层级定位,只要页面插个广告、调整下布局结构、改个嵌套层级,路径直接失效,鲁棒性极差,根本不适合爬虫场景使用。
  3. 你的start_urls写的是http协议地址,目前SofaScore全站强制跳转https,虽然Scrapy默认会跟进重定向,但没必要留这个不必要的隐患。
解决方案

优先选择直接调用站点的公开数据接口,这是稳定性最高、效率最高的方案,完全不需要解析HTML、不需要等JS渲染:

  1. 打开SofaScore站点,按F12打开浏览器开发者工具,切换到「网络」面板,筛选「Fetch/XHR」类型请求,刷新页面。
  2. 找到路径格式类似/api/v1/sport/football/scheduled-events/[日期]的请求,这个接口直接返回指定日期所有赛事的结构化JSON数据,对阵双方、开赛时间、实时比分、技术统计、球员数据全在返回结果里,直接解析JSON就行,连XPath都不用写。
  3. 请求接口的时候记得在请求头里带上正常的User-Agent和站点Referer,避免被反爬拦截返回403。

如果确实需要解析渲染后的页面DOM,可以给Scrapy集成scrapy-playwright渲染组件,配置后会自动启动无头浏览器加载页面、执行所有JS逻辑,等页面全部渲染完成后再交给解析函数提取内容。这种方案要注意:

  • 不要用数层级的绝对XPath,优先用节点的固定属性(比如data-testid、专属class名)做定位,稳定性会高很多
  • 写解析逻辑前先把拿到的响应内容存成本地文件打开,确认你要提取的节点确实存在于响应内容里,再写对应的提取规则,避免做无用功

参考基础实现代码:

import scrapy
import json

class SofascoreSpider(scrapy.Spider):
    name = 'SofaScore'
    allowed_domains = ['sofascore.com']
    # 替换为你要抓取的日期对应的接口地址即可
    start_urls = ['https://api.sofascore.com/api/v1/sport/football/scheduled-events/2024-06-10']
    custom_settings = {
        "DEFAULT_REQUEST_HEADERS": {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
            "Referer": "https://www.sofascore.com/"
        }
    }

    def parse(self, response):
        data = json.loads(response.text)
        events = data.get("events", [])
        for event in events:
            yield {
                "home_team": event["homeTeam"]["name"],
                "away_team": event["awayTeam"]["name"],
                "start_time": event["startTimestamp"],
                "home_score": event["homeScore"]["current"],
                "away_score": event["awayScore"]["current"],
                # 其余需要的统计字段可直接从JSON结构中提取
            }

小提示:不要上来就复制浏览器里的XPath直接用,先确认你要抓的内容到底是静态渲染的还是异步加载的,能拿接口就优先拿接口,比解析HTML省事太多。

内容的提问来源于stack exchange,提问作者Henrique Mazetti Ferraz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:45:51