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 })
修复说明
- 字典转列表:列表结构可存储多条同一球员的进球记录,彻底解决数据覆盖问题;
- 容错处理:对球员名称、时间戳增加空值判断,避免爬虫因异常数据中断;
- 逻辑优化:将进球类型的多
if改为elif,确保同一行只会匹配一种进球类型,避免重复赋值。
内容的提问来源于stack exchange,提问作者Avaya Tech
相关产品推荐
相关产品推荐

