欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

初识 Scrapy - Item Pipeline

程序员文章站 2022-05-05 15:02:39
...

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

相关标签: 爬虫