加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Scrapy进阶知识点总结(四)——Item Pipeline

发布时间:2020-12-20 10:56:55 所属栏目:Python 来源:网络整理
导读:? Item Pipeline Item Pipeline调用发生在Spider产生Item之后。当Spider解析完Response之后,Item就会传递到Item Pipeline,被定义的Item Pipeline组件会顺次调用,完成一连串的处理过程,比如数据清洗、存储等。 Item Pipeline的主要用途是: 清理HTML数据。

?

Item Pipeline

Item Pipeline调用发生在Spider产生Item之后。当Spider解析完Response之后,Item就会传递到Item Pipeline,被定义的Item Pipeline组件会顺次调用,完成一连串的处理过程,比如数据清洗、存储等。

Item Pipeline的主要用途是:

  • 清理HTML数据。

  • 验证爬取数据,检查爬取字段。

  • 查重并丢弃重复内容。

  • 将爬取结果保存到数据库。

?

Pipeline类

可以自定义管道类,但每个管道类必须实现以下方法:

process_item(self,item,spider)

process_item()是必须要实现的方法,被定义的Item Pipeline会默认调用这个方法对Item进行处理。比如,我们可以进行数据处理或者将数据写入到数据库等操作。它必须返回Item类型的值或者抛出一个DropItem异常。

参数:

  • item,是Item对象,即被处理的Item。

  • spider,是Spider对象,即生成该Item的Spider。

?

除了process_item()必须实现,管道类还有其它的方法实现:

1.open_spider(spider)

在Spider开启时被调用,主要做一些初始化操作,如连接数据库等。参数是即被开启的Spider对象

2.close_spider(spider)

在Spider关闭时被调用,主要做一些如关闭数据库连接等收尾性质的工作。参数spider就是被关闭的Spider对象

3.from_crawler(cls,crawler)

类方法,用@classmethod标识,是一种依赖注入的方式。它的参数是crawler,通过crawler对象,我们可以拿到Scrapy的所有核心组件,如全局配置的每个信息,然后创建一个Pipeline实例。参数cls就是Class,最后返回一个Class实例。

?

激活Item Pipeline组件

要激活Item Pipeline组件,必须将其类添加到 ITEM_PIPELINES设置中,如下例所示

ITEM_PIPELINES = {
    myproject.pipelines.Pipelineclass1: 300,myproject.pipelines.Pipelineclass2: 800,}

设置中为类分配的整数值决定了它们运行的??顺序:项目从较低值到较高值类别。习惯上在0-1000范围内定义这些数字。

?

示例

1.写入文件

import json

class JsonWriterPipeline(object):

    def open_spider(self,spider):
        self.file = open(items.jl,w)

    def close_spider(self,spider):
        self.file.close()

    def process_item(self,spider):
        line = json.dumps(dict(item)) + "n"
        self.file.write(line)
        return item

2.存入mysql

import pymysql
class MySQLPipeline(object):
    def __init__(self):
        # 连接数据库
        self.db = pymysql.connect(
            host=localhost,# 数据库IP地址
            port=3306,# 数据库端口
            db=dbname,# 数据库名
            user=root,# 数据库用户名
            passwd=root,# 数据库密码
            charset=utf8,# 编码方式
            )
        # 使用cursor()方法获取操作游标 
        self.cursor = self.db.cursor()

    def process_item(self,spider):
        #编写insert sql语句,这里是数据库中已经有表了
        sql =  "INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME) VALUES (‘%s‘,‘%s‘)" %(item[F_name],item[L_name])
        try:
            # 执行sql语句
            self.cursor.execute(sql)
            # 提交sql语句
            self.db.commit()
        except:
            # 发生错误时回滚
            self.db.rollback()
        # 返回item
        return item 
        
    def close_spider(self,spider):
        self.db.close()

3.存入mongodb

import pymongo
class MongodbPipeline(object):

    def __init__(self):
        # 建立MongoDB数据库连接
        self.client = pymongo.MongoClient(mongodb://localhost:27017/)
        # 连接所需数据库
        self.db = client[scrapy]
        # 连接集合(表)
        self.coll = db[collection_name]

    def process_item(self,spider):
        postItem = dict(item)  # 把item转化成字典形式
        self.coll.insert(postItem)  # 向数据库插入一条记录
        return item 
        
    def close_spider(self,spider):
        self.client.close()

4.from_crawler()实例

class MongoPipeline(object):
    collection_name = xxx

    def __init__(self,mongo_uri,mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls,crawler):
        return cls(
            #从crawler setting中获取配置
            mongo_uri=crawler.settings.get(MONGO_URI),mongo_db=crawler.settings.get(MONGO_DATABASE)
        )

    def open_spider(self,spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self,spider):
        self.client.close()

    def process_item(self,spider):
        postItem = dict(item) 
        self.db[self.collection_name].insert(postItem) 
        return item

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读