返回介绍

15.2 scrapy_redis 实现分布式爬虫

发布于 2025-04-21 19:15:31 字数 2564 浏览 0 评论 0 收藏

15.2.1 scrapy_redis 库

要实现分布式爬虫框架,scrapy_redis 库必不可少。scrapy_redis 库提供了所需的功能,scrapy_redis 改写了 Scrapy 的调度器、队列等组件,利用这个库可以方便地实现 Scrapy 分布式架构。

下面使用 pip 安装 scrapy_redis 库。

>pip install scrapy_redis 

我们以第 11 章中的房天下二手房房源爬虫为例,讲解如何配置分布式爬虫。

1. 修改 settings 中的配置信息

(1)替换 Scrapy 调度器,使用 scrapy_redis 调度。

SCHEDULER = "scrapy_redis.scheduler.Scheduler" 

(2)使用 scrapy_redis 去重。

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

(3)设置 Redis 的连接信息,这里的可以设置用户名和密码,如果没有则为空。

REDIS_URL = 'redis://localhost:6379' 

(4)设置 Redis 队列是否保存。

SCHEDULER_PERSIST = True

如果设置为 True,则不会清空 Redis 里面的去重队列和请求队列,这样设置后,去重队列和请求队列会一直保存在 Redis 数据库中,用户可以暂停和启动爬虫而不影响继续去重。

(5)设置重启爬虫时是否清空爬取队列。

SCHEDULER_FLUSH_ON_START = True

如果设置为 True,每次重启爬虫,系统都会清空去重队列和请求队列,一般设置为 False。

还有很多其他设置,读者可以参考 scrapy_redis 官方文档。

2. 修改 spider

当使用 scrapy_redis 编写分布式爬虫时,需要将爬虫类修改为继承自 scrapy_redis.spiders.RedisCrawlSpider 类。

import scrapy
from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import CrawlSpider, Rule 
from pachong3.items import Pachong3Item 
from scrapy_redis.spiders import RedisCrawlSpider 
 
class FangSpider(RedisCrawlSpider): 
    name = 'fang' 
    allowed_domains = ['fang.com'] 
    redis_key = 'FangSpider:start_urls' 
... 

修改完成后启动爬虫。因为代码中没有指定初始 URL,爬虫将一直等待,没有爬取任何网页。用户可以手动向 Redis 的初始 URL 队列中添加 URL,队列的名称为 FangSpider:start_urls。默认情况下,在命令行中定位到 Redis 目录,然后采用集合的命令进行添加。

redis-cli lpush FangSpider:start_urls http://esf.fang.com/ 

向 scrapy-redis 队列中添加初始 URL 后,爬虫就开始运行了。爬虫会一直运行,直到没有任何 Request 对象或待抓取的 URL。

15.2.2 分布式爬虫的部署和存储

要在各个服务器部署爬虫,需要将上面更改后的代码复制到各个服务器。对分布式爬虫爬取数据的存储,提供 3 种方案供读者参考。

1. 分布式存储

分布式存储即在每个服务器上都安装数据库,如 MongoDB 数据库。这种方式配置比较麻烦,并且数据相对分散,但是可靠性比较高,不会因为某一台服务器宕机而丢失全部数据。

2. 集中式存储

集中式存储即所有服务器通过网络共用一个数据库,如设置一台 MongoDB 数据库服务器,然后各个爬虫服务器都将数据存储到这台 MongoDB 服务器上。这种方式对提取数据非常方便,但是存在安全性问题:如果存储服务器宕机,整个分布式爬虫框架也会相应停止。可以通过使用 MongoDB 集群提高整个框架数据的稳定性和安全性。MongoDB 集群以主从节点保障整个存储系统的安全和稳定,一旦主节点出现问题,从节点会接管存储服务,成为新的主节点。读者可查询网络,了解具体的实现方法。

3. 云存储

可以向各大云主机服务商申请云主机,把爬取的数据直接保存到云主机上。这种方式的稳定性、安全性、便利性都非常好,非常适合公司运行大型分布式爬虫,缺点是需要花钱购买云服务。

假设使用 MongoDB 集中存储,所有的爬虫服务器都需要安装 Scrapy、scrapy_redis 和 pymongo,然后在各个服务器上运行爬虫程序,这样在安装了 Redis 数据库的主服务器上,可以看到 Redis 服务器维护的两个队列 - dupefilter 去重队列和 request 请求队列。

本节简单演示了使用 scrapy_redis 库实现简单分布式爬虫的代码实现,并讨论了分布式爬虫的存储方案。这里只是简单介绍,读者在实际工作中如果部署分布式爬虫,还需要更深入地了解和对比各种解决方案的优劣。另外,使用集中式存储,还要注意为 MongoDB 做安全设置。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。