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

Scrapy中如何在Items文件访问爬虫数据并正确处理存储?

问题解决方案

1. 为什么打印name得到字段对象?

Scrapy的Item类中定义的name、price等都是Field对象,仅用于声明字段规则,并非存储实际爬取数据的变量。你不能在Item类内部直接通过self.name获取爬取值,因为此时还没有实例化Item并赋值。

举个错误与正确的对比:

错误示例(Items.py)

import scrapy

class FlipkartItem(scrapy.Item):
    name = scrapy.Field()
    
    # 这里打印会得到Field对象,而非实际数据
    def __init__(self):
        print(self.name)  # 输出:<scrapy.item.Field object at ...>

正确做法(FlipKart.py)

在爬虫中实例化Item、赋值后,再通过字典索引或属性访问数据:

import scrapy
from your_project.items import FlipkartItem

class FlipkartSpider(scrapy.Spider):
    name = 'flipkart'
    start_urls = ['https://www.flipkart.com/mobiles']

    def parse(self, response):
        for product in response.css('div._1AtVbE'):
            item = FlipkartItem()
            # 给字段赋值实际爬取内容
            item['name'] = product.css('div._4rR01T::text').get()
            item['price'] = product.css('div._30jeq3::text').get()
            item['link'] = response.urljoin(product.css('a._1fQZEK::attr(href)').get())
            
            # 此时打印就能获取实际数据
            print(item['name']) 
            yield item

2. 价格处理与CSV存储

你已经在Item中用MapCompose(removeRupeeSymbol)做了价格预处理,这个逻辑会在赋值item['price']时自动执行,无需额外操作。

要导出为CSV,两种方式:

  • 运行爬虫时直接指定输出:
scrapy crawl flipkart -o flipkart_mobiles.csv
  • 在settings.py中配置默认导出规则:
FEEDS = {
    'flipkart_mobiles.csv': {
        'format': 'csv',
        'encoding': 'utf-8',
        'overwrite': True
    }
}

3. 正确访问Item数据的方式

无论在爬虫还是管道(pipelines.py)中,都要通过字典索引(item['field_name'])或点属性(item.field_name)访问实际数据,而非直接调用Item类里的Field定义。

比如在管道中处理:

class YourProjectPipeline:
    def process_item(self, item, spider):
        # 正确获取处理后的价格
        clean_price = item['price']
        print(f"处理后价格:{clean_price}")
        return item

内容的提问来源于stack exchange,提问作者Dhainik Suthar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:40:32