作者:佚名 2020-10-28 11:00:53
开发
后端
分布式 使用Scrapy开发一个分布式爬虫?你知道最快的方法是什么吗?一分钟真的能 开发好或者修改出 一个分布式爬虫吗?先让我们看看怎么实践,再详细聊聊细节。
我们提供的服务有:成都网站建设、网站设计、微信公众号开发、网站优化、网站认证、五峰ssl等。为近1000家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的五峰网站制作公司
使用Scrapy开发一个分布式爬虫?你知道最快的方法是什么吗?一分钟真的能 开发好或者修改出 一个分布式爬虫吗?
话不多说,先让我们看看怎么实践,再详细聊聊细节。
快速上手
Step 0:
首先安装 Scrapy-Distributed :
- pip install scrapy-distributed
如果你没有所需要的运行条件,你可以启动两个 Docker 镜像进行测试 (RabbitMQ 和 RedisBloom):
- # pull and run a RabbitMQ container.
- docker run -d --name rabbitmq -p 0.0.0.0:15672:15672 -p 0.0.0.0:5672:5672 rabbitmq:3
- # pull and run a RedisBloom container.
- docker run -d --name redis-redisbloom -p 0.0.0.0:6379:6379 redislabs/rebloom:latest
Step 1 (非必须):
如果你有一个现成的爬虫,可以跳过这个 Step,直接到 Step 2。
创建一个爬虫工程,我这里以一个 sitemap 爬虫为例:
- scrapy startproject simple_example
然后修改 spiders 文件夹下的爬虫程序文件:
- from scrapy_distributed.spiders.sitemap import SitemapSpider
- from scrapy_distributed.queues.amqp import QueueConfig
- from scrapy_distributed.dupefilters.redis_bloom import RedisBloomConfig
- class MySpider(SitemapSpider):
- name = "example"
- sitemap_urls = ["http://www.people.com.cn/robots.txt"]
- queue_conf: QueueConfigQueueConfig = QueueConfig(
- name="example", durable=True, arguments={"x-queue-mode": "lazy", "x-max-priority": 255}
- )
- redis_bloom_conf: RedisBloomConfigRedisBloomConfig = RedisBloomConfig(key="example:dupefilter")
- def parse(self, response):
- self.logger.info(f"parse response, url: {response.url}")
Step 2:
只需要修改配置文件 settings.py 下的SCHEDULER, DUPEFILTER_CLASS 并且添加 RabbitMQ和 Redis 的相关配置,你就可以马上获得一个分布式爬虫,Scrapy-Distributed 会帮你初始化一个默认配置的 RabbitMQ 队列和一个默认配置的 RedisBloom 布隆过滤器。
- # 同时集成 RabbitMQ 和 RedisBloom 的 Scheduler
- # 如果仅使用 RabbitMQ 的 Scheduler,这里可以填 scrapy_distributed.schedulers.amqp.RabbitScheduler
- SCHEDULER = "scrapy_distributed.schedulers.DistributedScheduler"
- SCHEDULER_QUEUE_CLASS = "scrapy_distributed.queues.amqp.RabbitQueue"
- RABBITMQ_CONNECTION_PARAMETERS = "amqp://guest:guest@localhost:5672/example/?heartbeat=0"
- DUPEFILTER_CLASS = "scrapy_distributed.dupefilters.redis_bloom.RedisBloomDupeFilter"
- BLOOM_DUPEFILTER_REDIS_URL = "redis://:@localhost:6379/0"
- BLOOM_DUPEFILTER_REDIS_HOST = "localhost"
- BLOOM_DUPEFILTER_REDIS_PORT = 6379
- # Redis Bloom 的客户端配置,复制即可
- REDIS_BLOOM_PARAMS = {
- "redis_cls": "redisbloom.client.Client"
- }
- # 布隆过滤器误判率配置,不写配置的情况下默认为 0.001
- BLOOM_DUPEFILTER_ERROR_RATE = 0.001
- # 布隆过滤器容量配置,不写配置的情况下默认为 100_0000
- BLOOM_DUPEFILTER_CAPACITY = 100_0000
你也可以给你的 Spider 类,增加两个类属性,来初始化你的 RabbitMQ 队列或 RedisBloom 布隆过滤器:
- class MySpider(SitemapSpider):
- ......
- # 通过 arguments 参数,可以配置更多参数,这里示例配置了 lazy 模式和优先级最大值
- queue_conf: QueueConfigQueueConfig = QueueConfig(
- name="example", durable=True, arguments={"x-queue-mode": "lazy", "x-max-priority": 255}
- )
- # 通过 key,error_rate,capacity 分别配置布隆过滤器的redis key,误判率,和容量
- redis_bloom_conf: RedisBloomConfigRedisBloomConfig = RedisBloomConfig(key="example:dupefilter", error_rate=0.001, capacity=100_0000)
- ......
Step 3:
- scrapy crawl example
检查一下你的 RabbitMQ 队列 和 RedisBloom 过滤器,是不是已经正常运行了?
可以看到,Scrapy-Distributed 的加持下,我们只需要修改配置文件,就可以将普通爬虫修改成支持 RabbitMQ 队列 和 RedisBloom 布隆过滤器的分布式爬虫。在拥有 RabbitMQ 和 RedisBloom 环境的情况下,修改配置的时间也就一分钟。
关于Scrapy-Distributed
目前 Scrapy-Distributed 主要参考了Scrapy-Redis 和 scrapy-rabbitmq 这两个库。
如果你有过 Scrapy 的相关经验,可能会知道 Scrapy-Redis 这个库,可以很快速的做分布式爬虫,如果你尝试过使用 RabbitMQ 作为爬虫的任务队列,你可能还见到过 scrapy-rabbitmq 这个项目。诚然 Scrapy-Redis 已经很方便了,scrapy-rabbitmq 也能实现 RabbitMQ 作为任务队列,但是他们存在一些缺陷,我这里简单提出几个问题。
于是,Scrapy-Distributed 框架就在这个时候诞生了,在非侵入式设计下,你只需要通过修改 settings.py 下的配置,框架就可以根据默认配置将你的爬虫分布式化。
为了解决Scrapy-Redis 和 scrapy-rabbitmq 存在的一些痛点,Scrapy-Distributed 做了下面几件事:
目前框架还有很多功能正在添加,感兴趣的小伙伴可以持续关注项目仓库的动向,有什么想法也可以一起讨论。
新闻名称:一分钟搞定Scrapy分布式爬虫、队列和布隆过滤器
网页URL:http://www.shufengxianlan.com/qtweb/news10/125310.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联