1 Item 封装数据
Item 类可以对爬取的数据进行封装,便于后续的处理、存储
封装步骤:
① 打开items.py
,进行修改
② 再spider中进入items类items 简单应用:
对图书名、作者数据进行封装
# items.py修改
import scrapy
from scrapy import Item,Field
class BookItem(Item):
name = Field()
price = Field()
# spider 修改
## '..items'表示返回上级菜单,找到items
from ..items import BookItem
class BookSpiderSpider(scrapy.Spider):
......
def parse(self, response):
for sel in response.css('article.product_pod'):
book = BookItem()
book['name'] = sel.xpath('./h3/a/@title').extract_first()
book['price'] = sel.css('p.price_color::text').extract_first()
......
- Field 元数据常用指令
# 1.将列表拼接成字符串(如拼接图书作者)
class BookItem(Item):
authors = Field(serializer=lambda x: '|'.join(x))
2 Item Pipeline 处理数据
- Item Pipeline 可以处理、存储数据
- 处理从 spider 发送的,由Item 封装的数据
- 页面数据抓取用spider解析,其他用Item Pipeline
- 主要的三个模块:
① process_item(item, spider):处理数据
② open_spider(self, spider):打开文件或数据库
③ close_spider(self, spider):关闭文件或数据库 - 处理数据步骤:
① 打开pipelines.py
,修改文件
② 打开setting.py
,修改配置文件 - 简单应用
图书价格汇率转换
# 1.修改pipelines.py文件
class PriceConverterPipeline(object):
# 英镑兑换人民币汇率
exchange_rate = 8.5309
def process_item(self, item, spider):
# 提取item的price 字段(如£53.74)
# 去掉前面英镑符号£,转换为float 类型,乘以汇率
price = float(item['price'][1:]) * self.exchange_rate
# 保留2 位小数,赋值回item的price 字段
item['price'] = '¥%.2f' % price
return item
# 2.修改setting.py文件
# 数字表示执行顺序
ITEM_PIPELINES = {
'example.pipelines.PriceConverterPipeline': 300,
}
3 数据存储
- 使用Exporter导出数据
scrapy crawl books -o books.csv
- 指定文件路径时,可使用
%(name)s
和%(time)s
两个特殊变量
# %(name)s : 会被替换为spider的名字
# %(time)s : 会被替换成文件创建时间
scrapy crawl books -o 'export_data/%(name)s.csv'
scrapy crawl books -o 'export_data/%(time)s.csv'
scrapy crawl books -o 'export_data/%(name)s/%(time)s.csv'