scrapy pipelines过滤重复数据

news/2025/2/21 8:02:56

scrapy pipelines过滤重复数据

    • 方法 1:基于内存的简单去重(适合小规模数据)
    • 方法 2:基于持久化存储去重(适合大规模数据/重启恢复)
    • 方法 3:使用 Scrapy 内置的 dupefilter(针对请求去重)
    • 方法 4:布隆过滤器(超大数据集优化)
    • 方法 5:分布式去重(Redis)
    • 关键点总结

方法 1:基于内存的简单去重(适合小规模数据)

使用 Python 的 set 或 dict 存储已抓取数据的唯一标识(如 URL、ID),在 Pipeline 中检查是否重复。

python"># pipelines.py
from scrapy.exceptions import DropItem

class DuplicatesPipeline:
    def __init__(self):
        self.seen_ids = set()  # 存储已处理的唯一标识

    def process_item(self, item, spider):
        # 假设 item 中有唯一标识字段 'id'
        unique_id = item['id']
        if unique_id in self.seen_ids:
            raise DropItem(f"Duplicate item found: {item}")
        self.seen_ids.add(unique_id)
        return item

配置启用 Pipeline:

python"># settings.py
ITEM_PIPELINES = {
    'your_project.pipelines.DuplicatesPipeline': 300,
}

方法 2:基于持久化存储去重(适合大规模数据/重启恢复)

当数据量较大或需要持久化时,可以使用数据库(如 SQLite、Redis)或文件存储唯一标识。
示例:使用 SQLite

python"># pipelines.py
import sqlite3
from scrapy.exceptions import DropItem

class SQLiteDuplicatesPipeline:
    def __init__(self):
        self.conn = sqlite3.connect('scrapy_data.db')
        self.cursor = self.conn.cursor()
        self.cursor.execute('CREATE TABLE IF NOT EXISTS seen_ids (id TEXT PRIMARY KEY)')

    def process_item(self, item, spider):
        unique_id = item['id']
        self.cursor.execute('SELECT id FROM seen_ids WHERE id=?', (unique_id,))
        if self.cursor.fetchone():
            raise DropItem(f"Duplicate item found: {item}")
        else:
            self.cursor.execute('INSERT INTO seen_ids VALUES (?)', (unique_id,))
            self.conn.commit()
            return item

    def close_spider(self, spider):
        self.conn.close()

方法 3:使用 Scrapy 内置的 dupefilter(针对请求去重)

Scrapy 默认通过 DUPEFILTER_CLASS 过滤重复请求(基于 URL),但如果你需要更细粒度的 Item 去重,仍需自定义 Pipeline。

方法 4:布隆过滤器(超大数据集优化)

使用布隆过滤器(Bloom Filter)降低内存占用,适合海量数据去重,但有一定误判率。

python"># 安装:pip install pybloom-live
from pybloom_live import ScalableBloomFilter
from scrapy.exceptions import DropItem

class BloomDuplicatesPipeline:
    def __init__(self):
        self.bf = ScalableBloomFilter(initial_capacity=1000, mode=ScalableBloomFilter.SMALL_SET_GROWTH)

    def process_item(self, item, spider):
        unique_id = item['id']
        if unique_id in self.bf:
            raise DropItem(f"Duplicate item found: {item}")
        self.bf.add(unique_id)
        return item

配置启用 Pipeline:

python"># settings.py
ITEM_PIPELINES = {
    'your_project.pipelines.BloomDuplicatesPipeline': 200,
}

方法 5:分布式去重(Redis)

分布式爬虫中,使用 Redis 存储全局唯一标识,支持多爬虫实例共享去重数据。

python"># pipelines.py
import redis
from scrapy.exceptions import DropItem

class RedisDuplicatesPipeline:
    def __init__(self, redis_host, redis_port):
        self.redis = redis.StrictRedis(host=redis_host, port=redis_port, db=0)
    
    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            redis_host=crawler.settings.get('REDIS_HOST'),
            redis_port=crawler.settings.get('REDIS_PORT')
        )

    def process_item(self, item, spider):
        unique_id = item['id']
        if self.redis.sismember('seen_ids', unique_id):
            raise DropItem(f"Duplicate item found: {item}")
        self.redis.sadd('seen_ids', unique_id)
        return item

关键点总结

  1. 唯一标识选择:根据业务选择唯一字段(如 URL、商品 ID、哈希值)。
  2. 内存 vs 持久化:小数据用内存结构(set),大数据用数据库或布隆过滤器。
  3. 分布式需求:使用 Redis 或类似工具实现全局去重。
  4. 异常处理:发现重复时抛出 DropItem 终止后续 Pipeline 处理。

根据实际场景选择最适合的方案!


http://www.niftyadmin.cn/n/5860504.html

相关文章

硬件岗位是否适合你?

在当今科技飞速发展的时代,硬件行业作为技术创新的基石,始终扮演着至关重要的角色。无论是智能手机、自动驾驶汽车,还是人工智能服务器,硬件都是这些技术的核心支撑。然而,硬件岗位是否适合你?作为一名硬件专家,我将从多个角度为你分析,帮助你判断自己是否适合从事硬件…

react实例与总结(二)

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

IC卡、M1卡及各类卡的原理使用说明

1. M1卡 1.1 M1卡说明 请参考:https://blog.csdn.net/dancehole/article/details/126868829 1.2 M1卡测试 M1卡的0扇区是只读扇区,我们可以测试下读写,我们向0扇区写入数据,返回失败,读取数据,数据如下…

详解Nginx 配置

一、Nginx 介绍 Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器。它由俄罗斯的程序设计师 Igor Sysoev 所开发,自 2004 年发布以来,凭借其高性能、低内存消耗、高并发处理能力等特点&#xf…

k8s ssl 漏洞修复

针对Kubernetes集群中SSL/TLS协议信息泄露漏洞(CVE-2016-2183)的修复,需重点修改涉及弱加密算法的组件配置。以下是具体修复步骤及验证方法: 一、漏洞修复步骤 1. 修复etcd服务 修改配置文件 : 编辑 /etc/kubernetes/…

爱普生 SG-8101CE 可编程晶振在笔记本电脑的应用

在笔记本电脑的精密架构中,每一个微小的元件都如同精密仪器中的齿轮,虽小却对整体性能起着关键作用。如今的笔记本电脑早已不再局限于简单的办公用途,其功能愈发丰富多样。从日常轻松的文字处理、网页浏览,到专业领域中对图形处理…

Android 11.0 WiFi连接默认设置静态IP地址功能实现

1.前言 在11.0的系统rom定制化开发中,在定制化某些功能开发中,在wifi模块中,有产品需要要求设置wifi静态ip功能,而系统中wifi连接 后ip是动态的,每次开机后 连接wifi的ip就是不固定的,所以产品需要采用固定ip,就需要实现静态ip功能 2.WiFi连接默认设置静态IP地址功能实…

DeepSeek动画视频全攻略:从架构到本地部署

DeepSeek 本身并不直接生成动画视频,而是通过与一系列先进的 AI 工具和传统软件协作,完成动画视频的制作任务。这一独特的架构模式,使得 DeepSeek 在动画视频创作领域发挥着不可或缺的辅助作用。其核心流程主要包括脚本生成、画面设计、视频合成与后期处理这几个关键环节。 …