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

