pybloom_live安装包地址 https://github.com/joseph-fox/python-bloomfilter
git clone 下来后python setup install 如果报 vs之类的错误,请安装vs环境
vs [网盘地址]https://pan.baidu.com/s/1kdtJC6VXO9urSE5ILKmn9A
基本只要装这几个就行了
不保证这个 100% 能够成功,我第一次安装完成后,再去安装pybloom_live 成功了
filename: BloomCheck.py
# -*- coding: UTF-8 -*-
from pybloom_live import BloomFilter
import os
import hashlib
class BloomCheckFunction(object):
def __init__(self):
self.filename = 'bloomFilter.blm'
is_exist = os.path.exists(self.filename) #判断文件是否存在
if is_exist:
self.bf = BloomFilter.fromfile(open(self.filename, 'rb')) #存在直接打开 储存在内存中
else:
self.bf = BloomFilter(100000000, 0.001) #新建一个 储存在内存中
def process_item(self, data):
data_encode_md5 = hashlib.md5(data.encode(encoding='utf-8')).hexdigest()
if data_encode_md5 in self.bf:
# 内容没有更新 丢弃item return False
return False
else:
self.bf.add(data_encode_md5)
#内容不存在,新来的 return True
return True
def save_bloom_file(self):
self.bf.tofile(open(self.filename, 'wb'))
如何调用:
from BloomCheck import *
bf = BloomCheckFunction()#对象初始化 只需要初始化一遍
#假如这里开始是爬虫的逻辑
#比如你有 n 长度的list 数据需要验证
for item in list:
if bf.process_item(item): # True 新来的数据 False 已经存在的数据
#这里对数据进行处理
save_item........
else:
print("pass for item exsit ")
#假如这里是爬虫结束
bf.save_bloom_file()
这样基本的去重和增量是写好了 那么我们的更新爬取怎么实现呢?
这就要回到我们的BloomCheckFunction了,为什么要md5 加密呢,其实是为了方便一些特殊的数据。比如我们要爬https://blog.youkuaiyun.com/qq_33042187/article/details/78929834这个文章
1.获取url
2.通过请求获取到了 html.
3.通过数据获取到了关键的 文章内容 content
啊 突然莫一天 博主 修改了文章 你再爬一编 发现 content改变了 那我们该怎么办呢,
很简单
1.在获取到 content后 先 然后通过 BloomCheckFunction 来查重
2.注意 我们 要进行的 process_item 可不是content 而是 content+url
3.bf.process_item(content+url)俩个参数一起验证 是否存在,
- 如果 MD5(content+url) in self.bf:
那么 就说明 文章没有更新
- 否则
文章就是更新了