Scrapy框架的使用之Item Pipeline的用法
Item Pipeline的调用发生在Spider产生Item之后。当Spider解析完Response之后,Item就会传递到Item Pipeline,被定义的Item Pipeline组件会顺次调用,完成一连串的处理过程,比如数据清洗、存储等。
Item Pipeline的主要功能有如下4点。
- 清理HTML数据。
- 验证爬取数据,检查爬取字段。
- 查重并丢弃重复内容。
- 将爬取结果保存到数据库。
一、核心方法
我们可以自定义Item Pipeline,只需要实现指定的方法,其中必须要实现的一个方法是: process_item(item, spider)
。
另外还有如下几个比较实用的方法。
open_spider(spider)
close_spider(spider)
from_crawler(cls, crawler)
下面我们详细介绍这几个方法的用法。
1、process_item(item, spider)
process_item()
是必须要实现的方法,被定义的Item Pipeline会默认调用这个方法对Item进行处理。比如,我们可以进行数据处理或者将数据写入到数据库等操作。它必须返回Item类型的值或者抛出一个DropItem异常。
process_item()
方法的参数有如下两个。
- item,是Item对象,即被处理的Item。
- spider,是Spider对象,即生成该Item的Spider。
process_item()
方法的返回类型归纳如下。
- 如果它返回的是Item对象,那么此Item会被低优先级的Item Pipeline的
process_item()
方法处理,直到所有的方法被调用完毕。 - 如果它抛出的是DropItem异常,那么此Item会被丢弃,不再进行处理。
2、open_spider(self, spider)
open_spider()
方法是在Spider开启的时候被自动调用的。在这里我们可以做一些初始化操作,如开启数据库连接等。其中,参数spider就是被开启的Spider对象。
3、close_spider(spider)
close_spider()
方法是在Spider关闭的时候自动调用的。在这里我们可以做一些收尾工作,如关闭数据库连接等。其中,参数spider就是被关闭的Spider对象。
4、from_crawler(cls, crawler)
from_crawler()
方法是一个类方法,用@classmethod
标识,是一种依赖注入的方式。它的参数是crawler,通过crawler对象,我们可以拿到Scrapy的所有核心组件,如全局配置的每个信息,然后创建一个Pipeline实例。参数cls就是Class,最后返回一个Class实例。
二、实例
1、MongoDB Pipeline
我们用一个MongoPipeline将信息保存到MongoDB,在pipelines.py
里添加如下类的实现:
import pymongo
class MongoPipeline(object):
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DB')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def process_item(self, item, spider):
self.db[item.collection].insert(dict(item))
return item
def close_spider(self, spider):
self.client.close()
这里需要用到两个变量,MONGO_URI
和MONGO_DB
,即存储到MongoDB的链接地址和数据库名称。我们在settings.py里添加这两个变量,如下所示:
MONGO_URI = 'localhost'
MONGO_DB = 'images360'
这样一个保存到MongoDB的Pipeline的就创建好了。这里最主要的方法是process_item()
方法,直接调用Collection对象的insert()
方法即可完成数据的插入,最后返回Item对象。
本资源首发于崔庆才的个人博客静觅: Python3网络爬虫开发实战教程 | 静觅
推荐阅读
-
Python爬虫框架之Scrapy中Spider的用法
-
python scrapy爬虫框架抓取多个item 返回多pipeline的处理
-
Scrapy框架的使用之Scrapy入门
-
Scrapy框架的使用之Scrapy通用爬虫
-
scrapy框架之item pipeline的使用/scrapy框架自带图片下载ImagePipeline
-
Scrapy框架的使用之Scrapy对接Splash
-
Scrapy框架的使用之Scrapy对接硒
-
Scrapy框架的使用之Selector的用法
-
Spider,Downloader Middleware,Item Pipeline的用法
-
Scrapy框架的使用之Downloader Middleware的用法