ホームページ >バックエンド開発 >Python チュートリアル >Python によるマルチスレッド クローラーと一般的な検索アルゴリズムの詳細な分析

Python によるマルチスレッド クローラーと一般的な検索アルゴリズムの詳細な分析

WBOY
WBOY転載
2022-04-19 17:25:172973ブラウズ

この記事では、python に関する関連知識を提供します。主にマルチスレッド クローラー開発と一般的な検索アルゴリズムに関連する問題を紹介します。一緒に見てみましょう。皆さんのお役に立てれば幸いです。 。 ヘルプ。

Python によるマルチスレッド クローラーと一般的な検索アルゴリズムの詳細な分析

# 推奨学習:

Python ビデオ チュートリアル

マルチスレッド クローラー

マルチスレッドの利点

リクエストと正規表現をマスターしたら、いくつかの単純な URL を実際にクロールし始めることができます。

ただし、この時点のクローラは 1 つのプロセスと 1 つのスレッドしか持たないため、
したがって、シングルスレッド クローラー と呼ばれます。シングルスレッド クローラーは一度に 1 ページしかアクセスしないため、コンピューターのネットワーク帯域幅を十分に活用できません。ページは最大でも数百 KB にすぎないため、クローラーがページをクロールすると、追加のネットワーク速度と、リクエストの開始からソース コードの取得までの時間が無駄になります。 クローラが同時に 10 ページにアクセスできる場合、クローラ速度が 10 倍になることと同じです。この目標を達成するには、マルチスレッド テクノロジを使用する必要があります。

Python 言語にはグローバル インタープリター ロック (グローバル インタープリター ロック、GIL) があります。これにより、Python のマルチスレッドは疑似マルチスレッドになります。つまり、本質的にはスレッドですが、このスレッドはそれぞれの処理を数ミリ秒間行うだけで、数ミリ秒後にシーンが保存され、他の処理に変更されます。数ミリ秒後、再び他の処理を実行します。1 ラウンド後、最初の処理に戻り、シーンを再開し、数ミリ秒間作業し、変更を続けます...マイクロ スケールの 1 つのスレッドは、複数の処理を実行するようなものです同時にマクロスケールでも。この仕組みは、I/O (入出力、入力/出力) が集中する操作にはほとんど影響を与えませんが、CPU の計算が集中する操作では、CPU の 1 つのコアしか使用できないため、パフォーマンスに大きな影響を与えます。インパクト。したがって、計算負荷の高いプログラムに関与する場合は、複数のプロセスを使用する必要がありますが、Python のマルチプロセスは GIL の影響を受けません。クローラーは I/O 集中型のプログラムであるため、マルチスレッドを使用するとクロールの効率が大幅に向上します。

マルチプロセス ライブラリ: multiprocessing

Multiprocessing 自体は Python のマルチプロセス ライブラリであり、マルチプロセスに関連する操作を処理するために使用されます。ただし、メモリとスタックのリソースはプロセス間で直接共有できず、新しいプロセスを開始するコストはスレッドのコストよりもはるかに大きいため、クロールにマルチスレッドを使用することには、複数のプロセスを使用するよりも多くの利点があります。

マルチプロセッシングの下にはダミー モジュールがあり、Python スレッドでさまざまなマルチプロセッシング方法を使用できるようになります。 ダミーの下に Pool クラスがあり、スレッド プールの実装に使用されます。
このスレッド プールには、map() メソッドがあり、これにより、スレッド プール内のすべてのスレッドが関数を「同時に」実行できるようになります。

例:

for ループを学習した後

for i in range(10):
	print(i*i)
もちろん、この書き方でも結果は得られますが、コードは 1 つずつ計算されるため、あまり効率的ではありません。効率的。 。マルチスレッド テクノロジを使用してコードで多数の数値の 2 乗を同時に計算できるようにする場合、それを実現するには multiprocessing.dummy を使用する必要があります:

マルチスレッドの使用例:

from multiprocessing.dummy import Pooldef cal_pow(num):
    return num*num
