zoukankan      html  css  js  c++  java
  • 四、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,

              }

            }

        ```

  • 相关阅读:
    整除15问题
    软件工程基础Proposal提议
    对在大学阶段软件工程实践的一些想法
    运行web项目端口占用问题
    Day_1
    error C3615: constexpr 函数 "QAlgorithmsPrivate::qt_builtin_ctz" 不会生成常数表达式
    Qt应用程序的打包
    将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法
    linux部署html代码到linux服务器,并进行域名解析
    运行sudo apt-get install nginx时报错有几个软件包无法下载,要不运行 apt-get update 或者加上 --fix-missing 的选项再试试?解决
  • 原文地址:https://www.cnblogs.com/nuochengze/p/12871440.html
Copyright © 2011-2022 走看看