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, ...
随机推荐
- java8 新特性 Optional容器类
public class Godness { private String name; public Godness() { } public Godness(String name) { this. ...
- MVC |分部视图 PartialView()
介绍如何定义 其实它和普通视图没有多大区别,只是创建分部视图的时候视图里没有任何内容,你需要什么标签你自己加.第二就是分部视图不会执行_ViewStart.cshtml中的内容) 控制器 Partia ...
- mysql 创建存储过程
mysql 创建存储过程 实例一: CREATE PROCEDURE cp_test() BEGIN declare a int; declare b int; ; ; select a,b; END ...
- 查看 Linux memory 内存占用
linux 系统内存: 如果系统内存使用过高 就会产生 out of memory exception 现象: 通常 在mongo 默认服务运行资源是不受限制的.也会占用而同一系统运行的其他服务: 当 ...
- 使用函数输出水仙花数 (void的用法)
6-11 使用函数输出水仙花数 (20 分) 水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身.例如:153=13+53+33. 本题要求编写两个函数, ...
- PHP:产生不反复随机数的方法
来源:http://www.ido321.com/1217.html 不管是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在近期接触的几个小项目中.我也经常须要和随机数或者随机数组打交道, ...
- python发送网络请求
1.使用urllib模块(使用不方便,建议使用第二种) get请求: res = urlopen(url) from urllib.request import urlopen url = 'http ...
- MySQL - COUNT关键字
基础数据信息 SELECT COUNT(*) AS '用户名的个数' FROM t_user SELECT COUNT(DISTINCT username) AS '用户名不重复的个数' FROM t ...
- MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)
关于触发器的理解: 进行数据库应用软件的开发时,有时我们碰到表的某些数据的改变时,希望同时 引起其他相关数据改变的需求,利用触发器就能满足这样的需求. 触发器能在表中的某些特定数据变化时自动完成某些查 ...
- 设置eclipse代码自动补全功能
1.选择Eclipse菜单条中的Windows菜单下的Preferences项 2.在左侧找到“Java” -> “Editor” -> “Content Assist” 3.在右侧“Au ...