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

Scrapy爬虫采集NFL天气数据部分请求失败问题排查求助

NFLWeather爬虫部分请求失败的原因及修复

问题现象

  • 爬虫采集nflweather.com数据时,2012年第6周正常,第7周无返回结果,第8周采集2条数据后报错
  • 确认失败请求的页面HTML结构与正常页面一致
  • 报错仅显示Scrapy迭代器的栈顶信息,未暴露具体错误:

    第7周报错:

    ERROR: Spider error processing <GET https://nflweather.com/week/2012/week-7> (referer: None)
    Traceback (most recent call last):
      File "G:\ProgramFiles\MiniConda3\envs\WrkEnv\lib\site-packages\scrapy\utils\defer.py", line 279, in iter_errback
        yield next(it)
    

    第8周报错:

    ERROR: Spider error processing <GET https://nflweather.com/week/2012/week-8> (referer: None)
    Traceback (most recent call last):
      File "G:\ProgramFiles\MiniConda3\envs\WrkEnv\lib\site-packages\scrapy\utils\defer.py", line 279, in iter_errback
        yield next(it)
    

核心原因

你的爬虫代码中,对从页面提取的字段直接调用.strip()方法,但未处理字段为None的情况:

  • 当页面中某个目标元素缺失(即使整体HTML结构一致,个别数据项可能为空),css(...).get()会返回None
  • 对None调用.strip()会触发AttributeError,导致Scrapy终止当前请求的处理
  • 第7周可能所有赛事的某个必填字段为空,直接触发报错;第8周前2条数据字段完整,后续数据存在空字段,因此采集2条后报错

修复方案

1. 安全处理字段提取,避免空值报错

使用get(default='')替代get(),确保即使元素不存在也返回空字符串,再调用.strip();空字段可转为None保持数据一致性:

修改后的parse方法代码:

def parse(self, response):
    self.log(self.start_urls)
    game_boxes = response.css('div.game-box')

    for game_box in game_boxes:
        # 安全提取日期时间
        Datetimes = game_box.css('.col-12 .fw-bold::text').get(default='').strip()
        # 提取球队信息
        team_game_boxes = game_box.css('.team-game-box')
        awayTeams = team_game_boxes.css('.fw-bold::text').get(default='').strip() or None
        homeTeams = team_game_boxes.css('.fw-bold.ms-1::text').get(default='').strip() or None
        # 提取温度和降水概率
        TempProbs = game_box.css('.col-md-4 .mx-2 span::text').get(default='').strip() or None
        # 提取风速和风向
        windspeeds = game_box.css('.icon-weather + span::text').get(default='').strip() or None
        winddirection = game_box.css('.md-18 ::text').get(default='').strip() or None

        scraped_info = {
            'Year': self.Year,
            'Game': self.Game,
            'Datetime': Datetimes,
            'awayTeam': awayTeams,
            'homeTeam': homeTeams,
            'TempProb': TempProbs,
            'windspeeds': windspeeds,
            'winddirection': winddirection
        }

        yield scraped_info

2. 添加异常捕获,隔离单个item错误

在循环内添加try-except块,避免单个item的错误导致整个请求失败:

import logging

for game_box in game_boxes:
    try:
        # 原字段提取和scraped_info生成代码
        yield scraped_info
    except Exception as e:
        self.log(f"处理赛事数据失败: {str(e)}", level=logging.WARNING)

3. 可选:启用请求重试

在settings.py中配置重试机制,应对可能的网络波动:

RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 429]

验证方法

重新运行对应命令测试:

scrapy crawl NFLWeatherData -a Week=week -a Year=2012 -a Game=week-7 -o NFLWeather_2012_week_7.json
scrapy crawl NFLWeatherData -a Week=week -a Year=2012 -a Game=week-8 -o NFLWeather_2012_week_8.json

内容的提问来源于stack exchange,提问作者Leo Torres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:37