简介
Item
管道的主要责任是负责处理有蜘蛛从网页中抽取的Item
,他的主要任务是清洗、验证和存储数据。- 当页面被蜘蛛解析后,将被发送到
Item
管道,并经过几个特定的次序处理数据。 - 每个
Item
管道的组件都是有一个简单的方法组成的Python
类。 - 他们获取了
Item
并执行他们的方法,同时他们还需要确定的是是否需要在Item
管道中继续执行下一步或是直接丢弃掉不处理。
主要方法
process_item(self, item, spider)
必须实现的方法
必须返回一个带数据的dict
,返回一个Item
(或任何后代类)对象,返回一个Twisted Deferred
或者raise DropItemexception
open_spider(self, spider)
当蜘蛛打开时调用此方法
close_spider(self, spider)
当蜘蛛关闭时调用此方法
from_crawler(cls, crawler)
如果存在,则调用此类方法以从a
创建流水线实例Crawler
。它必须返回管道的新实例。
Crawler
对象提供对所有Scrapy
核心组件(如设置和信号)的访问; 它是管道访问它们并将其功能挂钩到Scrapy
中的一种方式
示例
将抓取的items以json格式保存到文件中
从spider
抓取到的items
将被序列化为json
格式,并且以每行一个item
的形式被写入到items.jl
文件中
import json
class JsonWriterPipeline(object):
def __init__(self):
self.file = open('items.jl', 'wb')
def process_item(self, item, spider):
line = json.dumps(dict(item)) + '\n'
self.file.write(line)
return item
删除重复项
假设在spider
中提取到的item
有重复的id
,那么我们就可以在process_item()
方法中进行过滤
from scrapy.exceptions import DropItem
class DuplicatesPipeline(object):
def __init__(self):
self.ids_seen = set()
def process_item(self, item, spider):
if item['id'] in self.ids_seen:
raise DropItem('Duplicate item found: %s' % item)
else:
self.ids_seen.add(item['id'])
return item
图像处理
- 修改
pipelines.py
文件,编写图像处理类
from scrapy.pipelines.images import ImagesPipeline
import scrapy
# 用来下载图片的管道类
class ImgPipeLine(ImagesPipeline):
# 接收 item 且将 item 中存储的 img_src 进行请求发送
def get_media_requests(self, item, info):
yield scrapy.Request(url=item['img_src'])
# 指定数据存储的路径(文件夹[在配置文件中指定] + 图片名称[该方法中返回])
def file_path(self, request, response=None, info=None):
img_name = request.url.split('/')[-1]
return img_name
# 就是将 item 传递给下一个即将被执行的管道类
def item_complated(self, result, item, info):
return item
- 修改
settings.py
的配置
# 指定文件的下载路径
# 该文件夹会自动创建
IMAGES_STORE = './imgsLib'
# 启用管道
ITEM_PIPELINES = {
'demo.pipelines.ImgPipeLine': 300,
}
发表评论