偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一分鐘搞定Scrapy分布式爬蟲、隊(duì)列和布隆過濾器

開發(fā) 后端 分布式
使用Scrapy開發(fā)一個(gè)分布式爬蟲?你知道最快的方法是什么嗎?一分鐘真的能 開發(fā)好或者修改出 一個(gè)分布式爬蟲嗎?先讓我們看看怎么實(shí)踐,再詳細(xì)聊聊細(xì)節(jié)。

[[348974]]

使用Scrapy開發(fā)一個(gè)分布式爬蟲?你知道最快的方法是什么嗎?一分鐘真的能 開發(fā)好或者修改出 一個(gè)分布式爬蟲嗎?

話不多說,先讓我們看看怎么實(shí)踐,再詳細(xì)聊聊細(xì)節(jié)。

快速上手

Step 0:

首先安裝 Scrapy-Distributed : 

  1. pip install scrapy-distributed 

如果你沒有所需要的運(yùn)行條件,你可以啟動(dòng)兩個(gè) Docker 鏡像進(jìn)行測試 (RabbitMQ 和 RedisBloom): 

  1. # pull and run a RabbitMQ container.   
  2. docker run -d --name rabbitmq -p 0.0.0.0:15672:15672 -p 0.0.0.0:5672:5672 rabbitmq:3   
  3. # pull and run a RedisBloom container.   
  4. docker run -d --name redis-redisbloom -p 0.0.0.0:6379:6379 redislabs/rebloom:latest 

Step 1 (非必須):

如果你有一個(gè)現(xiàn)成的爬蟲,可以跳過這個(gè) Step,直接到 Step 2。

創(chuàng)建一個(gè)爬蟲工程,我這里以一個(gè) sitemap 爬蟲為例:

  1. scrapy startproject simple_example 

然后修改 spiders 文件夾下的爬蟲程序文件: 

  1. from scrapy_distributed.spiders.sitemap import SitemapSpider  
  2. from scrapy_distributed.queues.amqp import QueueConfig  
  3. from scrapy_distributed.dupefilters.redis_bloom import RedisBloomConfig  
  4. class MySpider(SitemapSpider):  
  5.     name = "example"  
  6.     sitemap_urls = ["http://www.people.com.cn/robots.txt"]  
  7.     queue_conf: QueueConfigQueueConfig = QueueConfig(  
  8.         name="example"durable=Truearguments={"x-queue-mode": "lazy", "x-max-priority": 255}  
  9.     )  
  10.     redis_bloom_conf: RedisBloomConfigRedisBloomConfig = RedisBloomConfig(key="example:dupefilter" 
  11.     def parse(self, response): 
  12.          self.logger.info(f"parse response, url: {response.url}") 

Step 2:

只需要修改配置文件 settings.py 下的SCHEDULER, DUPEFILTER_CLASS 并且添加 RabbitMQ和 Redis 的相關(guān)配置,你就可以馬上獲得一個(gè)分布式爬蟲,Scrapy-Distributed 會(huì)幫你初始化一個(gè)默認(rèn)配置的 RabbitMQ 隊(duì)列和一個(gè)默認(rèn)配置的 RedisBloom 布隆過濾器。 

  1. # 同時(shí)集成 RabbitMQ 和 RedisBloom 的 Scheduler  
  2. # 如果僅使用 RabbitMQ 的 Scheduler,這里可以填 scrapy_distributed.schedulers.amqp.RabbitScheduler  
  3. SCHEDULER = "scrapy_distributed.schedulers.DistributedScheduler"  
  4. SCHEDULER_QUEUE_CLASS = "scrapy_distributed.queues.amqp.RabbitQueue"  
  5. RABBITMQ_CONNECTION_PARAMETERS = "amqp://guest:guest@localhost:5672/example/?heartbeat=0"  
  6. DUPEFILTER_CLASS = "scrapy_distributed.dupefilters.redis_bloom.RedisBloomDupeFilter"  
  7. BLOOM_DUPEFILTER_REDIS_URL = "redis://:@localhost:6379/0"  
  8. BLOOM_DUPEFILTER_REDIS_HOST = "localhost"  
  9. BLOOM_DUPEFILTER_REDIS_PORT = 6379  
  10. # Redis Bloom 的客戶端配置,復(fù)制即可  
  11. REDIS_BLOOM_PARAMS = {  
  12.     "redis_cls": "redisbloom.client.Client"  
  13.  
  14. # 布隆過濾器誤判率配置,不寫配置的情況下默認(rèn)為 0.001  
  15. BLOOM_DUPEFILTER_ERROR_RATE = 0.001  
  16. # 布隆過濾器容量配置,不寫配置的情況下默認(rèn)為 100_0000  
  17. BLOOM_DUPEFILTER_CAPACITY = 100_0000 

你也可以給你的 Spider 類,增加兩個(gè)類屬性,來初始化你的 RabbitMQ 隊(duì)列或 RedisBloom 布隆過濾器: 

  1. class MySpider(SitemapSpider):  
  2.     ......  
  3.     # 通過 arguments 參數(shù),可以配置更多參數(shù),這里示例配置了 lazy 模式和優(yōu)先級(jí)最大值  
  4.     queue_conf: QueueConfigQueueConfig = QueueConfig(  
  5.         name="example"durable=Truearguments={"x-queue-mode": "lazy", "x-max-priority": 255}  
  6.     )  
  7.     # 通過 key,error_rate,capacity 分別配置布隆過濾器的redis key,誤判率,和容量  
  8.     redis_bloom_conf: RedisBloomConfigRedisBloomConfig = RedisBloomConfig(key="example:dupefilter"error_rate=0.001, capacity=100_0000 
  9.     ...... 

Step 3:

  1. scrapy crawl example 

檢查一下你的 RabbitMQ 隊(duì)列 和 RedisBloom 過濾器,是不是已經(jīng)正常運(yùn)行了?

可以看到,Scrapy-Distributed 的加持下,我們只需要修改配置文件,就可以將普通爬蟲修改成支持 RabbitMQ 隊(duì)列 和 RedisBloom 布隆過濾器的分布式爬蟲。在擁有 RabbitMQ 和 RedisBloom 環(huán)境的情況下,修改配置的時(shí)間也就一分鐘。

關(guān)于Scrapy-Distributed

目前 Scrapy-Distributed 主要參考了Scrapy-Redis 和 scrapy-rabbitmq 這兩個(gè)庫。

如果你有過 Scrapy 的相關(guān)經(jīng)驗(yàn),可能會(huì)知道 Scrapy-Redis 這個(gè)庫,可以很快速的做分布式爬蟲,如果你嘗試過使用 RabbitMQ 作為爬蟲的任務(wù)隊(duì)列,你可能還見到過 scrapy-rabbitmq 這個(gè)項(xiàng)目。誠然 Scrapy-Redis 已經(jīng)很方便了,scrapy-rabbitmq 也能實(shí)現(xiàn) RabbitMQ 作為任務(wù)隊(duì)列,但是他們存在一些缺陷,我這里簡單提出幾個(gè)問題。

  •  Scrapy-Redis 使用 Redis 的 set 去重,鏈接數(shù)量越大占用的內(nèi)存就越大,不適合任務(wù)數(shù)量大的分布式爬蟲。
  •  Scrapy-Redis 使用 Redis 的 list 作為隊(duì)列,很多場景會(huì)有任務(wù)積壓,會(huì)導(dǎo)致內(nèi)存資源消耗過快,比如我們爬取網(wǎng)站 sitemap 時(shí),鏈接入隊(duì)的速度遠(yuǎn)遠(yuǎn)大于出隊(duì)。
  •  scrapy-rabbitmq 等 RabbitMQ 的 Scrapy 組件,在創(chuàng)建隊(duì)列方面,沒有提供 RabbitMQ 支持的各種參數(shù),無法控制隊(duì)列的持久化等參數(shù)。
  •  scrapy-rabbitmq 等 rabbitmq 框架的 Scheduler 暫未支持分布式的 dupefilter ,需要使用者自行開發(fā)或接入相關(guān)組件。
  •  Scrapy-Redis 和 scrapy-rabbitmq 等框架都是侵入式的,如果需要用這些框架開發(fā)分布式的爬蟲,需要我們修改自己的爬蟲代碼,通過繼承框架的 Spider 類,才能實(shí)現(xiàn)分布式功能。

于是,Scrapy-Distributed 框架就在這個(gè)時(shí)候誕生了,在非侵入式設(shè)計(jì)下,你只需要通過修改 settings.py 下的配置,框架就可以根據(jù)默認(rèn)配置將你的爬蟲分布式化。

為了解決Scrapy-Redis 和 scrapy-rabbitmq 存在的一些痛點(diǎn),Scrapy-Distributed 做了下面幾件事:

  •  采用了 RedisBloom 的布隆過濾器,內(nèi)存占用更少。
  •  支持了 RabbitMQ 隊(duì)列聲明的所有參數(shù)配置,可以讓 RabbitMQ 隊(duì)列支持 lazy-mode 模式,將減少內(nèi)存占用。
  •  RabbitMQ 的隊(duì)列聲明更加靈活,不同爬蟲可以使用相同隊(duì)列配置,也可以使用不同的隊(duì)列配置。
  •  Scheduler 的設(shè)計(jì)上支持多個(gè)組件的搭配組合,可以單獨(dú)使用 RedisBloom 的DupeFilter,也可以單獨(dú)使用 RabbitMQ 的 Scheduler 模塊。
  •  實(shí)現(xiàn)了 Scrapy 分布式化的非侵入式設(shè)計(jì),只需要修改配置,就可以將普通爬蟲分布式化。

目前框架還有很多功能正在添加,感興趣的小伙伴可以持續(xù)關(guān)注項(xiàng)目倉庫的動(dòng)向,有什么想法也可以一起討論。 

 

責(zé)任編輯:龐桂玉 來源: 馬哥Linux運(yùn)維
相關(guān)推薦

2018-06-28 14:00:01

分布式集群架構(gòu)

2016-12-16 11:05:00

分布式互斥線程

2024-01-05 09:04:35

隆過濾器數(shù)據(jù)結(jié)構(gòu)哈希函數(shù)

2019-06-21 10:00:42

微服務(wù)分布式架構(gòu)

2011-02-21 17:48:35

vsFTPd

2020-08-28 13:02:17

布隆過濾器算法

2025-03-11 08:50:00

CASID分布式

2024-11-04 08:45:48

布隆過濾器元數(shù)據(jù)指紋值

2009-12-02 17:21:19

Cisco路由器配置

2017-03-30 19:28:26

HBase分布式數(shù)據(jù)

2024-03-15 11:21:22

布隆過濾器數(shù)據(jù)庫數(shù)據(jù)

2024-09-18 10:08:37

2017-02-21 13:00:27

LoadAverage負(fù)載Load

2018-07-31 16:10:51

Redo Undo數(shù)據(jù)庫數(shù)據(jù)

2017-07-06 08:12:02

索引查詢SQL

2020-05-21 19:46:19

區(qū)塊鏈數(shù)字貨幣比特幣

2018-06-26 05:23:19

線程安全函數(shù)代碼

2022-07-18 06:16:07

單點(diǎn)登錄系統(tǒng)

2025-05-26 09:25:00

Web 接口開發(fā)Redis

2025-04-30 08:47:41

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)