Scrapy爬虫框架实现数据的备份 数据存储到文件、MySQL、MongoDB、Redis中

首页 » Python教程 » Scrapy爬虫框架实现数据的备份 数据存储到文件、MySQL、MongoDB、Redis中
如何实现数据的备份?
一、数据的备份指的是将爬取到的一组数据存储到多个不同的载体(文件、MySQL、MongoDB、Redis)中
二、持久化存储的操作必须要写在管道文件中(pipelines.py)
一个管道类对应一种形式的持久化存储
如果将数据存储到多个载体中则必须要有多个管道类

我们前面讲过,要使用管道必须要在settings.py文件中开启管道,这里存在一个优先级,数值越小优先级越高。那么现在有一个问题,让两个管道类都接收到item且对其进行持久化存储,爬虫文件提交的item可以同时提交给多个管道类吗?我们知道爬虫文件提交的item只可以交给优先级最高的一个管道类

如何可以让优先级低的管道类也可以接收item呢?
可以让优先级高的管道类在process_item方法中通过return item的形式将item传递给下一个即将被执行的管道类。记住这一点,我们再来往下进行!

如果想使用多个管道需要在每个管道的process_item方法中return item并且对管道进行注册,优先级不可相同!

数据存储到MySQL

前提是你的电脑中有mysql数据库,这里需要现在数据库中创建一张表:

show databases;  #查看一下所有的数据库

create database spider charset=utf8; #创建数据库spider

use spider #切换到spider数据库中

create table meizi (href varchar(100),title varchar(1000)); #创建数据库表
desc meizi

然后在Python需要安装PyMysql模块,代码参考:

import pymysql
#将数据存储到MySQL中一份
class MysqlPipeline(object):
    conn=None
    def open_spider(self,spider):
        #连接mysql数据
        self.conn = pymysql.Connect(host='127.0.0.1', port=3306,db='test',
                                    charset='utf8')
        #print(self.conn)
    def process_item(self, item, spider):
        href=item['href']
        title=item['title']
        sql='insert into meizi values("%s","%s")' % (href,title)
        # 使用游标对象执行sql语句 创建游标对象
        self.cusor=self.conn.cursor()
        try:
            self.cusor.execute(sql) #执行sql语句
            self.conn.commit() #提交事务
        except Exception as e:
            print(e)
            self.conn.rollback() #如果插入出错 进行事务回滚

    # 重写父类的方法:只会在爬虫结束前调用一次
    def close_spider(self,spider):
        self.cusor.close()
        self.conn.close()

数据存储到MongoDB

如果不知道如何操作mongodb,参考:

# 将数据存储到mongodb一份
from pymongo import MongoClient
class MongoDbPipeline(object):
    def open_spider(self,spider):
        self.client=MongoClient(host='127.0.0.1',port=27017)
        self.database=self.client.Meizi  #创建数据库名字
        self.collection=self.database.meizi #数据库集合的名字
    def process_item(self,item,spider):
        href=item['href']
        title=item['title']
        self.collection.insert_one({'href':href,'title':title})
    def close_spider(self,spider):
        print('存储到mongodb数据库成功')

数据存储到Redis

需开启redis服务端,这里以字符串的形式存储:

# 将数据存储到redis一份
import redis,json
class RedisPipeline(object):
    def open_spider(self,spider):
        self.client=redis.StrictRedis(host='127.0.0.1',port=6379)
        self.key="meizi_key" #设置key
    def process_item(self,item,spider):
        href=item['href']
        title=item['title']
        value=json.dumps({'href':href,'title':title})
        self.client.set(self.key,value)
    def close_spider(self,spider):
        print('存储到redis数据库成功')

数据存储到文件

# -*- coding: utf-8 -*-
class Myspider1Pipeline:
    def open_spider(self,spider):
        self.file=open('./meizi.txt','w',encoding='utf-8')
    def process_item(self, item, spider):
        href=item['href'] #将item对象中存储的值取出
        title=item['title']
        self.file.write(href+':'+title+'\n')
        return item
    def close_spider(self,spider):
        self.file.close()

开启管道

ITEM_PIPELINES = {
   'myspider1.pipelines.Myspider1Pipeline': 300,
   'myspider1.pipelines.RedisPipeline': 301,
   'myspider1.pipelines.MysqlPipeline': 302,
   'myspider1.pipelines.MongoDbPipeline': 303,
}

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Scrapy爬虫框架实现数据的备份 数据存储到文件、MySQL、MongoDB、Redis中》 发布于2020-05-09

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

7 + 7 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册