执行顺序: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流程分析:

  1. # -*- coding: utf-8 -*-
  2.  
  3. # 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
  4.  
  5. '''
    讲解:
    判断当前的Scrapyproject1Pipeline类下面是否有from_crawler方法,如果有的haul,就执行:
    obj=Scrapyproject1Pipeline.from_crawler(参数)##如果要给构造方法传参,必须要后面加参数上去
  1. 如果没有from_crawl方法的话:
    obj=Scrapyproject1Pipeline()
  2.  
  3. 在外部实际的调用
    执行顺序:
    首先判断当前类下面有没有这个from_crawler方法:
      如果有from_crawler方法的话,就先执行from_crawler方法,在当返回cls(参数)的时候执行init方法,cls是当前的类(Scrapyproject1Pipeline),
    返回的也就是类对象:(实例化,执行了当前类下面的init构造方法):
      obj=Scrapyproject1Pipeline.from_crawler(参数)#先执行这个from_crawler方法,在执行init方法
  1. 当返回类对象的时候,就是执行了init方法,传入参数到init里面,cls就是当前类,传入的参数就到当前类下面的构造方法init下面接收到参数
      如果没有from_crawler方法的话,就是直接执行init方法):
  1.   obj=Scrapyproject1Pipeline()
  1. 在执行open_spider方法,obj.open_spider()
    然后执行process_item(在爬虫里面每yield一次就执行一次这个方法,yield item 方法,可能是多次循环执行)obj.process_item()
    close_spider方法,obj.close_spider()
    '''
  2.  
  3. class Scrapyproject1Pipeline(object):
    '''开始执行一次'''
    def __init__(self,path):##这个参数是下面传过来的
    self.f=None
    ##这个的目的一是为了在了一个实例化对象的时候,更好的调用这个方法,而不是通过open来调用这个方法
  4.  
  5. self.path=path##可以拿到当前的参数,在后面进行调用
    '''
    第一种:
    obj=Scrapyproject1Pipeline
    obj.f这个是拿不了里面的f的方法,因为没有构造方法__init__
    obj=obj.open_spider()
    obj.f这样才可以拿到里面的f方法
  6.  
  7. 第二种:
    要么是通过__init__方法来直接进行调用里面的f方法 obj.f就可以拿到里面的方法了
    '''
  8.  
  9. ##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所有的配置文件,后面是取所有的配置文件里面找这个
  10.  
  11. return cls(path)##返回对象(已经实例化好的对象)cls就是当前类Scrapyproject1Pipeline,在某一个地方已经实例化了这个函数,在这里可以返回这个对象
    ##下面想当于是传了参数到这个当前的这个类下面,这个里面会返回一个参数到当前类下面
  12.  
  13. '''开始执行一次 Scrapyproject1Pipeline.from_crawler(参数).open_spider '''
    def open_spider(self,spider):
    '''
    爬虫刚开始执行的时候,调用
    :param spider:
    :return:
    '''
  1.   #如果要为某做特定的爬虫操作的话,可以做判断
      #if spider.name=='cnblog':
  1. self.f=open('page_url.log',mode='a+')##在同一个类下面,所以类是相同的,以追加的方式打开
    print('爬虫开始')
  2.  
  3. '''
    在这里面会被反复被调用使用,这里面会反复执行,在爬虫里面每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方法执行
  1.   '''多个pipeline的时候
      这个返回item的作用是为了下一个pipeline使用,如果不返回的话,下一个就不能执行
      执行顺序,都打开open_spider,然后执行下面sprocess_item方法,循环执行,在执行close_spider方法
      '''
  1.   #from scrapy.exceptions import DropItem
      #raise DropItem#如果不想让下一个pipeline执行的话,就抛出一个异常,后续的pipeline下面的process_item就不再执行
  1.  
  2. '''最终执行一次'''
    def close_spider(self,spider):
    self.f.close()
    print('close')
  3.  
  4. '''
    spider就是当前爬虫的(类)对象,item是爬虫yield传过来的已经封装好的对象
    可以调用里面的方法
    '''
  1. '''
    这里是做持久化操作的,可以保存进数据库,也可以保存到文件里面,可以多个pipeline方法,分别保存到不同的地方使用
    '''
  1.  

pipeline的更多相关文章

  1. redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合, ...

  2. Building the Testing Pipeline

    This essay is a part of my knowledge sharing session slides which are shared for development and qua ...

  3. Scrapy:为spider指定pipeline

    当一个Scrapy项目中有多个spider去爬取多个网站时,往往需要多个pipeline,这时就需要为每个spider指定其对应的pipeline. [通过程序来运行spider],可以通过修改配置s ...

  4. 图解Netty之Pipeline、channel、Context之间的数据流向。

    声明:本文为原创博文,禁止转载.       以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件)  当用户调用channel的connect时,会发起一个 ...

  5. 初识pipeline

    1.pipeline的产生 从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客人A来到柜台,客人B紧随其后,客人C排在客人B后面,客人D排在客人C后面,客人E排在客人D后面,一直排到店面 ...

  6. MongoDB 聚合管道(Aggregation Pipeline)

    管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...

  7. SSIS Data Flow 的 Execution Tree 和 Data Pipeline

    一,Execution Tree 执行树是数据流组件(转换和适配器)基于同步关系所建立的逻辑分组,每一个分组都是一个执行树的开始和结束,也可以将执行树理解为一个缓冲区的开始和结束,即缓冲区的整个生命周 ...

  8. Kafka到Hdfs的数据Pipeline整理

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 找时间总结整理了下数据从Kafka到Hdfs的一些pipeline,如下 1> Kafka ...

  9. SQL Queries from Transactional Plugin Pipeline

    Sometimes the LINQ, Query Expressions or Fetch just doesn't give you the ability to quickly query yo ...

  10. One EEG preprocessing pipeline - EEG-fMRI paradigm

    The preprocessing pipeline of EEG data from EEG-fMRI paradigm differs from that of regular EEG data, ...

随机推荐

  1. MySQL 字符集问题

    MySQL 支持许多字符集及其编码方案, 甚至是不同编码之间的转换. 在使用 MySQL 进行应用程序编程时, 常常会出现乱码现象, 这通常是由于客户端没有声明与 MySQL 服务器通信的字符串编码造 ...

  2. memset赋值

    比较神奇的事情 可能和二进制有关系吧 #include<bits/stdc++.h> using namespace std; ]; int main(){ memset(f,,sizeo ...

  3. python 小技巧

    计算时间差,时间加减运算代码 最近在学习数据预处理,碰到日期型数据不会处理,上网查了下: Q:如何方便的计算两个时间的差,如两个时间相差几天,几小时等A:使用datetime模块可以很方便的解决这个问 ...

  4. vscode隐藏运行ts生成的js文件和map文件

    在code-首选项-用户设置中放入以下代码,覆盖原有的 { "files.exclude": { "node_modules": true, "**/ ...

  5. 嵌入式开发 迅为4418开发板Qt移植移动4G模块第一部分

    本文转自迅为论坛:http://topeetboard.com 了解更多:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-7744162139 ...

  6. MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

    engine 引擎就是MySQL存储数据的不同方式 myisam 插入速度快 支持全文索引 innoDB 插入速度慢 支持事务安全 假设两人同时购买火车票,两人同时看到只有一张火车票,几乎同时下单 或 ...

  7. SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例

    本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...

  8. Linux C++ TCP Socket传输文件或图片实例

    环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服 ...

  9. Django中的缓存基础知识

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...

  10. ajax跨域请求のJSONP

    简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后台语言几乎全部支持: 3.轻量级 ...