爬虫框架Scrapy笔记-Pipelines

简介

  • Item管道的主要责任是负责处理有蜘蛛从网页中抽取的Item,他的主要任务是清洗、验证和存储数据。
  • 当页面被蜘蛛解析后,将被发送到Item管道,并经过几个特定的次序处理数据。
  • 每个Item管道的组件都是有一个简单的方法组成的Python类。
  • 他们获取了Item并执行他们的方法,同时他们还需要确定的是是否需要在Item管道中继续执行下一步或是直接丢弃掉不处理。

主要方法

process_item(self, item, spider)

必须实现的方法

必须返回一个带数据的dict,返回一个Item (或任何后代类)对象,返回一个Twisted Deferred或者raise DropItemexception

open_spider(self, spider)

当蜘蛛打开时调用此方法

close_spider(self, spider)

当蜘蛛关闭时调用此方法

from_crawler(cls, crawler)

如果存在,则调用此类方法以从a创建流水线实例Crawler。它必须返回管道的新实例。

Crawler对象提供对所有Scrapy核心组件(如设置和信号)的访问; 它是管道访问它们并将其功能挂钩到Scrapy中的一种方式

示例

将抓取的items以json格式保存到文件中

spider抓取到的items将被序列化为json格式,并且以每行一个item的形式被写入到items.jl文件中

import json class JsonWriterPipeline(object): def __init__(self): self.file = open('items.jl', 'wb') def process_item(self, item, spider): line = json.dumps(dict(item)) + '\n' self.file.write(line) return item

删除重复项

假设在spider中提取到的item有重复的id,那么我们就可以在process_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

图像处理

  • 修改pipelines.py文件,编写图像处理类
from scrapy.pipelines.images import ImagesPipeline import scrapy # 用来下载图片的管道类 class ImgPipeLine(ImagesPipeline): # 接收 item 且将 item 中存储的 img_src 进行请求发送 def get_media_requests(self, item, info): yield scrapy.Request(url=item['img_src']) # 指定数据存储的路径(文件夹[在配置文件中指定] + 图片名称[该方法中返回]) def file_path(self, request, response=None, info=None): img_name = request.url.split('/')[-1] return img_name # 就是将 item 传递给下一个即将被执行的管道类 def item_complated(self, result, item, info): return item
  • 修改settings.py的配置
# 指定文件的下载路径 # 该文件夹会自动创建 IMAGES_STORE = './imgsLib' # 启用管道 ITEM_PIPELINES = { 'demo.pipelines.ImgPipeLine': 300, }

创作不易,若本文对你有帮助,欢迎打赏支持作者!

 分享给好友: