scrapy框架之Pipeline管道类
Item Pipeline简介
Item管道的主要责任是负责处理有蜘蛛从网页中抽取的Item,他的主要任务是清洗、验证和存储数据。
当页面被蜘蛛解析后,将被发送到Item管道,并经过几个特定的次序处理数据。
每个Item管道的组件都是有一个简单的方法组成的Python类。
他们获取了Item并执行他们的方法,同时他们还需要确定的是是否需要在Item管道中继续执行下一步或是直接丢弃掉不处理。
项目管道的执行过程
清理HTML数据
验证解析到的数据(检查Item是否包含必要的字段)
检查是否是重复数据(如果重复就删除)
将解析到的数据存储到数据库中
编写自己的Item Pipeline
每个项目管道组件是一个Python类,必须实现以下方法:
process_item(self, item, spider)
对于每个项目管道组件调用此方法。process_item() 必须返回一个带数据的dict,返回一个Item (或任何后代类)对象,返回一个Twisted Deferred或者raise DropItemexception。丢弃的项目不再由其他管道组件处理。
参数:
- item(Itemobject或dict) - 剪切的项目
- Spider(Spider对象) - 抓取物品的蜘蛛
另外,它们还可以实现以下方法:
# 当蜘蛛打开时调用此方法。
open_spider(self, spider) # 参数spider打开的蜘蛛 # 当蜘蛛关闭时调用此方法。
close_spider(self, spider) # 参数spider被关闭的蜘蛛 # 如果存在,则调用此类方法以从a创建流水线实例Crawler。它必须返回管道的新实例。Crawler对象提供对所有Scrapy核心组件(如设置和信号)的访问; 它是管道访问它们并将其功能挂钩到Scrapy中的一种方式。
from_crawler(cls, crawler) # 参数crawler(Crawlerobject) - 使用此管道的crawler
将抓取的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
激活ItemPipeline组件
在settings.py文件中,往ITEM_PIPELINES中添加项目管道的类名,就可以激活项目管道组件
ITEM_PIPELINES = {
'myproject.pipeline.PricePipeline': 300,
'myproject.pipeline.JsonWriterPipeline': 800,
}
图像管道
items
定义过滤字段
import scrapy class ImgpilelineproItem(scrapy.Item):
# define the fields for your item here like:
img_src = scrapy.Field()
spider
只是用来获取图片的下载地址并提交至itme
import scrapy
from imgPileLinePro.items import ImgpilelineproItem class ImgSpider(scrapy.Spider):
name = 'img'
# allowed_domains = ['www.xxx.com']
start_urls = ['http://pic.netbian.com/4kmeinv/']
url = 'http://pic.netbian.com/4kmeinv/index_%d.html'
page = 2 def parse(self, response):
li_list = response.xpath('//*[@id="main"]/div[3]/ul/li')
for li in li_list:
img_src = 'http://pic.netbian.com'+li.xpath('./a/img/@src').extract_first()
item = ImgpilelineproItem()
item['img_src'] = img_src yield item if self.page <= 2: # 爬取前两页
new_url = format(self.url%self.page)
self.page += 1
yield scrapy.Request(url=new_url,callback=self.parse)
pipelines
from scrapy.pipelines.images import ImagesPipeline
import scrapy # 用来下载图片的管道类
class ImgPileLine(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_completed(self,result,item,info):
return item
settings中的配置
# 指定文件的下载路径
IMAGES_STORE = './imgsLib' # 该文件会自动创建
# 启用管道
ITEM_PIPELINES = {
'imgPileLinePro.pipelines.ImgPileLine': 300,
}
将item写入到mongodb
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_DATABASE', 'items')
)
# 爬虫开始建立与mongodb的连接
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
# 爬虫结束断开与mongodb的连接
def close_spider(self, spider):
self.client.close()
# 数据存储
def process_item(self, item, spider):
# update 去重,以url_token为查找条件更新数据
self.db["user"].update({"url_token":item["url_token"]},{"$set":item},True)
return item
MONGO_URI = "localhost"
MONGO_DATABASE = "zhihu"
scrapy框架之Pipeline管道类的更多相关文章
- Scrapy框架-Item Pipeline
目录 1. Item Pipeline 3. 完善之前的案例: 3.1. item写入JSON文件 3.2. 启用一个Item Pipeline组件 3.3. 重新启动爬虫 1. Item Pipel ...
- scrapy框架系列 (5) Spider类
Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作及 ...
- Scrapy框架——CrawlSpider类爬虫案例
Scrapy--CrawlSpider Scrapy框架中分两类爬虫,Spider类和CrawlSpider类. 此案例采用的是CrawlSpider类实现爬虫. 它是Spider的派生类,Spide ...
- Scrapy框架——CrawlSpider爬取某招聘信息网站
CrawlSpider Scrapy框架中分两类爬虫,Spider类和CrawlSpider类. 它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页, 而Craw ...
- 爬虫Ⅱ:scrapy框架
爬虫Ⅱ:scrapy框架 step5: Scrapy框架初识 Scrapy框架的使用 pySpider 什么是框架: 就是一个具有很强通用性且集成了很多功能的项目模板(可以被应用在各种需求中) scr ...
- 都是干货---真正的了解scrapy框架
去重规则 在爬虫应用中,我们可以在request对象中设置参数dont_filter = True 来阻止去重.而scrapy框架中是默认去重的,那内部是如何去重的. from scrapy.dupe ...
- scrapy框架(三)
scrapy框架(三) CrawlSpider类 创建CrawlSpider # 创建项目后 $ scrapy genspider -t crawl spider_name website_doma ...
- Scrapy 框架 安装 五大核心组件 settings 配置 管道存储
scrapy 框架的使用 博客: https://www.cnblogs.com/bobo-zhang/p/10561617.html 安装: pip install wheel 下载 Twisted ...
- scrapy框架中Item Pipeline用法
scrapy框架中item pipeline用法 当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的pyt ...
随机推荐
- JDBC 复习4 批量执行SQL
1使用jdbc进行批量执行SQL在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. package dbe ...
- maven项目打包和编译跳过单元测试和javadoc
代码中可能由于单元测试.注释(方法中的参数)或者maven javadoc插件的问题导致无法打包,影响工作,为避免这两种情况可以在打包时输入命令: mvn clean install -Dmaven. ...
- springboot mvc自动配置(三)初始化mvc的组件
所有文章 https://www.cnblogs.com/lay2017/p/11775787.html 正文 在springboot mvc自动配置的时候,获得了DispatcherServlet和 ...
- ElasticSearch做实时OLAP框架~实时搜索、统计和OLAP需求,甚至可以作为NOSQL来使用(转)
使用ElasticSearch作为大数据平台的实时OLAP框架 – lxw的大数据田地 http://lxw1234.com/archives/2015/12/588.htm 一直想找一个用于大数据平 ...
- # 机器学习算法总结-第九天(XGboost)
- 配置Hadoop,hive,spark,hbase ————待整理
五一一天在家搭建好了集群,要上班了来不及整理,待下周周末有时间好好整理整理一个完整的搭建hadoop生态圈的集群的系列 若出现license information(license not accep ...
- WordPress,SAP Kyma和微信三者的集成
我们来继续学习如何在实战中使用SAP Kyma. Jerry在之前的文章里,分别介绍了如何本地搭建WordPress实例: 什么?在SAP中国研究院里还需要会PHP开发? 以及如何把这个本地搭建的Wo ...
- KVM之virsh管理虚拟机网卡配置
虚拟机网卡管理 virsh attach-interface 添加网卡: [root@ubuntu ~]# virsh domiflist CentOS-V6.5.23-server01 Interf ...
- windows环境安装haproxy及初步配置负载均衡使用示例
安装HaProxy 首先需要下载windows环境下需要文件,这里下载的是一个别人编译好的一个文件,这里省去了编译的过程,使用的版本是haproxy-1.7.8. 下载后直接解压到对应的目录下.示例( ...
- Flutter——Expanded组件("可伸缩"组件)
Expanded组件可以结合Row和Column布局组件使用. Expanded组件的常用属性 属性 说明 flex 元素占整个父Row/Column的比例 child 子元素 import 'pac ...