web-dev-qa-db-ja.com

安定した効率的な方法でWebページからデータを取得する

最近、正規表現を使用してWebサイトのHTMLを解析し、必要なデータを取得することは、最善策ではないことを知りました。

だから私の質問は簡単です:では、このデータを取得するための最良/最も効率的で一般的に安定した方法は何ですか?

次のことに注意してください。

  • APIはありません
  • データを取得できる他のソースはありません(データベース、フィードなどはありません)
  • ソースファイルにアクセスできません。 (公開ウェブサイトからのデータ)
  • データがHTMLページのテーブルに表示される通常のテキストであるとしましょう

私は現在、プロジェクトにpython=を使用していますが、言語に依存しないソリューション/ヒントがいいでしょう。

余談ですが、Ajax呼び出しによってWebページが作成された場合、どうするのでしょうか。

編集:

HTML解析の場合、データを取得する実際の安定した方法がないことを知っています。ページが変更されるとすぐに、パーサーが完成します。この場合の安定とは、ページを解析する効率的な方法であり、ページがnotを変更する場合、常に同じ結果(同じデータセットに対して)を常に提供します。

11
Mike

さて、これが私の2セントです。

AJAX=が含まれていない場合、または簡単にクリアできる場合は、HTMLをXHTMLに「修正」して(たとえばHTMLTidyを使用)、正規表現の代わりにXPathを使用して情報を抽出します。
適切に構成されたWebページでは、論理的に分離された情報のエンティティが異なる<div>s、またはその他のタグ。つまり、単純なXPath式で適切な情報を簡単に見つけることができます。これは、たとえばChromeのコンソールやFirefoxの開発者コンソールでテストして、他のコードを1行書く前に機能することを確認できるので、すばらしいことです。
通常、関連情報を選択するための表現はワンライナーであるため、このアプローチは非常に高いS/N比も備えています。また、正規表現よりも読みやすく、そのために設計されています。

AJAXがあり、ページに深刻なJavaScriptが含まれている場合は、ブラウザコンポーネントをアプリケーションに埋め込み、そのDOMを使用して必要なイベントをトリガーし、XPathを使用して情報を抽出します。 Webページは(X)HTMLは正しくないかもしれませんが、すべての主要なブラウザ(実際には、ほとんどのページは最終的にこのようになります)。

2
K.Steff

私の経験では、.NET環境を使用すると、 HTML Agility Pack を利用できます。

ページがXHTMLとしてフォーマットされている場合は、通常のXMLパーサーを使用することもできます。あなたが想像できるあらゆる環境のためにそこから多くのものがあります。

AJAXに関する副次的な質問については、通常のHTTPネットワークコードを使用してデータを取得し、解析することができます。

ここでも、AJAX=スタックがXMLを返す場合、多くの選択肢があります。JSONを返す場合は、ストリームを型付きオブジェクトにマップできるライブラリを検討してください。NETでは、あなた Newtonsoft.Json

5
gsscoder

おそらく正しくないマークアップ(タグスープ)に対処する必要があるため、HTMLの解析は完全に簡単な作業ではありません。何年にもわたって、ブラウザはエラーに対処するために多かれ少なかれ同じ戦略を実装しており、そのアルゴリズムはHTML5仕様で命名されています(そうです、HTML5仕様はHTML5以外のものをどうするかを指定しています)。

これらは、HTMLを解析するためのすべての主要言語用のライブラリです(例 this one )。

いずれにせよ、あなたが得るものはどんな意味でも安定していません。 Webページの形式が変わるたびに、スクレイパーを調整する必要があります。

4
Andrea

余談ですが、Ajax呼び出しによってWebページが作成された場合、どうするのでしょうか。

Ajax呼び出しが行われている場合、おそらくPOSTまたはいくつかの変数を含むGET urlのいずれかです。

JavaScriptを調べて、エンドポイントとパラメーターが何であるかを調べます。その後、返されるデータがjson/xml/plain textまたはおそらく部分的なhtmlである可能性が非常に高くなります。

上記の情報がわかったら、そのエンドポイントにGETまたはPOSTリクエストを送信し、返されたデータを解析します。

4
Darknight

これを行うための安定した、またはより良い方法はありません。HTMLWebページはコンピューターによって操作されるように作成されていません。これは人間のユーザー向けですが、必要な場合はブラウザといくつかのJavaScriptを使用することをお勧めします。私の仕事では、サードパーティのサイトからいくつかの情報を抽出する必要があるプロジェクトに関わっていました。アプリケーションはChrome=拡張機能として開発されました。アプリケーションロジックは、ページの読み込みが完了した後にサイトに挿入されるJavaScriptを使用して記述されます。抽出されたデータは、 httpサーバー。これは最善の方法ではありませんが、機能しますPs:サイトの所有者は、そのようなことを行うことを許可してくれました。

1
nohros