Python Scrapy爬取SofaScore足球直播站XPath无返回值问题
问题原因
你拿不到数据核心有3个问题:
- 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也不可能找到结果。 - 你用的是从浏览器开发者工具直接复制的绝对XPath,这种路径完全靠数div层级定位,只要页面插个广告、调整下布局结构、改个嵌套层级,路径直接失效,鲁棒性极差,根本不适合爬虫场景使用。
- 你的
start_urls写的是http协议地址,目前SofaScore全站强制跳转https,虽然Scrapy默认会跟进重定向,但没必要留这个不必要的隐患。
解决方案
优先选择直接调用站点的公开数据接口,这是稳定性最高、效率最高的方案,完全不需要解析HTML、不需要等JS渲染:
- 打开SofaScore站点,按F12打开浏览器开发者工具,切换到「网络」面板,筛选「Fetch/XHR」类型请求,刷新页面。
- 找到路径格式类似
/api/v1/sport/football/scheduled-events/[日期]的请求,这个接口直接返回指定日期所有赛事的结构化JSON数据,对阵双方、开赛时间、实时比分、技术统计、球员数据全在返回结果里,直接解析JSON就行,连XPath都不用写。 - 请求接口的时候记得在请求头里带上正常的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
相关产品推荐
相关产品推荐

