feapder/docs/source_code/dedup.md

3.7 KiB
Raw Blame History

Dedup

Dedup是feapder大数据去重模块不同于BloomFilter去重受槽位数量影响Dedup使用了弹性的去重机制可容纳海量的数据去重。

去重方式

临时去重

基于redis支持批量去重有时效性。去重一万条数据约0.26秒一亿条数据占用内存约1.43G

from feapder.dedup import Dedup

data = {"xxx": 123, "xxxx": "xxxx"}
datas = ["xxx", "bbb"]

def test_ExpireFilter():
    dedup = Dedup(
        Dedup.ExpireFilter, expire_time=10, redis_url="redis://@localhost:6379/0"
    )

    # 逐条去重
    assert dedup.add(data) == 1
    assert dedup.get(data) == 1

    # 批量去重
    assert dedup.add(datas) == [1, 1]
    assert dedup.get(datas) == [1, 1]

内存去重

基于内存支持批量。去重一万条数据约0.5秒一亿条数据占用内存约285MB

from feapder.dedup import Dedup

data = {"xxx": 123, "xxxx": "xxxx"}
datas = ["xxx", "bbb"]

def test_MemoryFilter():
    dedup = Dedup(Dedup.MemoryFilter)  # 表名为test 历史数据3秒有效期

    # 逐条去重
    assert dedup.add(data) == 1
    assert dedup.get(data) == 1

    # 批量去重
    assert dedup.add(datas) == [1, 1]
    assert dedup.get(datas) == [1, 1]

永久去重

基于redis支持批量永久去重。 去重一万条数据约3.5秒一亿条数据占用内存约285MB

from feapder.dedup import Dedup

def test_BloomFilter():
    dedup = Dedup(Dedup.BloomFilter, redis_url="redis://@localhost:6379/0")

    # 逐条去重
    assert dedup.add(data) == 1
    assert dedup.get(data) == 1

    # 批量去重
    assert dedup.add(datas) == [1, 1]
    assert dedup.get(datas) == [1, 1]

过滤数据

Dedup可以通过如下方法过滤掉已存在的数据

from feapder.dedup import Dedup

def test_filter():
    dedup = Dedup(Dedup.BloomFilter, redis_url="redis://@localhost:6379/0")

    # 制造已存在数据
    datas = ["xxx", "bbb"]
    dedup.add(datas)

    # 过滤掉已存在数据 "xxx", "bbb"
    datas = ["xxx", "bbb", "ccc"]
    dedup.filter_exist_data(datas)
    assert datas == ["ccc"]

Dedup参数

  • filter_type去重类型支持BloomFilter、MemoryFilter、ExpireFilter三种

  • redis_url不是必须传递的若项目中存在setting.py文件且已配置redis连接方式则可以不传递redis_url

    -w294

    import feapder
    from feapder.dedup import Dedup
    
    class TestSpider(feapder.Spider):
        def __init__(self, *args, **kwargs):
            self.dedup = Dedup() # 默认是永久去重
    
  • name: 过滤器名称 该名称会默认以dedup作为前缀 dedup:expire_set:[name]dedup:bloomfilter:[name]。 默认ExpireFilter name=过期时间BloomFilter name=dedup:bloomfilter:bloomfilter

-w499

若对不同数据源去重可通过name参数来指定不同去重库

  • absolute_name:过滤器绝对名称 不会加dedup前缀
  • expire_timeExpireFilter的过期时间 单位为秒,其他两种过滤器不用指定
  • error_rateBloomFilter/MemoryFilter的误判率 默认为0.00001
  • to_md5去重前是否将数据转为MD5默认是

爬虫中使用

框架支持对请求和入库的数据进行去重,仅需要在配置文件中进行配置即可

ITEM_FILTER_ENABLE = False # item 去重
REQUEST_FILTER_ENABLE = False # request 去重

或者可以直接导入此去重模块使用

from feapder.dedup import Dedup