数据去重与增量更新:Redis 指纹校验、增量抓取

📂 所属阶段:第二阶段 — 数据流转(数据处理篇)


1. 指纹去重

import hashlib
import redis

class DuplicatesPipeline:
    def __init__(self):
        self.redis = redis.Redis(host='localhost', port=6379)
    
    def process_item(self, item, spider):
        # 生成指纹
        fingerprint = hashlib.md5(
            item['url'].encode()
        ).hexdigest()
        
        # 检查是否存在
        if self.redis.exists(f'item:{fingerprint}'):
            raise DropItem("Duplicate item")
        
        # 保存指纹
        self.redis.set(f'item:{fingerprint}', 1)
        
        return item

2. 增量抓取

class IncrementalSpider(scrapy.Spider):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.redis = redis.Redis()
    
    def parse(self, response):
        for item in response.css('div.item'):
            url = item.css('a::attr(href)').get()
            
            # 检查是否已抓取
            if not self.redis.exists(f'crawled:{url}'):
                yield scrapy.Request(
                    url,
                    callback=self.parse_item
                )
                self.redis.set(f'crawled:{url}', 1)

3. 小结

去重与增量的好处:

1. 节省带宽:不重复抓取
2. 提升效率:只抓取新数据
3. 降低成本:减少服务器负担

实现方式:
- 内存去重:简单但不持久
- Redis 去重:分布式、持久化

💡 记住:在大规模爬虫中,去重和增量更新是必须的。否则会浪费大量资源。


🔗 扩展阅读