python 爬虫通过bloomfilter实现增量爬取/去重(重复爬取)/更新爬取

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.csdn.net/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:
那么 就说明 文章没有更新
- 否则
文章就是更新了

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值