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
相关产品推荐
相关产品推荐

