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

Scrapy足球赛事爬虫漏采数据问题排查求助

足球赛事Scrapy爬虫数据漏采排查与修复

问题背景

开发的Scrapy爬虫用于解析足球赛事数据,整体运行正常,但在目标赛事页面中,JSON输出缺失第34分钟的进球数据,需排查原因并修复。

核心问题分析

从代码片段和目标页面来看,漏采的主要原因是字典键重复导致数据覆盖:

  • 代码中table_data采用字典类型,用player_name作为键存储进球信息。若同一球员有多粒进球(比如目标页面中Marc Guiu在34分钟和57分钟均有进球),后一条数据会直接覆盖前一条,导致早于后续时间的进球记录丢失。
  • 次要问题:球员名称选择器未做容错处理,若出现无球员名称的行,strip()会引发报错;进球类型判断使用多个独立if,逻辑不够严谨(虽不直接导致漏采,但可能引发类型赋值错误)。

修复方案

将存储进球数据的结构从字典改为列表,确保同一球员的多粒进球都能被保留;同时完善选择器容错和判断逻辑:

case "Gols":
    table_data = []  # 替换字典为列表,避免键重复覆盖
    for row in table.css("tbody tr"):
        # 球员名称容错处理
        player_name_elem = row.xpath("string(td/a)").get()
        if not player_name_elem:
            continue  # 跳过无有效球员名称的行
        player_name = player_name_elem.strip()
        
        timestamp_acta = ""
        tipus_gol = ""
        
        # 改用elif优化进球类型判断逻辑
        if row.css(".faf-pilota_base.p-a.stat-center.gol-normal"):
            tipus_gol = "Normal"
        elif row.css(".faf-pilota_base.p-a.stat-center.gol-propia"):
            tipus_gol = "Propia"
        elif row.css(".faf-pilota_base.p-a.stat-center.gol-penal"):
            tipus_gol = "Penal"
        else:
            tipus_gol = "Desconegut"  # 增加默认值,避免空类型
        
        # 时间戳容错处理
        timestamp = row.css("td:last-child::text").get()
        if timestamp:
            timestamp = timestamp.strip()
        
        # 将单条进球数据加入列表
        table_data.append({
            "Jugador": player_name,
            "Minut": timestamp,
            "Tipus": tipus_gol
        })

修复说明

  1. 字典转列表:列表结构可存储多条同一球员的进球记录,彻底解决数据覆盖问题;
  2. 容错处理:对球员名称、时间戳增加空值判断,避免爬虫因异常数据中断;
  3. 逻辑优化:将进球类型的多if改为elif,确保同一行只会匹配一种进球类型,避免重复赋值。

内容的提问来源于stack exchange,提问作者Avaya Tech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:42:24