実際、4つのサブシステムがあります。
1.情報を収集および抽出するプラグインを起動するためのサービス
2.一時的なデータストレージ
3.データインデックス
4.抽出されたデータを操作するためのアプリケーション(レポートジェネレーターなど)
各システムを順番に検討します。
サブシステムの概要
1.プラグイン起動サービス
利用可能なスケジュールに従って、ライブラリからプラグインを起動するサービスです。 個別のプラグインの実行中にエラーが発生した場合、サービスは特定のアクション(ログへの書き込み、電子メールによる開発者への通知、再起動、プラグインの無効化など)を実行します。
2.一時的なデータストレージ
補助システムは、インターネットからダウンロードしたページへのストレージとアクセスを提供します。 SQLデータベースを明示的に使用することはできません。データはインターネットから固体ストリームでダウンロードされ、多くのデータがあり、非常に高速に表示されます。さらに、いくつかのストリームで、常にアクセスされます(読み取り、変更、削除)高周波。 NoSQLデータベースを使用しようとしましたが、負荷に耐えることもできませんでした。 その結果、ハイブリッドリポジトリが作成されました。レコードに関する情報はSQLデータベースに保存され、HTMLコンテンツ自体は大きなファイルに保存されます。 定期的に、特別なプラグインがこれらのファイルから削除されたページを「カット」します。
3.データインデックス
データにすばやくアクセスするには、インデックスが必要です。 選択した日付の特定のカテゴリの広告の数を表示するとします。 データベースと一時ストレージから同様の選択を毎回行うことは、サーバーリソースにとって非常に高価です。 さらに、一部のデータは冗長になります。 したがって、毎日の広告のIDとそのカテゴリのみが入力されるインデックスが作成されます。
4.抽出されたデータを操作するためのアプリケーション
ここではすべてが明確です。 これらは、エンドユーザーが使用するアプリケーションです。 構築されたインデックスのおかげで、収集されたデータを迅速かつ便利に表示できるようになりました。 ユーザーがレポートテンプレートと選択基準を選択して、テーブルまたはグラフの形式でデータを受け取るWebアプリケーションにすることができます。 たぶん、これらは、活動が増加している広告のカテゴリーを反映するマネージャーへの毎日の手紙になるでしょう。
データ生産パイプライン
パイプラインの形式でデータを受信することを想像してください。
1. ソースサイトから検索結果ページをダウンロードするWebスパイダーのセット。 これらは、検索ボットが通常到達しないページです(SEOページを除き、ページ内の広告の数は不完全である可能性が高く、最も人気のあるカテゴリのみが含まれています)。 各サイトに対して、独自のリクエストロジックを使用して独自のプラグインを作成する必要があります。 これはクエリ文字列にパラメータを含むGET要求である場合があり、POSTを送信するか、Cookie経由でパラメータを送信する必要がある場合があります。 このようなプラグインを作成するには、ブラウザーに組み込まれているHTTPアナライザーが役立ちます。 検索結果をダウンロードするプラグインのタスクは、サイト上のすべてのカテゴリの広告をカバーし、そのすべてのページにアクセスして、コンテンツを一時ストレージに保存することです。 ページングを移動するとき(ページング-結果のページを移動するとき)のループを回避するために、ページのコンテンツを前のものと比較することをお勧めします。
2.パイプラインの次の段階は、ロードされたページから広告の詳細な説明 (製品、サービス、サイトの専門性に応じて) を含むページへのリンクを抽出するプラグインです。 ここで、すべてのリンクを分析して必要なリンクを選択するか、簡単な方法で各サイトのリンクの説明を入力してみてください。 最も簡単な方法は、XPath式を使用して各サイトからリンクを抽出することです。 プラグインはリンクを抽出し、それらをデータベースに保存して、処理済みの結果でページをマークします。 さらに、プラグインは、ページがエラーメッセージであるか、検索結果が見つからなかったかを確認できます。
検索結果を含むページを保存する必要がある理由について質問がある場合は、これが必要な理由を説明します。 非常に大きなサイトがあり、ダウンロードには時間がかかり、多くの場合、プラグインはエラーの結果として再起動を余儀なくされます。 エラーが発生します。それらは、サイトの操作、サーバーのパフォーマンス、ネットワークエラーに関連している可能性があります。 この場合、プラグインが中断された場所からダウンロードを続けるのが論理的です。 サイト上の何かが変更され、詳細なページへのリンクを取得できない場合は、XPathまたは取得アルゴリズムを変更してプラグインを再起動するだけで十分です。 再ダウンロードせずに、保存されているすべてのページをすばやく処理します。
3.次に、「ユニバーサル」プラグインが再び登場します。 彼はページへのリンクのリストを詳細とともに受け取り、それらをダウンロードして 、ページを一時ストレージに保存します。 一般に、すべてのページ(検索結果と詳細を含む)にはエージング期間があり、その後は無効と見なされて削除されます。 そして、それらの処理は古いものから新しいものへと実行されます。 処理後、処理済みとしてマークされます。 失敗した場合のダウンロードリンクには、ダウンロード試行の時刻がマークされているため、後で再試行できます。 エラーの原因は、サーバーまたはプロキシが一時的に利用できないことです。 個々のサイトからダウンロードするにはプロキシが必要になる場合があります。 さて、データソースサイトのサーバーの負荷を忘れてはなりません。1秒に1回までリクエストを送信する必要があります。
4.広告の詳細が記載されたページがあるので、 HTMLから必要な情報を抽出するだけです。 これを行うには、各サイトに独自のプラグインを作成するか、よりインテリジェントなユニバーサルプラグインを作成する必要があります。 最も単純なケースでは、各ドキュメントフィールドに再びXPathを使用できます。 HTMLの解析には、HtmlAgilityPackなどのライブラリが適しています。 抽出された情報は、何らかの汎用形式(XMLなど)で配置され、パイプラインに渡される必要があります。
5.すべてのデータを含むxmlファイルのセットから、たとえば特定のアプリケーションがすでに使用する適切なインデックスを作成するなど、タスクに従ってそれらを破棄できます。
おわりに
さまざまなサイト分野で使用される実際のシステムを簡単に紹介しました。 実際、4年間開発されてきたこのシステムを作成すると、多くの落とし穴が現れました。 このトピックが評判の良いコミュニティに歓迎されている場合は、このトピックについてさらに詳しく説明します。