数据存储——Mysql与redis存储
本文主讲:如何将爬取下来的数据存储到Mysql数据库内及其redis数据库内…..
MySQL实现增量式爬虫(md5加密)【重点】
python 怎么对 url 字符串进行 MD5 加密
什么是MD5加密:就是将一串字符重新加密为定长32的唯一字符串(常常用作 url 加密)
为什么要对 url 进行MD5加密:因为有的 url 长度太长在实现增量式爬虫时的mysql url指纹库不好控制,所以进行MD5加密
实现语法:
1 | from hashlib import md5 → 导入md5模块(标准库模块) |
注意事项:一段字符经过md5加密之后结果是16进制字符串,那么相同的这段字符在经过md5加密,形成的16进制字符串是不变的
代码体验:
MySQL 增量式爬虫的实现逻辑
增量式爬虫的背景:假设爬取新闻网站资源,今天把所有的新闻全部爬取下来了,第二天网站又更新了几条新闻,这时我们只需要爬取更新的新闻即可,这就是做增量式爬虫的目的
增量式实现逻辑:创建一个 mysql 网站指纹数据表,将爬取过的 url(看情况确定是一级url 还是二级url) 经过 md5 加密之后保存进数据表,以后在爬取数据时先将待爬取的 url 与指纹数据表里面的加密url进行比对,如果url已经存在指纹数据表内,那么就停止爬取,没有则继续爬取
MySQL 增量式爬虫的具体实现思路
第一步:创建 mysql 指纹数据表
语法:
1 | create database 数据库名 charset=utf8; |
第二步:在向指定 url 服务器发送请求之前,先将url与mysql数据指纹库里面的url进行比对,没有一样的在发送请求
部分语法:
1 | 游标对象.execute(select * from 指纹数据表名) |
注意事项:url_tuple = 游标对象.fetchall() 语法获取的数据是元组嵌套,但是没关系,不管是元组还是元组的嵌套 in 关键字都可以判断指定数据是否在里面!!
第三步:如果判断 url 不在 url数据指纹库内,则爬取数据完成后,将这个url经过md5加密后写入到数据指纹库里面!!
MySQL增量式爬虫框架【重点】
redis数据库基本操作【重点】
什么是 redis 数据库
类型:非关系型数据库
数据存储类型:字符串(键值对)、列表,集合(去重),zset(有序集合),哈希(2的32次方减1个键值对)
数据存储位置:内存
优点:读取大量数据速度快
注意事项:redis的字符串其最基本的数据类型也是二进制类型的,你可以理解为redis内的字符串数据可以是任何类型的数据,比如说图片、音频等,其中redis的字符串类型最大可存储512mb的数据
怎么安装 redis 数据库
ubuntu安装指令:sudo apt-get install redis-server
ubuntu终端启动redis指令:redis-server
终端查看是否启动redis指令(常用):redis-cli
如果启动成功出现这串字符:redis 127.0.0.1:6379>
进入redis数据库指令:在 redis 127.0.0.1:6379> 基础上输入 ping
即可
截图:
redis 数据库的五大数据类型
1.字符串(键值对):redis 最基础的数据类型,其中字符串是二进制的,可以理解为redis的字符串可以存储任何数据,图片、音频等,但是redis的字符串(值)最大可存储512mb大小的数据
插入数据:SET 键名 值
获取数据:GET 键名
2.hash(哈希):哈希数据类型可以理解为键值对的集合,一个哈希最多可以存储232 -1 键值对(40多亿)
省略……..
3.列表:列表是redis最简单的数据类型,数据元素按照插入顺序排序(先插在后)
插入数据:lpush 键名 值
获取数据:lrange 键名 数据在列表开始下标 数据在列表结束下标
图示:
4.集合:redis的集合是字符串无序集合,元素不能重复,通过哈希表实现,因此添加、查找、删除的复杂度都是O(1)
插入数据:sadd 键名 数据
查询数据:smembers 键名
注意:添加一个数据到集合键里面,如果这个数据在集合存在则不能插入返回0,不在插入成功返回1
图示:
zset(无序集合):Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复
插入数据到集合内:zadd key score member
省略……
redis数据库的常用指令【重点】
怎么在redis数据库删除指定键
语法:del 键名
截图:
全部键指令截图:
redis 数据库一些关于字符串的操作
redis数据库与python交互【重点】
怎么安装 redis 数据库与 python 交互的第三方库
安装指令:pip3 install redis
redis 数据库与 python 交互的步骤
第一步:导入 redis 第三方数据库 → import redis
第二步:创建 redis 连接数据库对象 → red_obj = redis.Redis(host=主机,port=端口号,db=数据库号)
注意:redis默认有16个数据库,也就是数据库号可以是 0-15,一般选择0 redis的端口号是6379(整形)
第三步:利用创建的 redis 数据库对象对数据库进行操作 → result = red_obj.sadd("name:age" , "21")
向外键名为name的集合内插入键为age值为“21”的一条数据
注意:redis内的集合数据类型具有数据唯一性以及无序性的特征,如果上述插入的数据在集合内存在返回0,不存在返回数据1
截图:
redis实现增量爬虫【重点】
怎么利用 redis 实现增量式爬虫
实现重要方法:
第一步:在进行爬取指定url数据时,先将指定 url 写入到 redis 数据库集合内,获取返回值!
写入redis集合方法:连接数据库对象.sadd(键名,键名所对应的值)
第二步:如果返回值是1,就说明这个url还未加入到url指纹数据库内(未爬取),可进一步爬取当前url数据,如果返回值为 0 说明当前经过md5加密后的url已经加入到url指纹数据库内,无需爬取,退出程序(只适用于电商新闻类网站!)
实现原理:因为 redis 数据库的集合具有无序性以及数据唯一性!,当数据在redis集合内存在时,插入数据失败返回值为o
未完待续…..