Scrapy 分散クローラー、キュー、ブルーム フィルターを 1 分で入手

Scrapy 分散クローラー、キュー、ブルーム フィルターを 1 分で入手

[[348974]]

Scrapy を使用して分散クローラーを開発しますか?一番早い方法は何か知っていますか?分散クローラーを 1 分で開発または変更することは本当に可能ですか?

では、早速実践方法を見ていき、その後で詳細についてお話していきましょう。

すぐに始めましょう

ステップ0:

まず、Scrapy-Distributed をインストールします。

  1. pip で scrapy-distributed をインストールします

必要なランタイムがない場合は、テスト用に 2 つの Docker イメージ (RabbitMQ と RedisBloom) を起動できます。

  1. # RabbitMQ コンテナをプルして実行します。  
  2. docker run -d --name rabbitmq -p 0.0.0.0:15672:15672 -p 0.0.0.0:5672:5672 rabbitmq:3  
  3. # RedisBloom コンテナをプルして実行します。  
  4. docker run -d --name redis-redisbloom -p 0.0.0.0:6379:6379 redislabs/rebloom:latest

ステップ 1 (オプション):

既存のクローラーがある場合は、この手順をスキップして手順 2 に直接進むことができます。

クローラー プロジェクトを作成します。ここではサイトマップ クローラーを例に挙げます。

  1. scrapy startproject 簡単な例

