15.2 scrapy_redis 实现分布式爬虫
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论