pool=Pool(3)num=[x for x in range(10)]result=pool.map(cal_pow,num)print('{}'.format(result))
上記のコードでは、

は最初に二乗を計算する関数を定義し、次に 3 つのスレッドでスレッド プールを初期化します。これら 3 つのスレッドは、10 の数値の 2 乗を計算する役割を果たします。最初に手持ちの数値の計算を終えた人が次の数値を取得し、すべての数値が計算されるまで計算を続けます。

この例では、

スレッド プールの map() メソッドは 2 つのパラメーターを受け取ります。最初のパラメーターは関数名で、2 番目のパラメーターはリストです。注: 最初のパラメータは関数の名前のみであり、括弧 を含めることはできません。 2 番目のパラメータは反復可能オブジェクトであり、この反復可能オブジェクトの各要素は関数 clac_power2() によってパラメータとして受け取られます。リストに加えて、タプル、セット、または辞書を、map() の 2 番目のパラメータとして使用できます。

マルチスレッド クローラー開発

クローラーは、特に Web ページのソース コードをリクエストする場合に I/O 集約型の操作であるため、単一のスレッドを使用して開発すると大量の時間を無駄にすることになります。 Web ページが返されるまで待機するため、クローラにマルチスレッド技術を適用すると、クローラの動作効率が大幅に向上します。例として。洗濯機で服を洗うのに50分、やかんでお湯を沸かすのに15分、単語を覚えるのに1時間かかります。まず洗濯機が洗濯するのを待って、洗濯が終わったらお湯を沸かし、沸騰したら単語を暗唱すると、合計125分かかります。

しかし、別の言い方をすると、全体として見ると、3 つのことが同時に実行できます。突然、他に 2 人がいて、そのうちの 1 人が衣類を洗濯機に入れる担当だとします。洗濯機が終わるのを待っている、お湯を沸かして水が沸騰するのを待つのは別の人が担当しており、単語を覚えるだけで済みます。水が沸騰すると、水を沸騰させる役割を果たしたクローンが最初に消えます。洗濯機が衣類の洗濯を終えると、衣類の洗濯を担当していたクローンが消滅します。最後に、単語を自分で覚えます。 3つのことを同時に完了するのにかかる時間はわずか60分です。

もちろん、上記の例が人生の実際の状況ではないことは誰でも間違いなくわかるでしょう。実際には、誰も分離されていません。現実の生活では、人は単語を覚えるとき、その単語を覚えることに集中します。お湯が沸騰すると、やかんが音を立てて思い出させます。服を洗うとき、洗濯機が「ディディ」という音を出します。 。したがって、リマインダーが来たら、対応するアクションを実行するだけでよく、毎分確認する必要はありません。上記の 2 つの違いは、実際にはマルチスレッド モデルとイベント ドリブンの非同期モデルの違いです。このセクションではマルチスレッド操作について説明します。非同期操作を使用するクローラー フレームワークについては後ほど説明します。ここで覚えておいてほしいのは、操作する必要があるアクションの数がそれほど多くない場合、2 つのメソッドのパフォーマンスに違いはありませんが、アクションの数が大幅に増加すると、マルチスレッドの効率向上が大きくなるということです。減少し、シングルスレッドよりもさらに悪化します。その時点では、非同期操作のみが問題の解決策となります。

次の 2 つのコードは、bd ホームページのクロールにおけるシングルスレッド クローラーとマルチスレッド クローラーのパフォーマンスの違いを比較するために使用されます。 Python によるマルチスレッド クローラーと一般的な検索アルゴリズムの詳細な分析
実行結果からわかるように、 1 つのスレッドには約 16.2 秒かかります。5 スレッドには約 3.5 秒かかります。これは、単一スレッドの時間の約 5 分の 1 です。 5 つのスレッドが「同時に実行」されることの効果を時間の観点から見ることもできます。ただし、スレッド プールが大きければ大きいほど良いというわけではありません。上記の結果から、5 つのスレッドの実行時間は、実際には 1 つのスレッドの実行時間の 5 分の 1 を少し超えることもわかります。追加のポイントは、実際にはスレッドの切り替えの時間です。これは、Python のマルチスレッドが依然としてマイクロ レベルでシリアルであることを側面から反映しています。したがって、スレッド プールの設定が大きすぎると、スレッドの切り替えによって発生するオーバーヘッドがマルチスレッドによるパフォーマンスの向上を相殺する可能性があります。スレッド プールのサイズは実際の状況に応じて決定する必要があり、正確なデータはありません。リーダーは、特定のアプリケーション シナリオでのテストと比較のためにさまざまなサイズを設定し、最適なデータを見つけることができます。

