分布式爬虫那些事儿

什么是分布式爬虫?

假设你有一群小伙伴,他们每个人都在帮你剥花生壳,然后把剥好的花生仁都丢到你面前的盘子里。分布式爬虫也差不多,许多台电脑一起上阵,各自负责去同一个网站获取数据,这叫建立一个分布式机群。

为什么要用分布式?

你一个人剥花生,速度自然慢。如果有一大堆人帮你,速度嗖嗖的上升。同理,为了提升爬取数据的效率,我们就用分布式爬虫。

怎么实现分布式爬虫?

我们用 scrapy+redis,具体是通过 scrapy-redis 这个组件来实现分布式。

为什么原版 scrapy 做不了分布式?

因为它的调度器和管道不能共享,像你只能独享这堆花生仁,别人就只能干瞪眼了。

scrapy-redis 组件有啥用?

它提供了可以被大家一起分享的调度器和管道!

环境安装:

  • 安装 redis

  • 安装 scrapy-redis:

    bash 复制代码
    pip install scrapy-redis

编码流程:

1. 创建一个新的工程

2. 创建一个爬虫文件

这个爬虫文件可以是基于 CrawlSpider 的,也可以是普通爬虫文件。

3. 修改爬虫文件

  • 导入必要的包:

    python 复制代码
    from scrapy_redis.spiders import RedisCrawlSpider  # 如果你用普通的Spider可以用 RedisSpider
  • 把 start_urls 替换成:

    python 复制代码
    redis_key = 'your_queue_name'

    表示这是一个共享调度器的队列名称。

  • 编写爬虫类爬取数据的逻辑(注意:这时候不写起始URL):

    python 复制代码
    class MySpider(RedisCrawlSpider):  
        name = 'my_spider'
        redis_key = 'my_spider:start_urls'
        
        def parse(self, response):
            # your parsing logic here
            pass

4. 对 settings.py 进行配置:

  • 开启共享管道:

    python 复制代码
    ITEM_PIPELINES = {
        'scrapy_redis.pipelines.RedisPipeline': 400
    }
  • 指定调度器:

    python 复制代码
    # 使用Redis的set集合来存储请求的指纹数据,实现请求去重
    DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
    
    # 使用scrapy-redis组件自己的调度器
    SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
    
    # 配置调度器是否要持久化,爬虫结束后是否清空Redis中请求队列和去重指纹的set
    SCHEDULER_PERSIST = True
  • 指定Redis服务地址和端口:

    python 复制代码
    REDIS_HOST = 'your_redis_server_ip'
    REDIS_PORT = 6379

5. 修改Redis配置文件:redis.windows.conf

  • 在第56行,将 #bind 127.0.0.1 去掉注释。
  • 在第75行,将 protected-mode 设置为 no。

6. 启动Redis服务

带上配置文件启动:

bash 复制代码
redis-server redis.windows.conf

7. 启动Redis客户端

bash 复制代码
redis-cli

执行我们的工程:

  • 进入爬虫文件对应的目录,运行爬虫:

    bash 复制代码
    scrapy runspider your_spider.py

最后一步,向调度器队列中添加一个起始URL:

在Redis客户端中输入:

bash 复制代码
lpush your_queue_name 'http://www.example.com'

这个 your_queue_name 就是你在爬虫文件中定义的 redis_key。

现在,就可以看着你的分布式爬虫计算机群高效地运行了!

相关推荐
深蓝电商API2 小时前
从零训练自己的验证码识别模型:数据生成到部署
爬虫·验证码
ly76895 小时前
Redis 分布式锁的边界条件:Redlock 争议、锁续期与客户端崩溃后的互斥失效
数据库·redis·分布式·分布式锁·watchdog·redlock
灯澜忆梦7 小时前
【minio】#5 | MinIO 分布式部署 + HTTPS 部署
分布式·网络协议·https·对象存储·minio
谢亮_vipxieliang17 小时前
Spring Cloud 服务治理入门:注册发现、配置中心、网关限流、熔断降级与分布式一致性方案
分布式·spring·spring cloud
樱花落木兰1 天前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
wuyk5551 天前
Python 网络爬虫入门到实战 第 04 章:请求头、UA 伪装、超时、异常处理、基础反爬绕过
开发语言·爬虫·python
ShineWinsu1 天前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
weixin_440401691 天前
质朴的爬虫+数据处理
爬虫·python·数据分析·pandas
Flynt2 天前
Redis Cluster主节点挂了,为什么"高可用"还全员掉线?我把三次kill的记录翻出来了
数据库·redis·分布式
JosieBook2 天前
【数据库】MySQL 实战精通系列 · 第10篇:分库分表与分布式事务实战
数据库·分布式·mysql