厳密に言えば、コレクターとクローラーは同じものではありません。コレクターは特定の構造でデータ ソースを解析して構造化し、必要なデータを抽出します。一方、クローラーの主な目的はページ内のリンクと、ページのタイトル。
コレクターについてたくさん書いてきたので、自分へのメモとしていくつかの経験を書き留めておきます。
最初は最も単純な、静的ページ コレクターです。つまり、収集データのソースページは静的であり、収集者が関心のあるデータの少なくとも一部は静的であり、対象データを含むすべてのページコードはページURLに直接アクセスすることで取得できます。この種類のコレクターは、最も一般的に使用され、最も基本的なものです。すでに成熟した商用コレクター製品がたくさんありますが、私にとっては使用するのが少し複雑すぎるように感じます。私が独自のコレクターを作成するときに注意する問題のいくつかは、これらの製品には存在しないようです。または、名前が私が提案したものではないため、見つかりません。何度か使ったら、自分で書いたほうが時間が節約できて効率的です。
準備知識: HTTP プロトコルの基本、HTML 言語の基本、正規表現、および正規表現をサポートするプログラミング ツール (.net、java、php、Python、ruby などはすべて使用可能)
最初のステップは、ターゲットページのHTMLをダウンロードすることです。
このステップにはそれほど難しいことはありません。.net には HttpWebRequest や HttpWebResponse などの処理専用のクラスがあり、他の言語にも同様のものがあります。ただし、コレクター用のダウンローダーを作成する場合、パラメーター構成は柔軟である必要があることに注意してください。ユーザー エージェント、Refer、Cookie およびその他のフィールドを構成可能にし、プロキシ サーバーの使用をサポートする必要があります。ターゲットサーバーのアクセス制限ポリシーまたはロボット識別ポリシーを突破します。一般的なアンチボットやアンチ「アンチボット」などの関連技術については、以降の記事で特別に説明します。
ページ コードをローカルにダウンロードした後、解析する必要があります。 2 つの解析方法があります
1. HTML として解析します
HTML に精通している人は、ダウンロードした HTML ページを HTML として直接解析することもできます。これは最も高速で効率的です。 HTML 要素と属性を走査した後、目的のデータ コンテンツを直接見つけ、その要素、要素属性、およびサブ要素にアクセスしてデータを取得します。 .net にはネイティブ HTML 解析ライブラリはありません。それらのほとんどは比較的使いやすく、少なくともページを解析してデータを抽出するには十分です。注意する必要があるのは、ページ コードが不完全にダウンロードされているか、ターゲット ページ構造にエラーがある状況を考慮する必要があることだけです。
2. 文字列として扱い、正規表現を使用して解析します。
正規表現の利点は、方法 1 が柔軟であるか、実装が難しいことです。対象データのHTML要素のパスが異なる可能性があります)を修正する際に考慮してください)。正規表現を使用する考え方は、対象データとそのコンテキストの特徴や特徴文字列を見つけて、一致するものを抽出するための正規表現を記述することです。
以下では、静的コレクターの動作の基本原理を紹介する例として、bing の検索結果ページの解析を使用します。
1つ目はページの取得です。 2 回クリックするだけで、ページ パラメータのルールを確認できます。例:
http://cn.bing.com/search?q=MOLLE+II&first=31
この URL は、「MOLLE」と「II」の 2 つのキーワードを使用した検索を表します。 現在のページは 4 ページ目です。 FIRST パラメータは、このページに表示される最初の検索結果のインデックス番号を指し、4 ページ目には 31 ~ 40 の検索結果が表示されます。
これは、GET メソッドを使用してパラメータを渡すことであり、ほとんどの場合これが当てはまります。ターゲット ページが POST を使用してパラメータを渡す場合は、ブラウザの開発者モードを使用してパッケージを取得し、パラメータが何であるかを確認します。
次に、ターゲット ページをダウンロードし、正規表現テスターで開きました。
まあ、うまくいきます。数が多すぎる場合は、便利なツールを自分で書いてもいいかもしれません。
私たちの目標は、検索結果からリンク テキストとリンク URL を抽出することです。同じページから解析する必要がある同じ量のデータの 2 つ以上の項目については、2 つの戦略があります。1 つは、これらのデータの異なる特性に基づいて式を直接記述し、ページからターゲット データを抽出する方法です (たとえば、最初に正規表現を使用してページを処理し、すべてのリンク タイトル テキストを取得し、その後、通常の処理ページを使用してすべてのリンク URL を取得します)、またはページ構造を分析して、ターゲット データ項目を含む最小限のページ構造を見つけます (たとえば、 HTML table) 要素のテーブル行
ブラウザの検査ツール (以前は Chrome では View Element と呼ばれていましたが、新しいバージョンは Inspection と呼ばれており、私はそれを探すのに長い時間を費やしました) を使用してページ コードを分析すると、次のことがわかります。すべての検索コンテンツは、「b_results」の
HTML の解析に使用される正規表現では、特定のプレフィックスとサフィックスの付いた文字列を持つファイルを抽出するために、ゼロ幅アサーションと逆引き (検索) がよく使用されます。正規表現に関する技術ブログにはすでに多くの関連記事があるため、ここでは詳しく説明しません。
ただし、.net 正規表現ライブラリの場合、注意が必要なスイッチがいくつかあることに注意してください。 HTML を解析する場合、エンジンが文字列内のすべての復帰をデータ行の終わりではなく通常の文字として扱うように、SingleLine パラメーターを選択することが必要になることがよくあります。ただし、これは絶対的なものではなく、実情に応じて柔軟に設定する必要もあります。
ちょっとしたコツもあります。モバイル端末が普及している現在、一部の Web サイトでは、顧客のトラフィックを節約するために、ユーザーのブラウザー リクエストの USER-AGENT に基づいて、モバイル バージョンのページが提供されます。通常、ページは PC バージョンよりもきれいになり、ページのノイズも少なくなります。
引き続きページ分析に戻ります。実際、ターゲット データの最小構造の特徴がページ内で一意であることがわかりました。
この方法で、ターゲット データを含むすべての
次に、各要素を解析します。すべての li タグのフォーマット構造は同じであるため、同じ一連の通常の解析を使用できます。
私たちの目的は、端的に言えば、href 属性と タグの内容です。
式を直接記述するだけです:
次に、同じ式を使用して各 li タグの内容を処理すれば問題ありません。
コレクターの基本原理が紹介されました。私が作成した通常のツールは私のブログにあります。バグや機能の提案を歓迎します。
次の記事では動的ページデータ取得について紹介します。