次に、spiders フォルダー内のスパイダー プログラム ファイルを変更します。

  1. scrapy_distributed.spiders.sitemap から SitemapSpider をインポート 
  2. scrapy_distributed.queues.amqp から QueueConfig をインポートします 
  3. scrapy_distributed.dupefilters.redis_bloom から RedisBloomConfig をインポートします 
  4. クラス MySpider(SitemapSpider):  
  5. 名前= "例"    
  6. サイトマップのURL = ["http://www.people.com.cn/robots.txt"]  
  7. queue_conf:キュー構成キュー構成= キュー構成(  
  8. name = "example" durable = True arguments ={"x-queue-mode": "lazy", "x-max-priority": 255} です。  
  9.  
  10. redis_bloom_conf: RedisBloomConfig RedisBloomConfig = RedisBloomConfig(キー= "example:dupefilter" )  
  11. def parse(自己、レスポンス):
  12.   self.logger.info(f"レスポンスを解析、URL: {response.url}")

ステップ2:

設定ファイル settings.py の SCHEDULER、DUPEFILTER_CLASS を変更し、RabbitMQ と Redis の関連設定を追加するだけで、すぐに分散クローラーを取得できます。 Scrapy-Distributed は、デフォルトの RabbitMQ キューとデフォルトの RedisBloom フィルターを初期化するのに役立ちます。

  1. # RabbitMQとRedisBloomを統合したスケジューラ 
  2. # RabbitMQのスケジューラのみを使用する場合は、ここで scrapy_distributed.schedulers.amqp.RabbitScheduler を記入できます 
  3. スケジューラ= "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 = "ローカルホスト"    
  9. BLOOM_DUPEFILTER_REDIS_PORT = 6379    
  10. # Redis Bloomクライアントの設定はコピーするだけ 
  11. REDIS_BLOOM_PARAMS = {  
  12. "redis_cls": "redisbloom.client.クライアント"  
  13. }  
  14. # ブルームフィルタの誤判定率の設定。設定が書かれていない場合、デフォルト値は 0.001 です。  
  15. BLOOM_DUPEFILTER_ERROR_RATE = 0.001  
  16. # ブルーム フィルターの容量構成。設定が書かれていない場合、デフォルト値は100_0000です。  
  17. ブルーム_デュプフィルター_容量= 100_0000  

また、Spider クラスに 2 つのクラス属性を追加して、RabbitMQ キューまたは RedisBloom フィルターを初期化することもできます。

  1. クラス MySpider(SitemapSpider):  
  2. ......  
  3. # 引数パラメータを通じてさらに多くのパラメータを設定できます。この例では、遅延モードと最大優先度を設定します 
  4. queue_conf:キュー構成キュー構成= キュー構成(  
  5. name = "example" durable = True arguments ={"x-queue-mode": "lazy", "x-max-priority": 255} です。  
  6.  
  7. # キー、エラーレート、容量を使用して、それぞれブルームフィルターの Redis キー、エラー率、容量を設定します。  
  8. redis_bloom_conf: RedisBloomConfig RedisBloomConfig = RedisBloomConfig(キー= "example:dupefilter" error_rate = 0 .001 、 capacity = 100_0000 )  
  9. ......

ステップ3:

  1. スクレイピークロールの例

RabbitMQ キューと RedisBloom フィルターを確認してください。正常に動作していますか?

ご覧のとおり、Scrapy-Distributed のサポートにより、構成ファイルを変更するだけで、通常のクローラーを RabbitMQ キューと RedisBloom フィルターをサポートする分散クローラーに変更できるようになります。 RabbitMQ と RedisBloom 環境では、構成の変更に 1 分しかかかりません。

Scrapy-Distributedについて

現在、Scrapy-Distributed は主に Scrapy-Redis と scrapy-rabbitmq の 2 つのライブラリを指します。

Scrapy の経験があれば、分散クロールを迅速に実行できる Scrapy-Redis ライブラリをご存知かもしれません。 RabbitMQ をクローラー タスク キューとして使用しようとしたことがある場合は、scrapy-rabbitmq プロジェクトをご覧になったことがあるかもしれません。 Scrapy-Redis はすでに非常に便利であり、scrapy-rabbitmq も RabbitMQ をタスク キューとして実装できることは事実ですが、いくつか欠陥があります。ここで簡単にいくつかの疑問を提起したいと思います。

  • Scrapy-Redis は Redis のセットを使用して重複を排除します。リンクの数が多くなるほど、占有するメモリも多くなります。多数のタスクを実行する分散クローラーには適していません。
  • Scrapy-Redis は Redis リストをキューとして使用します。多くのシナリオでは、タスクのバックログが発生し、メモリ リソースが急速に消費されることになります。たとえば、Web サイトのサイトマップをクロールする場合、リンクがキューに入る速度は、キューから出る速度よりもはるかに速くなります。
  • scrapy-rabbitmq などの RabbitMQ の Scrapy コンポーネントは、キューの作成時に RabbitMQ でサポートされるさまざまなパラメータを提供しず、キューの永続性などのパラメータを制御することはできません。
  • scrapy-rabbitmq などの rabbitmq フレームワークのスケジューラはまだ分散 dupefilter をサポートしていないため、ユーザーは関連するコンポーネントを自分で開発または接続する必要があります。
  • Scrapy-Redis や scrapy-rabbitmq などのフレームワークは侵入的です。これらのフレームワークを使用して分散クローラーを開発する必要がある場合は、独自のクローラー コードを変更し、フレームワークの Spider クラスを継承して分散機能を実現する必要があります。

そこで、この時に Scrapy-Distributed フレームワークが誕生しました。非侵入型設計により、settings.py の設定を変更するだけで、フレームワークはデフォルトの構成に従ってクローラーを配布できます。

Scrapy-Redis と scrapy-rabbitmq の問題点のいくつかを解決するために、Scrapy-Distributed は次のことを行います。

  • RedisBloom の Bloom フィルターが使用され、メモリの消費量が少なくなります。
  • RabbitMQ キューによって宣言されたすべてのパラメータ構成をサポートし、RabbitMQ キューが遅延モードをサポートしてメモリ使用量を削減できるようにします。
  • RabbitMQ のキュー宣言はより柔軟です。異なるクローラーは同じキュー構成を使用することも、異なるキュー構成を使用することもできます。
  • Scheduler の設計では、複数のコンポーネントの組み合わせがサポートされています。 RedisBloom の DupeFilter を単独で使用することも、RabbitMQ の Scheduler モジュールを単独で使用することもできます。
  • Scrapy 配布の非侵入型設計が実装されています。通常のクローラーは、設定を変更するだけで配布できます。

現在、フレームワークに多くの機能が追加されています。関心のある友人は、プロジェクト リポジトリの開発に引き続き注目し、一緒にアイデアについて話し合うことができます。

<<:  クラウドで生産性を向上させる方法

>>:  分散コンセンサスアルゴリズム EPaxos について 1 つの記事で学ぶ

推薦する

ユーザーの視点からウェブサイトのコンテンツについて語る: 独創性は一時的なものに過ぎないのか?

ウェブサイトのコンテンツは、ウェブサイトの品質を測る基本的な要素です。どのようなウェブサイトのコンテ...

BibiTieがBaiduに禁止された本当の理由

説明不要の機密情報サイト「ビビティ」が百度に根絶されたことは皆さんご存知だと思います。企業のサイトが...

ブラックテクノロジーの解明:眼科医は5G+8Kをどのように活用して遠隔診療を行っているのか?

秋にアップルが発表した新製品では、iPhone にこれまでで最高のディスプレイが搭載されました。 S...

arkecx日本国際回線クラウドサーバーレビュー、中国聯通と中国移動回線に適しており、中国電信にはやや劣る!

arkecxは、日本の東京データセンターで日本のクラウドサーバー(日本のvps)を提供しています。デ...

草の根は成長の節目であるSEO戦略計画策定を経なければならない

時間が経つにつれて、あなたのノートは美しい芸術作品になります。すべての戦略がくしゃくしゃに丸められて...

BaiduはSEOを嫌っている。SEO担当者は注意してほしい

今日は2012年2月15日です。鄭州は晴れていません。私の気分は天気と同じです。キーワードのランキン...

高品質のウェブサイトを構築するにはどうすればいいでしょうか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス高品質なウェブサイトを構...

ハイブリッドクラウドアーキテクチャモデルを1つの記事で解説

クラウド アーキテクチャについて話すとき、通常はクラウド プラットフォーム自体のアーキテクチャではな...

360は他社への攻撃的な姿勢を失い、3つの変化を遂げた。

[360 に関する最近のニュースは、他のインターネット企業に対する攻撃が減り、自社の開発に対する反省...

VMwareは、お客様が迅速かつ柔軟にクラウドに移行できるようサポートします。

急速な発展とデジタル化の緊急のニーズに駆り立てられ、今日のデジタル企業は、迅速な変革を実現するために...

2017 年の APP プロモーションに知っておくべき新しい ASO 最適化のトレンド!

結局のところ、 ASO は本質的にはユーザーのニーズを満たし、ユーザーの判断と理解に応えることであり...

Aruba、インテリジェントエッジ向けの業界初のクラウドネイティブプラットフォームを発表

Hewlett Packard Enterprise の子会社である Aruba は本日、業界初の ...

製品ニーズの背後にあるユーザーの動機をどう引き出すか

[コアヒント] ユーザーを中心に据えて製品を設計する場合、プロダクトマネージャーは単純な需要現象を超...

Profitserver: オランダのアムステルダムにある VPS の簡単なレビュー

ロシアの会社であるProfitserverは、複数のデータセンターでVPSを運営しています。ここでは...