2

私は、6,300 ほどのサイトをチェックして、それぞれに HTTP 要求を送信し、応答を測定することによって、サイトが稼働していることを確認する Python スクリプトを使用しています。現在、スクリプトを完全に実行するには約 40 分かかります。スクリプトを高速化する他の方法に興味がありました。2 つの考えは、スレッド化または複数の実行インスタンスのいずれかでした。

これが現在の実行順序です。

  1. スキャンするすべてのアクティブなドメインを取得するための MySQL クエリ (6,300 ギブ オア テイク)
  2. 各ドメインを反復処理し、urllib を使用して HTTP リクエストを各ドメインに送信します
  3. サイトが「200」を返さない場合は、結果をログに記録します
  4. 完了するまで繰り返す

これは、スレッド化で大幅に高速化できるように思えますが、スレッド化に慣れていないため、そのプロセスフローがどのように見えるかはよくわかりません。

誰かがサンプルの高レベル プロセス フローとスレッドを操作するためのその他の指針を提供できるか、スクリプト全般を改善する方法について他の洞察を提供できれば幸いです。

4

4 に答える 4

2

あなたはscrapyフレームワークを見ることができます。ウェブスクレイピング用に作られています。これは、ねじれた非常に高速な非同期ビルドです。

あなたの場合、スクレイピングするドメインのリストを取得するだけで、実際には何もスクレイピングせずに200が返されるかどうかを確認できます。それははるかに速いはずです。

リンクは次のとおりです: http ://scrapy.org/

于 2013-01-28T14:47:03.567 に答える
2

フローは次のようになります。

  1. ドメイン キューを作成する
  2. 結果キューを作成する
  3. スキャンするすべてのアクティブなドメインを取得するための MySQL クエリ
  4. ドメインをドメイン キューに入れる
  5. ワーカー スレッドのプールを生成する
  6. スレッドを実行する
  7. 各ワーカーはドメイン キューからドメインを取得し、リクエストを送信して、結果を結果キューに入れます。
  8. スレッドが終了するのを待ちます
  9. 結果キューからすべてを取得してログに記録する

おそらく、すべてのドメインに対して 6300 スレッドだけではなく、スレッドの数、つまりプールを調整する必要があります。

于 2013-01-28T14:48:38.043 に答える
1

スレッド化は間違いなくあなたが必要とするものです。アルゴリズムのシリアル化された性質が削除され、ほとんどがIOに制限されているため、HTTPリクエストを並列に送信することで多くのメリットが得られます。

あなたの流れは次のようになります:

  1. スキャンするすべてのアクティブなドメインを取得するためのMySQLクエリ(6,300ギブまたはテイク)
  2. 各ドメインを反復処理し、各ドメインにurllibHTTPリクエストを送信するために使用するスレッドを作成します
  3. 結果をスレッドに記録する

nドメインごとに1つのスレッドを作成する代わりに、キューを使用してワーカースレッドを作成し、キューにドメインを追加することで、このアルゴリズムを改善できます。あなたはスレッドに慣れていないので、私はあなたのために物事を少し簡単にしたかっただけです。

于 2013-01-28T14:45:54.340 に答える
-1

クライアントの強制終了を避けるために、開始するプロセスの最適な数を調査しながら、スレッド化する必要があると思います。Python マニュアルでは、ここを参照してください。同時に複数のページをダウンロードしますか?

そしてurllibthreadingmultiprocessingへ

于 2013-01-28T14:49:35.760 に答える