クローラーの一般的な検索アルゴリズム

深さ優先検索

オンライン教育 Web サイトのコース分類をクロールする必要があるコース情報。コースはホームページから始まり、言語ごとに Python、Node.js、Golang などのいくつかの主要なカテゴリに分かれています。クローラー、Django、Python での機械学習など、主要なカテゴリごとに多くのコースがあります。各コースは多くの授業時間に分かれています。

深さ優先探索の場合、巡回ルートは図のようになります(小さい順に通し番号)
Python によるマルチスレッド クローラーと一般的な検索アルゴリズムの詳細な分析

幅優先探索

シーケンス 以下の
Python によるマルチスレッド クローラーと一般的な検索アルゴリズムの詳細な分析

#アルゴリズム選択

たとえば、全国の Web サイト内のすべてのレストラン情報と各レストランの注文情報をクロールしたいとします。深さ優先アルゴリズムが使用されていると仮定すると、まず、あるリンクからレストラン A にクロールし、すぐにレストラン A の注文情報をクロールします。全国には何十万ものレストランがあるため、すべてを巡るには 12 時間かかる場合もあります。これによって生じる問題は、レストラン A の注文量が朝の 8 時に達する可能性があるのに対し、レストラン B の注文量は夕方 8 時に達する可能性があることです。注文量には 12 時間の差があります。人気レストランの場合、12時間で数百万の収入格差が生じる可能性があります。このように、データ分析をする際、12時間の時差があるため、レストランAとレストランBの売上実績を比較することが難しくなります。注文量に比べて、レストランの量の変化ははるかに小さいです。したがって、幅優先検索を使用する場合は、まず深夜 0 時から翌日の正午までのすべてのレストランをクロールし、次に 14 時から 20 時までの各レストランの注文量を重点的にクロールします。翌日の:00。このようにして、注文クローリングタスクの完了にかかる時間はわずか 6 時間となり、時差による注文量の差が縮まりました。同時に、ショップが数日おきに巡回する影響はほとんどないため、リクエストの数も減り、Web サイトにクローラーが発見されにくくなります。

別の例として、リアルタイムの世論を分析するには、Baidu Tieba をクロールする必要があります。人気のあるフォーラムには、最も古い投稿が 2010 年に遡ると仮定すると、数万ページの投稿がある場合があります。幅優先検索の場合、まずこのTieba内の全投稿のタイトルとURLを取得し、そのURLを元に各投稿を入力することで各フロアの情報を取得します。ただし、リアルタイムの世論であるため、7 年前の投稿は現在の分析にはあまり重要ではなく、より重要なのは新しい投稿であるため、新しいコンテンツを最初に取得する必要があります。過去のコンテンツと比較して、リアルタイムコンテンツが最も重要です。したがって、Tieba コンテンツをクロールする場合は、深さ優先検索を使用する必要があります。投稿を見つけたらすぐにアクセスして各フロアの情報をクロールし、1 つの投稿をクロールしたら、次の投稿にクロールすることができます。もちろん、これら 2 つの検索アルゴリズムはどちらか一方だけではなく、実際の状況に応じて柔軟に選択する必要がありますが、多くの場合は同時に使用することも可能です。

推奨学習:

Python ビデオ チュートリアル

以上がPython によるマルチスレッド クローラーと一般的な検索アルゴリズムの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。