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

