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


11

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

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

私はそれに注意する必要があります:

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

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

副次的な質問として、WebページがAjax呼び出しによって構築された場合、どのように対処しますか?

編集:

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


8
スクレイピングの実装方法に関係なく、安定した方法はありません。Webページを簡単に変更するだけで簡単に壊れてしまいます。データを取得する安定した方法は、データの作者と連絡を取り、適切な形式でデータを取得するための取引を仲介することです。時にはそれはお金さえかからない。
ヨアヒムザウアー

1
@JoachimSauer-「最良の」方法で質問に答えることができます。
匿名

ほとんどのWebサイトは動的であり、データをデータベースに保存するため、最良の方法はWebサイトからデータベースを取得することです。WebサイトにAPIがある場合は、それを使用できます。静的ページをスクレイピングする場合は、組み込みのPython urllibおよびHTMLParserモジュールが適切に機能します。HTMLをスクレイピングするためのいくつかのパッケージもPyPiで入手できます。
超人

サイトのスクレイピングは巧妙なビジネスです。サイトの所有者はあなたにそれを望まないので、これを行うための安定した方法は本当にありません。
スティーブンエバーズ

1
WebkitなどのWebブラウザーを埋め込み、DOMスクリプトを使用してレンダリングされたページから情報を取得することはできますか?ほとんどすべてのプラットフォームでこれを実行できますが、Qtで行う方法は次のとおりです。doc.qt.nokia.com
snapshot

回答:


2

さて、ここに私の2セントがあります:

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

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


おかげで、確かにXPathをもう少し見ていきます。私はそれを扱うことに慣れていないので、学ぶのは良いことです。+1 :)
マイク

5

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

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

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

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


「HTTPネットワークコード」とは、リクエストが行われたときにサーバーの応答をキャプチャすることを意味しますか?提案をありがとう、私はそれらを必ず見ていきます。+1
マイク

丁度。.NETでは、System.Net.WebClientまたはRestSharpなどのライブラリを使用できます。restsharp.org。Mono for Droidでも使用しました。
gsscoder

4

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

これは、HTMLを解析するすべての主要言語用のライブラリです(たとえば、この1つ)

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


おかげで、仕事を終わらせるためにBeautiful Soupを使ってきました。私はそれが安定しないことを知っています、おそらく質問でそれを明確にする必要があります。あなたのための+1 :)
マイク

4

副次的な質問として、WebページがAjax呼び出しによって構築された場合、どのように対処しますか?

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

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

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


2
多くのサービスを確保するためにHTTPヘッダを検査していることは注目に値するHTTP_X_REQUESTED_WITHですXMLHttpRequest。良いものは、POSTリクエストに対して何らかの種類のXSRF保護も実装するため、マジックCookieも必要になります。一部のパブリックAPIによって意図的に公開されていないAJAXエンドポイントをくすぐるのはちょっと気が引けますし、出力(または要求ポリシー)が変更された場合、スクレーパーは破損する傾向があります。
ティムポスト

@TimPostは100%正しいです。私は確かにその「不快」に同意:)が、任意のパブリックAPIが存在しない場合に..必須の必要
Darknight

私はこれを自分のAJAXを使用したアプリケーションで使用できました(そして「自分」で書いたわけではありませんが、セットアップは私のものです)別のサーバーのシステムを試してバイパスするのは正しいとは思わないので、@に同意する必要がありますTimPost、それは一種の「むかつく」感じがします。しかし、それは良いアイデアです、ありがとう!+1!
マイク

1

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


HTMLページはコンピューターによって解析されることは想定されていませんでしたが、他のオプションがない場合もあります。また、私は個人的なプロジェクトのために公開されている情報を使用していますが、それは決して商業的ではありません。明示的な許可は必要ないと思いますか?ご意見ありがとうございます!あなたのためにも+1;)
マイク

@MikeHeremans Webサイトから情報を取得する権限があるかどうかを知るには、ToSとrobots.txtを読んでください。両方があなたに情報を自動的にこすり落とす権利を否定しないなら、あなたはたぶん合法的に大丈夫でしょう。もちろん、IANAL ...
K.Steff

:あなたは、言及したプロジェクトのコードを参照したい場合はcode.google.com/p/acao-toolkit/source/browse/...を。content_script.jsを確認してください。ページに挿入されるコードです。
ノーロス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.