Scrapy は、さまざまな Web サイトからデータを簡単に取得できる非常に便利な Python クローラー フレームワークです。同時に、データのクロールに Scrapy を使用するユーザーが増えているため、Scrapy を使用する過程で、必要なデータをより効率的にクロールできるようにクローラーを最適化する方法を検討する必要があります。この記事では、Scrapy でクローラーを最適化するためのヒントをいくつか紹介します。
Scrapy を使用して Web ページ データをクロールすると、繰り返しリクエストが発生する可能性があります。このような状況を放置すると、ネットワーク リソースと時間が無駄になります。したがって、Scrapy を使用する場合は、重複したリクエストを避けるように注意する必要があります。
Scrapy では、DUPEFILTER_CLASS パラメータを設定することで、リクエストの繰り返しを回避できます。 Redis またはメモリ重複排除モジュールを使用して、リクエストの繰り返しを避けることができます。設定は次のとおりです。
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
Web ページ データをクロールするときに、Web サイトのクロール防止メカニズムに遭遇し、Web サイトによってブロックされる可能性があります。リクエストが多すぎるため、シールドを追加しました。したがって、クローラリクエストの頻度がより安定するように、遅延を増やすことを検討する必要があります。
Scrapy では、DOWNLOAD_DELAY パラメータを設定することでリクエストの遅延を増やすことができます。
DOWNLOAD_DELAY=3 # 设置下载延迟为3秒
Web サイトによってクローラーとして認識されないようにするには、ブラウザーのユーザー エージェントをシミュレートする必要があります。 Scrapy では、settings.py ファイルに USER_AGENT パラメータを設定することでこの機能を実現できます。以下に例を示します:
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
Scrapy では、デフォルトで、最大再試行回数に達すると各リクエストが再試行されます。重複排除操作。したがって、リクエストが多い場合、この操作により多くのネットワーク IO 操作が発生し、プログラムが遅くなります。この状況を最適化するために、リクエスト データとリクエストされたメソッドの URL ハッシュ値をメモリに保存して、URL がリクエストされたかどうかをすぐに判断できるようにします。これを実現するには、次のコードを使用します。
from scrapy.utils.request import request_fingerprint seen = set() fp = request_fingerprint(request) if fp in seen: return seen.add(fp)
Scrapy では、XPath または CSS セレクターを使用して要素を見つけることができます。 XPath は CSS セレクター以上のことができますが、CSS セレクターは XPath よりも高速です。したがって、クローラーを最適化するには、可能な限り CSS セレクターを使用する必要があります。
Scrapy はデフォルトでブロック I/O 操作を使用しますが、非同期 I/O 操作によりパフォーマンスが向上します。 Twisted パッケージの非同期 I/O 操作を使用して、Scrapy を非同期フレームワークに変えることができます。
データをクロールするときに、マルチスレッドを使用してクローラーを高速化できます。 Scrapy では、CONCURRENT_REQUESTS_PER_IP パラメータを設定することでスレッド数を設定できます。以下はサンプル コードです:
CONCURRENT_REQUESTS_PER_IP=16
要約
Scrapy は優れた Python クローラー フレームワークですが、使用中は必要なものをより効率的にクロールするためにクローラーの最適化に注意を払う必要があります。 。 データ。この記事では、Scrapy でクローラーを最適化するためのヒントをいくつか紹介します。お役に立てれば幸いです。
以上がScrapy でのクローラ最適化のヒントの共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。