利用Redis进行数据去重

前言

之前有篇文章提到了实现增量爬虫可以利用redis数据库进行url去重,今天博主就给大家分享一下python如何利用redis进行去重吧。在试验中,我们用到Redis数据库和hash算法,我们先了解一下Redis和hashlib。

Redis简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 优势

  • 读写速度极快,Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)。
  • Redis可以将内存中的数据利用快照和日志的形式保存到硬盘上,这样发生类似断电或者机器故障的时候,内存中的数据不会丢失。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

hashlib简介

hash是一种算法,不同的hash算法只是复杂度不一样, hashlib中提供了SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法,这些算法接受传入的内容,经过运算得到一串hash值

hashlib特点

  • 传入的内容一样,得到的hash值必然一样。
  • 不能由hash值返解成内容。
  • 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的,可以节省内存。
    以上就是对redis和hashlib的说明了,下面我们进行一些简单的试验,让大家能有更加深刻的了解。

程序分模块讲解

导入模块

import redis
import hashlib

创建Redis类

连接Redis数据库需要提供主机号和端口号,不需要密码,同时需要指定连接的数据库号(redis中默认存在0-15号数据库),这里我们使用集合存储数据
host处需要大家提供主机号。

class Redis():
    def __init__(self):
        self.con = redis.Redis(
            host='', #ip地址
            port=6379, #端口号,默认为6379
            db=15,
            decode_responses=True #设置为True存的数据格式就是str类型
        )
    def add(self,key,data):
        if self.exit(key,data):
            print("该数据已存在!")
        else:
            self.con.sadd(key,data) #添加
            print("添加成功")
    def query(self,key):
        return self.con.smembers(key)  #拿出key对应所有值
    def delete(self,key):
        self.con.delete(key) #删除key键
    def exit(self,key,data):
        return self.con.sismember(key, data)  # 判断key里是否有data,有则返回true

创建hashlib类

class Hashencode():
    def __init__(self):
        self.encode_machine = hashlib.md5()  # 创建一个md5对象
    def encode(self,url):
        self.encode_machine.update(url.encode()) #更新
        url_encode = self.encode_machine.hexdigest() #拿到编码后的十六进制数据
        return url_encode

有了以上两个类的基础,我们进行试验。

去重试验

实例化Redis和Hashlib对象

en = Hashencode()
re = Redis()

我们要试验url的去重

url = "https://www.baidu.com/s?wd=keras%E5%AE%9E%E6%88%98&pn=10&oq=keras" \
      "%E5%AE%9E%E6%88%98&ie=utf-8&rsv_pq=93a257f40023c669&rsv_" \
      "t=bad6XI9Ya3l%2FJJCLby9vpq3gjNg%2" \
      "FKPN9VTtXPhQTKdc1wdL%2FgQ4xNHxY5YU&rsv_page=1"

第一次存取

encode = en.encode(url)
re.add("urls",encode)
for i in re.query("urls"):
	print(i)
"""
结果:
添加成功!
5d53585df507174ae1f1c3b39d272f52
"""

第二次存取

re.add("urls",encode)
for i in re.query("urls"):
    print(i)
"""
结果:
该数据已存在!
5d53585df507174ae1f1c3b39d272f52
"""

我们可以看到确实实现了去重效果。
以上就是博主今天和大家分享的内容了,希望大家能够将Redis和Hashlib作为一大利器使用,同时希望这篇文章能给大家带来一定的收获,祝大家学习进步!

Scrapy-Redis是一个用于Scrapy爬虫的数据持久化中间件,它可以利用Redis作为数据存储和去重的解决方案。要在Scrapy项目中配置Redis去重机制,你需要按照以下步骤操作: 1. **安装scrapy-redis**: 在你的Scrapy项目目录中运行命令: ``` pip install scrapy_redis ``` 2. **添加中间件到settings.py**: 在`settings.py`文件中,确保已经包含了`scrapy_redis`的相关设置,并启用它。例如: ```python DOWNLOADER_MIDDLEWARES = { 'scrapy_redis.middleware.RedisMiddleware': 700, # 其他中间件... } ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300, } REDIS_PARAMS = { 'host': 'localhost', # Redis服务器地址,默认为localhost 'port': 6379, # Redis端口,默认为6379 'db': 0, # 数据库索引,一般选择0 'password': '', # 如果有密码,此处填入 } ``` 3. **启用去重功能**: 要启用去重,你需要开启RedisMiddleware,并设置相应的去重策略。可以选择`DUPEFILTER_CLASS`来指定去重规则。例如,使用简单的哈希去重: ```python DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" ``` 或者使用更复杂的基于请求的去重(如避免爬取相同的URL): ```python REDIS_KEY_PREFIX = 'your_prefix_' # 自定义Redis键前缀 ``` 4. **启动Redis客户端**: 确保你的Redis服务正在运行。如果没有,可以使用命令行启动本地Redis服务: ``` redis-server ``` 完成上述设置后,Scrapy-Redis会自动将请求ID、响应体等信息存入Redis,并通过哈希或自定义键进行去重处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值