scrapy pipelines过滤重复数据

scrapy pipelines过滤重复数据

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

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

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

# pipelines.py
from scrapy.exceptions import DropItemclass 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:

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

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

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

# pipelines.py
import sqlite3
from scrapy.exceptions import DropItemclass 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 itemdef close_spider(self, spider):self.conn.close()

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

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

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

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

# 安装:pip install pybloom-live
from pybloom_live import ScalableBloomFilter
from scrapy.exceptions import DropItemclass 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:

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

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

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

# pipelines.py
import redis
from scrapy.exceptions import DropItemclass RedisDuplicatesPipeline:def __init__(self, redis_host, redis_port):self.redis = redis.StrictRedis(host=redis_host, port=redis_port, db=0)@classmethoddef 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.rhkb.cn/news/22165.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop初体验

一、HDFS初体验 1. shell命令操作 hadoop fs -mkdir /itcast hadoop fs -put zookeeper.out /itcast hadoop fs -ls / 2. Web UI页面操作 结论: HDFS本质就是一个文件系统有目录树结构 和Linux类似,分文件、文件夹为什么上传一个小文件也这…

python: SQLAlchemy (ORM) Simple example using mysql in Ubuntu 24.04

mysql sql script: create table School 表 (SchoolId char(5) NOT NULL comment主鍵primary key,學校編號,SchoolName nvarchar(500) NOT NULL DEFAULT comment 學校名稱,SchoolTelNo varchar(8) NULL DEFAULT comment電話號碼,PRIMARY KEY (SchoolId) #主…

解放大脑!用DeepSeek自动生成PPT!

DeepSeek应用(PPT篇) DeepSeek作为当前最好的AI大模型之一,其强大的文本生成能力被广泛的应用于各个领域,本文我们来聊聊用DeepSeek来自动生成PPT。 一、DeepSeek & PPT DeepSeek本身没有直接生成PPT的能力,换个…

从0到1:固件分析

固件分析 0x01 固件提取 1、从厂商官网下载 例如D-link的固件: https://support.dlink.com/resource/products/ 2、代理或镜像设备更新时的流量 发起中间人攻击MITM #启用IP转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward#配置iptables,将目…

docker独立部署milvus向量数据库

milvus镜像:国外封锁,国内源也不好用。基本上所有源都不能用 首先想到阿里云服务,但是阿里云国外服务器便宜的300~400呢。 基于成本考虑终于装上心心念念的milvus(*^▽^*) 安装 Milvus 安装 Milvus 独立版 wget https://raw.githubuserco…

宇树科技13家核心零部件供应商梳理!

2025年2月6日,摩根士丹利(Morgan Stanley)发布最新人形机器人研报:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形机器人100:全球人形机器人产业链梳理)。 Humanoid 100清单清单中…

win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统,报错:Operating System not found 二、原因分析 国产系统,需要注意的点: 需要看你的系统类…

C#初级教程(1)——C# 与.NET 框架:探索微软平台编程的强大组合

图片来源: https://www.lvhang.site/docs/dotnettimeline 即梦AI - 一站式AI创作平台 一、历史发展脉络 在早期的微软平台编程中,常用的编程语言有 Visual Basic、C、C。到了 20 世纪 90 年代末,Win32 API、MFC(Microsoft Found…

SpringBoot项目集成MinIO

最近在学习MinIO,所以想让自己的SpringBoot项目集成MinIO,在网上查阅资料,并进行操作的过程中遇到一些问题,所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。 一. MinIO的下载安装以及基本使用 1. 下载地址:https://d…

ROS2下编写package利用orbbec相机进行yolov8实时目标检测

视频讲解 ROS2下编写package利用orbbec相机进行yolov8实时目标检测 在《ROS2下编写orbbec相机C package并Rviz显示》的基础上,继续添加对获取的图像使用YOLO进行目标检测 首先安装YOLO以及相关库 pip3 install ultralytics 使用如下指令测试下yolo安装情况 yol…

uniapp引入uview组件库(可以引用多个组件)

第一步安装 npm install uview-ui2.0.31 第二步更新uview npm update uview-ui 第三步在main.js中引入uview组件库 第四步在uni.scss中引入import "uview-ui/theme.scss"样式 第五步在文件中使用组件

UE5.3 C++ TArray系列(一)

一.TArray概述 它们就相当于C动态数组Vector,但是被UE封装了,懂得都懂反射嘛,要不一不小心就被回收了。 它真的非常常见,我所用的容器中,它绝对排名第一,第二是TMap。 同类好理解,我平时也常用…

R语言NIMBLE、Stan和INLA贝叶斯平滑及条件空间模型死亡率数据分析:提升疾病风险估计准确性...

全文链接:https://tecdat.cn/?p40365 在环境流行病学研究中,理解空间数据的特性以及如何通过合适的模型分析疾病的空间分布是至关重要的。本文主要介绍了不同类型的空间数据、空间格点过程的理论,并引入了疾病映射以及对空间风险进行平滑处理…

一款社交媒体中查用户名的工具

简介 追踪 400 多个社交网络中的用户名社交媒体账户以查找账户 安装 # python环境 pip安装 pip install sherlock-project # Mac环境 brew安装 brew install sherlock # docker安装 docker pull sherlock/sherlock 使用方式 ->$ sherlock -h usage: sherlock [-h] [-…

unity学习50:NavMeshAgent 区域Areas和cost

目录 1 NavMeshAgent 区域和成本的问题 2 区域Areas 2.1 区域和颜色 2.2 区域和成本 2.3 区域成本的作用 2.4 地图测试准备 2.5 如何实现 2.5.1 unity的2022之前的老版本 2.5.2 unity的2022之后的新版本 2.6 如果测试失败,是因为没有bake 2.7 测试前&…

JAVA版本游戏进程读写操作

1.导入游戏进程读写Maven依赖 <dependency><groupId>io.github.2lius</groupId><artifactId>MemoryProcess</artifactId><version>0.1</version></dependency> GitHub地址 2.代码操作游戏读写内存 package com.lius.test;impo…

英文字体:极简现代浓缩未来派科技海报标题排版无衬线字体 PODIUM Sharp Font

PODIUM Sharp 是 2012 年设计的 DUDU 字体的扩展版本。多年后&#xff0c;我决定通过添加新的母版和粗细来重建和开发这种字体。最后&#xff0c;PODIUM Sharp 由 234 种款式组成&#xff1a;从超压缩发际线到超扩展重度。 这个项目的主要目的是在我在旧波兰标本中发现的不同模…

JEEWMS cgFormBuildController.do 方法mobileForm存在SQL注入

一:登录扫描 JeeWMS是一款免费开源的仓库管理系统,支持3PL和厂内物流,涵盖订单管理,仓储管理,计费管理,现场作业,RFID,AGV等功能。本文介绍了系统的简介,功能,安装,截图和链接,适合仓储企业和开发者参考。厦门市灵鹿谷科技有限公司JEEWMS jeecgFormDemoController…

谷粒商城—分布式高级②.md

认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…

华为昇腾910b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…