当前位置: 首页 > news >正文

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 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:

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

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

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

# 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)降低内存占用,适合海量数据去重,但有一定误判率。

# 安装: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:

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

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

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

# 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 处理。

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

相关文章:

  • Nginx WebSocket 长连接及数据容量配置
  • 文献阅读 250220-Convective potential and fuel availability complement near-surface
  • 10个Python 语法错误(SyntaxError)常见例子及解决方案
  • 2016年下半年软件设计师上午题的知识点总结(附真题及答案解析)
  • 后端Java Stream数据流的使用=>代替for循环
  • 接口测试-API测试中常用的协议(中)
  • 解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
  • 本地在ollama上部署deepseek或llama大模型
  • 2024华为OD机试真题-恢复数字序列(C++/Java/Python)-E卷-100分
  • Vue 中组件通信的方式有哪些,如何实现父子组件和非父子组件之间的通信?
  • 【含文档+PPT+源码】基于大数据的交通流量预测系统
  • 解决本地模拟IP的DHCP冲突问题
  • NutUI内网离线部署
  • 20250218反函数求导
  • IPv6报头40字节具体怎么分配的?
  • 快速入门Springboot+vue——MybatisPlus快速上手
  • 16 中介者(Mediator)模式
  • 编写测试计划的六大要素是什么
  • Python网络爬虫技术详解文档
  • 1. 面向对象编程:类/对象/继承/多态
  • 做外贸找客户的网站/万州网站建设
  • 西安做网站企业/快速提升关键词排名软件
  • 烟台网站建设设计开发/校园推广方案
  • 企业首次建设网站的策划方案/竞价如何屏蔽恶意点击
  • 做网站还有前景吗/公司网站的推广方案
  • 免费试用网站空间/近一周热点新闻