pipeline
执行顺序:pipeline
写 pipeline类
class Scrapyproject1Pipeline(object):
def process_item(self, item, spider):
写items类:
class Scrapyproject1Item(scrapy.Item):
url_title = scrapy.Field()
text = scrapy.Field()
print('item操作')##相当于是一个字典,把你想要加的字段放进这个字典里面,之后在pipeline可以直接进行调用
pass
settings配置:
ITEM_PIPELINES = {
'scrapyproject1.pipelines.Scrapyproject1Pipeline': 300,
}
'''
持久化操作,后面是优先级
数字越小越优先(范围是0到1000)
'''
爬虫(spider)
--在爬虫这里面有yield requets
和yield item的方法,当yield item 的时候,会调用pipeline里面的process_item方法
每yield item就每执行一次就执行里面的pipeline方法(具体是里面的process_item方法,可能多次执行
看这里yield多少次数)
pipeline流程分析:
- # -*- coding: utf-8 -*-
- # Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html- '''
讲解:
判断当前的Scrapyproject1Pipeline类下面是否有from_crawler方法,如果有的haul,就执行:
obj=Scrapyproject1Pipeline.from_crawler(参数)##如果要给构造方法传参,必须要后面加参数上去
- 如果没有from_crawl方法的话:
obj=Scrapyproject1Pipeline()- 在外部实际的调用
执行顺序:
首先判断当前类下面有没有这个from_crawler方法:
如果有from_crawler方法的话,就先执行from_crawler方法,在当返回cls(参数)的时候执行init方法,cls是当前的类(Scrapyproject1Pipeline),
返回的也就是类对象:(实例化,执行了当前类下面的init构造方法):
obj=Scrapyproject1Pipeline.from_crawler(参数)#先执行这个from_crawler方法,在执行init方法
- 当返回类对象的时候,就是执行了init方法,传入参数到init里面,cls就是当前类,传入的参数就到当前类下面的构造方法init下面接收到参数
如果没有from_crawler方法的话,就是直接执行init方法):
- obj=Scrapyproject1Pipeline()
- 在执行open_spider方法,obj.open_spider()
然后执行process_item(在爬虫里面每yield一次就执行一次这个方法,yield item 方法,可能是多次循环执行)obj.process_item()
close_spider方法,obj.close_spider()
'''- class Scrapyproject1Pipeline(object):
'''开始执行一次'''
def __init__(self,path):##这个参数是下面传过来的
self.f=None
##这个的目的一是为了在了一个实例化对象的时候,更好的调用这个方法,而不是通过open来调用这个方法- self.path=path##可以拿到当前的参数,在后面进行调用
'''
第一种:
obj=Scrapyproject1Pipeline
obj.f这个是拿不了里面的f的方法,因为没有构造方法__init__
obj=obj.open_spider()
obj.f这样才可以拿到里面的f方法- 第二种:
要么是通过__init__方法来直接进行调用里面的f方法 ,obj.f就可以拿到里面的方法了
'''- ##obj=Scrapyproject1Pipeline.from_crawler(参数),判断有没有(注意)
##从这里最开始执行,有的话最开始执行,之后实例化的时候,调用 init方法
@classmethod
def from_crawler(cls,crawler):##这个cls就是当前的类(self)Scrapyproject1Pipeline
'''
初始haul的时候,使用的,创建pipeline对象
:param crawler:
:return:
'''
# val=crawler.settings.getint('')
path=crawler.settings.get('path')
##crawler.settings所有的配置文件,后面是取所有的配置文件里面找这个- return cls(path)##返回对象(已经实例化好的对象)cls就是当前类Scrapyproject1Pipeline,在某一个地方已经实例化了这个函数,在这里可以返回这个对象
##下面想当于是传了参数到这个当前的这个类下面,这个里面会返回一个参数到当前类下面- '''开始执行一次 Scrapyproject1Pipeline.from_crawler(参数).open_spider '''
def open_spider(self,spider):
'''
爬虫刚开始执行的时候,调用
:param spider:
:return:
'''
- #如果要为某做特定的爬虫操作的话,可以做判断
#if spider.name=='cnblog':
- self.f=open('page_url.log',mode='a+')##在同一个类下面,所以类是相同的,以追加的方式打开
print('爬虫开始')- '''
在这里面会被反复被调用使用,这里面会反复执行,在爬虫里面每yield item一次的话,就执行一次proocess_item方法
'''
def process_item(self, item, spider):
print('pipeline操作')
# print(item['text'])
print('pipelinr',item['url_title'])
self.f.write('href:'+item['url_title']+'\n')
print('结束')
return item#交给后续的pipeline的process_item方法执行
- '''多个pipeline的时候
这个返回item的作用是为了下一个pipeline使用,如果不返回的话,下一个就不能执行
执行顺序,都打开open_spider,然后执行下面sprocess_item方法,循环执行,在执行close_spider方法
'''
- #from scrapy.exceptions import DropItem
#raise DropItem#如果不想让下一个pipeline执行的话,就抛出一个异常,后续的pipeline下面的process_item就不再执行
- '''最终执行一次'''
def close_spider(self,spider):
self.f.close()
print('close')- '''
spider就是当前爬虫的(类)对象,item是爬虫yield传过来的已经封装好的对象
可以调用里面的方法
'''
- '''
这里是做持久化操作的,可以保存进数据库,也可以保存到文件里面,可以多个pipeline方法,分别保存到不同的地方使用
'''
pipeline的更多相关文章
- redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合, ...
- Building the Testing Pipeline
This essay is a part of my knowledge sharing session slides which are shared for development and qua ...
- Scrapy:为spider指定pipeline
当一个Scrapy项目中有多个spider去爬取多个网站时,往往需要多个pipeline,这时就需要为每个spider指定其对应的pipeline. [通过程序来运行spider],可以通过修改配置s ...
- 图解Netty之Pipeline、channel、Context之间的数据流向。
声明:本文为原创博文,禁止转载. 以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件) 当用户调用channel的connect时,会发起一个 ...
- 初识pipeline
1.pipeline的产生 从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客人A来到柜台,客人B紧随其后,客人C排在客人B后面,客人D排在客人C后面,客人E排在客人D后面,一直排到店面 ...
- MongoDB 聚合管道(Aggregation Pipeline)
管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...
- SSIS Data Flow 的 Execution Tree 和 Data Pipeline
一,Execution Tree 执行树是数据流组件(转换和适配器)基于同步关系所建立的逻辑分组,每一个分组都是一个执行树的开始和结束,也可以将执行树理解为一个缓冲区的开始和结束,即缓冲区的整个生命周 ...
- Kafka到Hdfs的数据Pipeline整理
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 找时间总结整理了下数据从Kafka到Hdfs的一些pipeline,如下 1> Kafka ...
- SQL Queries from Transactional Plugin Pipeline
Sometimes the LINQ, Query Expressions or Fetch just doesn't give you the ability to quickly query yo ...
- One EEG preprocessing pipeline - EEG-fMRI paradigm
The preprocessing pipeline of EEG data from EEG-fMRI paradigm differs from that of regular EEG data, ...
随机推荐
- MySQL 字符集问题
MySQL 支持许多字符集及其编码方案, 甚至是不同编码之间的转换. 在使用 MySQL 进行应用程序编程时, 常常会出现乱码现象, 这通常是由于客户端没有声明与 MySQL 服务器通信的字符串编码造 ...
- memset赋值
比较神奇的事情 可能和二进制有关系吧 #include<bits/stdc++.h> using namespace std; ]; int main(){ memset(f,,sizeo ...
- python 小技巧
计算时间差,时间加减运算代码 最近在学习数据预处理,碰到日期型数据不会处理,上网查了下: Q:如何方便的计算两个时间的差,如两个时间相差几天,几小时等A:使用datetime模块可以很方便的解决这个问 ...
- vscode隐藏运行ts生成的js文件和map文件
在code-首选项-用户设置中放入以下代码,覆盖原有的 { "files.exclude": { "node_modules": true, "**/ ...
- 嵌入式开发 迅为4418开发板Qt移植移动4G模块第一部分
本文转自迅为论坛:http://topeetboard.com 了解更多:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-7744162139 ...
- MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)
engine 引擎就是MySQL存储数据的不同方式 myisam 插入速度快 支持全文索引 innoDB 插入速度慢 支持事务安全 假设两人同时购买火车票,两人同时看到只有一张火车票,几乎同时下单 或 ...
- SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...
- Linux C++ TCP Socket传输文件或图片实例
环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服 ...
- Django中的缓存基础知识
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...
- ajax跨域请求のJSONP
简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后台语言几乎全部支持: 3.轻量级 ...