• 四、Item Pipeline


    1、官方文档

      https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/item-pipeline.html

    2、简介

      当item在Spider中被收集之后,它会将被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。

    3、编写item pipeline组件

      通过在spider中yield item对象前,添加一个来源信息,item["come_from"]="spidername",以此来区分不同的返回的item。

      也可以通过传递过来的spider.name属性来判断,即if spider.name='spidername'... else...

      也可以导入item的类,通过if isinstance(item,myitem):...来执行相应的操作

      item pipeline组件是一个独立的Python类,其中process_item()方法必须实现。

    class SomethingPipeline(object):
        def __init__(self):
            # 可选实现,做参数初始化等
            pass
        def process_item(self,item,spider):
            #item(Item对象)---被爬取的item
            #spider(Spider对象)---爬取该item的spider
            # 这个方法必须实现,每个item pipeline组件都需要调用该方法
            # 这个方法必须返回一个Item对象,被丢弃的item将不会被之后的pipeline组件所处理
            return item  # 不return的情况下,另一个权重较低的pipeline就不会获取到该item
        def open_spider(self,spier):
            # spider(Spider对象)---被开启的spider
            # 可选参数,当spider被开启时,这个方法被调用
            pass
        def close_spider(self,spider):
            # spider(Spider对象)---被关闭的spider
            # 可选实现,当spider被关闭时,这个方法被调用
            pass

    4、启动一个item pipeline组件

      为了启用Item Pipeline组件,必须将它的类添加到settings.py文件ITEM_PIPELINES配置

      

       分配给每个类的整型值,确定了它们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内(0-1000随意设置,数值越低,组件的优先级越高)

    5、启动爬虫验证

      `scrapy crawl projectName`

    6、from_crawler(cls,crawler)方法

      参数crawler时一个Crawler对象

      from_crawler这个类方法从Crawler属性中创建一个pipeline实例,Crawler对象能够接触所有scrapy的核心组件,比如settings和signals

      ```

      import pymongo

      class MongoPipeline(object):

        collection_name = "scrapy_items"

        def __init__(self,mongo_uri,mongo_db):

          self.mongo_uri = mongo_uri

          self.mongo_db = mongo_db

        @classmethod

        def from_crawler(cls,crawler):  # 通过from_crawler方法获取settings中的MongoDB的url和数据名称,从而创建了一个MongoPipeline实例

          return cls(

            mongo_uri = crawler.settings.get("MONOG_URI")

            mongo_db = crawler.settings.get("MONGO_DATABASE","items")

          )

        def open_spider(self,spider):  # 当Spider开始运行时,再open_spider方法中建立数据库连接

          self.client = pymongo.MongoClient(self.mongo_uri)  
          self.db = self.client[self,mongo_db]

        def close_spider(self,spider):  # 当Spider关闭时,再close_spider方法中关闭数据库连接

          self.client.close()

        def process_item(self,item,spider):

          self.db[self.collection_name].insert(dict(item))

          return item

      ```

    7、item pipeline处理来自多个spider的item

      (1)可以通过process_item(self,item,spider)中的Spider参数判断是来自哪个爬虫。

      (2)配置Spider类中的custom_settings对象,为每一个Spider配置不同的Pipeline

        ```

          class MySpider(CrawlSpider):

            # 自定义配置

            custom_settings = {

              ”ITEM_PIPELINES“:{

                ”test.pipelines.TestPipeline”:1,

              }

            }

        ```

  • 相关阅读:
    Centos7安装Zabbix4.0步骤
    linux异常处理:selinux配置错误导致无法重启
    自学Python5.4-类 _init_方法
    自学Python5.3-类和对象的简单操作
    自学Linux Shell9.3-基于Red Hat系统工具包:RPM属性依赖的解决方式-YUM在线升级
    自学Linux Shell9.4-基于Red Hat系统工具包存在两种方式之二:源码包
    自学Linux Shell9.2-基于Red Hat系统工具包存在两种方式之一:RPM包
    JS 对象API之修改、删除对象的属性
    JS 对象API之判断自有属性、共有属性
    JS 对象API之判断父对象是否在子对象的原型链上
  • 原文地址:https://www.cnblogs.com/nuochengze/p/12871440.html
Copyright © 2020-2023  润新知