四、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,

          }

        }

    ```

posted @ 2020-05-11 20:10  Norni  阅读(182)  评论(0编辑  收藏  举报