数据存储——Mysql与redis存储

本文主讲:如何将爬取下来的数据存储到Mysql数据库内及其redis数据库内…..

MySQL实现增量式爬虫(md5加密)【重点】

python 怎么对 url 字符串进行 MD5 加密

什么是MD5加密:就是将一串字符重新加密为定长32的唯一字符串(常常用作 url 加密)

为什么要对 url 进行MD5加密:因为有的 url 长度太长在实现增量式爬虫时的mysql url指纹库不好控制,所以进行MD5加密

实现语法:

1
2
3
4
from hashlib import md5               →  导入md5模块(标准库模块)
s = md5() → 创建一个md5对象
s.update( url.edcode()) → 对 url 进行md5加密
加密结果 = s.hexdigest() → 获取加密后的十六进制url字符串

注意事项:一段字符经过md5加密之后结果是16进制字符串,那么相同的这段字符在经过md5加密,形成的16进制字符串是不变的

代码体验:

image-20211013095105307

MySQL 增量式爬虫的实现逻辑

增量式爬虫的背景:假设爬取新闻网站资源,今天把所有的新闻全部爬取下来了,第二天网站又更新了几条新闻,这时我们只需要爬取更新的新闻即可,这就是做增量式爬虫的目的

增量式实现逻辑:创建一个 mysql 网站指纹数据表,将爬取过的 url(看情况确定是一级url 还是二级url) 经过 md5 加密之后保存进数据表,以后在爬取数据时先将待爬取的 url 与指纹数据表里面的加密url进行比对,如果url已经存在指纹数据表内,那么就停止爬取,没有则继续爬取

MySQL 增量式爬虫的具体实现思路

第一步:创建 mysql 指纹数据表

语法:

1
2
create database 数据库名 charset=utf8;
create table 数据表名( 字段名 char(32not null )charset=utf8;

第二步:在向指定 url 服务器发送请求之前,先将url与mysql数据指纹库里面的url进行比对,没有一样的在发送请求

部分语法:

1
2
3
4
5
6
游标对象.execute(select * from 指纹数据表名)
url_tuple = 游标对象.fetchall()
if url in url_tuple:
退出程序
else:
继续爬取

注意事项: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 即可

截图:

image-20211013095217759

redis 数据库的五大数据类型

1.字符串(键值对):redis 最基础的数据类型,其中字符串是二进制的,可以理解为redis的字符串可以存储任何数据,图片、音频等,但是redis的字符串(值)最大可存储512mb大小的数据

插入数据:SET 键名 值

获取数据:GET 键名

image-20211013095228423

2.hash(哈希):哈希数据类型可以理解为键值对的集合,一个哈希最多可以存储232 -1 键值对(40多亿)

省略……..

3.列表:列表是redis最简单的数据类型,数据元素按照插入顺序排序(先插在后)

插入数据:lpush 键名 值

获取数据:lrange 键名 数据在列表开始下标 数据在列表结束下标

图示:

image-20211013095241914

4.集合:redis的集合是字符串无序集合,元素不能重复,通过哈希表实现,因此添加、查找、删除的复杂度都是O(1)

插入数据:sadd 键名 数据

查询数据:smembers 键名

注意:添加一个数据到集合键里面,如果这个数据在集合存在则不能插入返回0,不在插入成功返回1

图示:

image-20211013095257113

zset(无序集合):Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复

插入数据到集合内:zadd key score member

省略……

redis数据库的常用指令【重点】

怎么在redis数据库删除指定键

语法:del 键名

截图:

image-20211013095317287

全部键指令截图:

image-20211013095329179

image-20211013095343346

redis 数据库一些关于字符串的操作

image-20211013095357083

image-20211013095405396

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

截图:

image-20211013095424043

redis实现增量爬虫【重点】

怎么利用 redis 实现增量式爬虫

实现重要方法:

第一步:在进行爬取指定url数据时,先将指定 url 写入到 redis 数据库集合内,获取返回值!
写入redis集合方法:连接数据库对象.sadd(键名,键名所对应的值)

第二步:如果返回值是1,就说明这个url还未加入到url指纹数据库内(未爬取),可进一步爬取当前url数据,如果返回值为 0 说明当前经过md5加密后的url已经加入到url指纹数据库内,无需爬取,退出程序(只适用于电商新闻类网站!)

实现原理:因为 redis 数据库的集合具有无序性以及数据唯一性!,当数据在redis集合内存在时,插入数据失败返回值为o

未完待续…..