1.Item Pipeline(项目管道)
蜘蛛(spider)抓取数据后,通过项目(Item)发送到项目管道(Item Pipeline)中,该管道通过几个按顺序执行的组件来处理它。
每个项目管道组件(有时仅称为“项目管道”)是一个实现简单方法的Python类。他们收到一个项目并对其执行操作,还决定该项目是否应该继续通过管道或被丢弃并且不再处理。项目管道的典型用途是:
●清理HTML数据。
●验证抓取的数据(检查项目是否包含某些字段)。
●检查重复项(并删除它们)。
●将抓取的项目存储在数据库中。
2.编写自己的项目管道
每个项目管道组件都是一个Python类,必须实现以下方法:
(1)process_item(self, item, spider)
●item:是一个项目对象(item),详情请查看上一篇文章。
●process_item():返回一个项目对象(item)或者一个Deferred或引发一个DropItem异常。丢弃的项目(item)不再由其他管道组件处理。
●参数
item(项目对象):被抓取的项目(item)。
spider(蜘蛛对象):抓取数据的蜘蛛(spider)。
此外,他们还可以实现以下方法:
(2)open_spider(self, spider)
打开spider(蜘蛛对象)时调用此方法。
●参数
spider(蜘蛛对象):打开spider对象。
(3)close_spider(self, spider)
关闭spider(蜘蛛)时调用此方法。
●参数
spider(蜘蛛对象):关闭spider对象。
(4)from_crawler(cls, crawler)
如果存在该爬虫对象,则调用此类方法取它返回管道的新实例。爬虫对象提供对所有Scrapy 核心组件的访问,例如设置和信号。这是管道访问它们并将其功能挂钩到Scrapy的一种方式。
●参数
crawler(爬虫对象):使用此管道的爬虫。
2.1项目管道示例
●过滤项目(item)新闻热点指数
还是百度新闻热点例子,过滤新闻热点指数为空的数据,如果不为空就累加1,否则就丢弃该项目:
from itemadapter import ItemAdapter
from scrapy.exceptions import DropItem
class ScrapyDengSamplePipeline:
def process_item(self, item, spider):
adapter = ItemAdapter(item)
if adapter.get("Title"):
adapter["HotSearchIndex"] = adapter["HotSearchIndex"] + 1
else:
raise DropItem(f"Missing Title in {item}")
return item
如下图所示:
●将项目(item)写入MongoDB
这个例子的主要目的是展示如何使用from_crawler()方法以及如何正确清理资源:
import pymongo
from itemadapter import ItemAdapter
class MongoPipeline:
collection_name = 'scrapy_items'
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_DATABASE', 'items')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db[self.collection_name].insert_one(ItemAdapter(item).asdict())
return item
除了上述这两个例子,其实还有很多作用,比如将项目写入JSON文件、截取项目截图、重复过滤器等等,具体代码大伙可以到我下面提供链接地址到官网看看示例,这里就不多陈述了。
2.2激活项目管道组件
要激活项目管道(Item Pipeline)组件,您必须将每个项目管道类添加到ITEM_PIPELINES设置中,如下例所示:
ITEM_PIPELINES = {
'myproject.pipelines.ScrapyDengSamplePipeline': 300,
'myproject.pipelines.MongoPipeline': 800,
}
在该设置中配置每个项目管道类的值决定了它们运行的顺序:项目从低值到高值的类,通常将这些数字定义在0-1000范围内。
参考文献:
Scrapy项目管道https://docs.scrapy.org/en/latest/topics/item-pipeline.html