欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

四、Item Pipeline

程序员文章站 2022-05-08 13:38:47
...

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

   分配给每个类的整型值,确定了它们运行的顺序,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,

          }

        }

    ```