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

Scrapy循环提取元素并导出JSON文件的实现方法咨询

解决Scrapy数据存入DataFrame并导出JSON的方案

先修正你代码里的两个基础错误:

  • allowed_domains 只需填纯域名,去掉http/https,改成 ['nflweather.com']
  • start_urls 里的重复http要删掉,改成 ['https://www.nflweather.com/']

核心要解决的是单场比赛数据的对应关联,不能单独提取所有字段的列表(容易出现字段错位),再收集数据转成DataFrame导出JSON,完整代码如下:

import scrapy
import pandas as pd
from scrapy.item import Field, Item

# 定义Item类(可选,用来规范字段)
class WeatherItem(Item):
    datetime = Field()
    away_team = Field()
    home_team = Field()
    temp_prob = Field()
    wind_speed = Field()

class WeatherdataSpider(scrapy.Spider):
    name = 'weatherdata'
    allowed_domains = ['nflweather.com']
    start_urls = ['https://www.nflweather.com/']

    def parse(self, response):
        trans_table = {ord(c): None for c in u'\n\t\t'}
        # 找到所有比赛的父容器(需根据页面实际结构调整,示例为比赛卡片外层div)
        game_containers = response.xpath('//div[contains(@class, "game-card")]')
        
        data_list = []
        for container in game_containers:
            # 在每个比赛容器内提取对应字段,保证单场数据一一对应
            datetime = ' '.join(s.strip().translate(trans_table) for s in container.xpath('.//div[@class="fw-bold text-wrap"]/text()').extract()).strip()
            away_team = container.xpath('.//span[@class="fw-bold"]/text()').get(default='').strip()
            home_team = container.xpath('.//span[@class="fw-bold ms-1"]/text()').get(default='').strip()
            temp_prob = container.xpath('.//div[@class="mx-2"]/span/text()').get(default='').strip()
            wind_speed = container.xpath('.//div[@class="text-break col-md-4 mb-1 px-1 flex-centered"]/span/text()').get(default='').strip()
            
            # 生成Item对象并存入列表
            item = WeatherItem()
            item['datetime'] = datetime
            item['away_team'] = away_team
            item['home_team'] = home_team
            item['temp_prob'] = temp_prob
            item['wind_speed'] = wind_speed
            
            data_list.append(dict(item))
        
        # 转成DataFrame并导出JSON
        df = pd.DataFrame(data_list)
        df.to_json('nfl_weather_data.json', orient='records', indent=2, ensure_ascii=False)

关键说明:

  • 父容器遍历:必须找到每个比赛对应的外层元素(比如页面里的比赛卡片div),循环时在容器内提取字段,才能避免不同场次的数据错位。你需要根据实际页面HTML结构,调整game_containers的XPath。
  • 字段提取:用.get(default='')替代extract(),直接获取单个值,同时设置默认空字符串防止报错。
  • JSON导出:orient='records'会生成数组格式的JSON(每条数据是一个对象),indent=2让格式更易读,ensure_ascii=False保留非ASCII字符。

如果不想用Item类,直接生成字典存入data_list也能达到同样效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:14:57