初识 Scrapy - Item Pipeline

文章目录

  • 1. 前言
  • 2. 自定义item pipeline
  • 3. 示例
  • 4. 重复过滤器
  • 5. 激活item pipeline组件
  • 6. 参考文献

1. 前言

itemspider抓取之后,它会被发送到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范围内。

6. 参考文献

[1] Scrapy 官方文档 - Item Pipeline

你可能感兴趣的:(爬虫)