ホームページ > バックエンド開発 > Python チュートリアル > Scrapy の分散クローラーとデータ クローリング効率を向上させる方法

Scrapy の分散クローラーとデータ クローリング効率を向上させる方法

WBOY
リリース: 2023-06-22 21:25:49
オリジナル
1454 人が閲覧しました

Scrapy は、クローラー プログラムを迅速かつ柔軟に作成できる効率的な Python Web クローラー フレームワークです。ただし、大量のデータや複雑な Web サイトを処理する場合、スタンドアロン クローラーではパフォーマンスとスケーラビリティの問題が発生する可能性があるため、データ クロールの効率を向上させるために分散型クローラーを使用する必要があります。この記事では、Scrapy の分散クローラーと、データ クローリングの効率を向上させる方法を紹介します。

1. 分散型クローラーとは何ですか?

従来のスタンドアロン クローラー アーキテクチャでは、すべてのクローラーが同じマシン上で実行されるため、大量のデータや高圧のクロール タスクに直面すると、マシンのパフォーマンスが低下することがよくあります。分散クローラは、クローラのタスクを複数のマシンに分散して処理します。分散コンピューティングとストレージにより、単一マシンの負荷が軽減され、それによってクローラの効率と安定性が向上します。

Scrapy の分散クローラーは、通常、オープンソースの分散スケジューリング フレームワーク Distributed Scrapy (略して DSC) を使用して実装されます。 DSC は、Scrapy クローラー プログラムを複数のマシンに分散して並列処理し、結果を中央のスケジューリング ノードに均一に要約します。

2. 分散クローラーを実装するにはどうすればよいですか?

1. 分散 Scrapy をインストールします

次のコマンドを実行して DSC をインストールします:

pip installscrapy_redis

pip install pymongo

2 Scrapy 構成ファイルを変更する

Scrapy プロジェクトの settings.py ファイルに次の構成を追加します:

Redis スケジューラを使用する

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

Redis 重複排除戦略を使用する

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

Redis レコードをクリアしない場合は、クロールを一時停止/再開できます

SCHEDULER_PERSIST=True

redis の接続パラメータを設定します

REDIS_HOST='localhost'
REDIS_PORT=6379

3. クローラー コードを記述します

Scrapy クローラー プログラムでは、開始リクエスト メソッドを変更する必要があります。scrapy-redis の開始メソッドを使用します:

encoding:utf-8

importscrapy,re,json
from ..items import DouyuItem

fromcrapy_redis.spiders import RedisSpider

class DouyuSpider(RedisSpider):

# 爬虫名字
name = 'douyu'
# redis-key,从redis中pop数据进行爬取
redis_key = 'douyu:start_urls'

def parse(self, response):
    # scrapy爬虫代码
ログイン後にコピー

4. Redis サービスを開始します

#ターミナルで次のコマンドを実行して、redis サービスを開始します:

redis-server

5. Start Distributed Scrapy

ターミナルで次のコマンドを入力して、redis サービスを開始しますDSC ノード:

scrapy roll douyu -s JOBDIR= job1

このうち、job1 はカスタム名にすることができ、DSC がクローラーのステータスを記録するために使用します。

3. Scrapy クローラーの最適化

Scrapy には、クローラーの効率を最適化するためのさまざまな方法が用意されており、分散型クローラーと併用すると、データ クローリングの効率をさらに向上させることができます。

1. CrawlerRunner の使用

CrawlerRunner では、アプリケーションを拡張するために Twisted クラスが必要です。単に Python ファイルを実行する場合と比較して、複数のプロセスや複数のマシンを使用せずに、同じプロセス内で複数のクローラを同時に実行できます。これにより、タスク管理が容易になります。

CrawlerRunner の使用方法は次のとおりです。

fromTwisted.internet importactor,defer

fromscrapy.crawler import CrawlerRunner
fromscrapy.utils.project import get_project_settings
from my_spider.spiders.my_spider import MySpider

runner = CrawlerRunner(get_project_settings())

@defer.inlineCallbacks

def roll():

yield runner.crawl(MySpider)
reactor.stop()
ログイン後にコピー
crawl ()

reactor.run()

2. ダウンロード ミドルウェアの優先度を下げる

ダウンロード ミドルウェアで大量または複雑なデータを処理する必要がある場合は、次のようにします。 CONCURRENT_REQUESTS_PER_DOMAIN を使用して、ダウンロード ミドルウェアの優先度を下げます。優先度:

CONCURRENT_REQUESTS_PER_DOMAIN = 2

DOWNLOAD_DELAY = 0.5
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.MyCustomDownloaderMiddleware': 543,
}

3. 調整 CONCURRENT_REQUESTS および DOWNLOAD_DELAY パラメータ

CONCURRENT_REQUESTS は、各ドメイン名が同時に処理できるリクエストの最大数を示し、マシンの構成とタスクの要件に応じて合理的に調整できます。

DOWNLOAD_DELAY は、各リクエスト間の遅延時間を表します。遅延または非同期リクエストを増やすことで、クローラーの効率を向上させることができます。

4. 概要

Scrapy の分散クローラーは、大量のデータを迅速に処理し、クローラーの効率を向上させるのに役立ちます。同時に、ダウンロード ミドルウェアの優先度を下げ、コルーチンの数を調整し、リクエストの遅延を増やすことで、クローラーの効率をさらに向上させることができます。分散クローラーは Scrapy の重要な機能の 1 つであり、これを学習すると、さまざまなクローラーのタスクを簡単に処理できるようになります。

以上がScrapy の分散クローラーとデータ クローリング効率を向上させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート