1. 前言
在item
被spider
抓取之后,它会被发送到Item Pipeline
,该管道通过几个按顺序执行的组件来处理它。
每一个item pipeline组件
都是Python
的类。它们接收item
,并对它执行操作,还决定该项目是否应继续通过管道,或者是否应删除并不再处理。
item pipeline
的典型用途有:
- 清理
HTML
数据 - 验证抓取的数据(检查项目是否包含某些字段)
- 检查重复项(并删除它们)
- 将爬取的项目存储在数据库中
2. 自定义item pipeline
每个item pipeline组件
都是一个python
类,必须实现以下方法:
process_item(self, item, spider):
# 调用每一个item pipeline组件的此方法。
pass
open_spider(self, spider):
# 当spider打开时调用此方法。
pass
close_spider(self, spider):
# 当spider关闭时调用此方法
pass
from_crawler(cls, crawler):
# 如果存在,从一个crawler创建一个pipeline实例。
pass
3. 示例
- 验证
item
字段和删除不合格的item
- 将
item
写入json
文件 - 将
item
存入MongoDB
详情见 Scrapy 官方文档 - Item Pipeline
4. 重复过滤器
查找并删除已处理的重复item
。假设我们的item
有一个唯一的ID
,但是我们的spider
返回多个ID
相同的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
5. 激活item pipeline组件
若要激活项管道组件,必须将其类添加到ITEM_PIPELINES
设置,如以下示例中所示:
ITEM_PIPELINES = {
'myproject.pipelines.PricePipeline': 300,
'myproject.pipelines.JsonWriterPipeline': 800,
}
在此设置中分配给类的整数值决定了它们的运行顺序:item从低到高依次运行。习惯上把这些数字定义在0-1000范围内。