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

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,
}
分享到 :

发表评论

登录... 后才能评论