web-dev-qa-db-ja.com

ウェブサイトのデータを解析して使用する「スマートな」方法は?

ページの検索結果から返されたデータをインテリジェントに解析するにはどうすればよいですか?

たとえば、多くの本のプロバイダーのWebサイトの検索結果を解析して、オンラインの本を検索するWebサービスを作成するとします。ページの生のHTMLデータを取得し、データをWebサービスで機能させるためにいくつかの正規表現を実行できましたが、いずれかのWebサイトがページのフォーマットを変更すると、コードが壊れます!

RSSは確かにすばらしいオプションですが、多くのサイトにはXML/JSONベースの検索がありません。

ページ上の情報を自動的に広めるのに役立つキットはありますか?クレイジーなアイデアは、あいまいなAIモジュールに検索結果ページのパターンを認識させ、それに応じて結果を解析することです...

31
bluebit

私は最近、これのいくつかを行いました、そしてここに私の経験があります。

3つの基本的なアプローチがあります。

  1. 正規表現。
    • 最も柔軟で、緩やかに構造化された情報と変化する形式で最も簡単に使用できます。
    • 構造/タグ分析を行うのは困難ですが、テキストマッチングを行う方が簡単です。
    • データ形式の組み込み検証。
    • ドキュメントの抽出/変換に使用するパターンごとに正規表現を記述する必要があるため、他のものよりも維持が困難
    • 通常、2および3よりも低速です。
    • 同様にフォーマットされたアイテムのリストに適しています
    • 優れた正規表現開発/テストツールといくつかのサンプルページが役立ちます。ここにRegexBuddyについて言う良いことがある。彼らのデモを試してください。
    • 私はこれで最も成功しました。柔軟性があるため、厄介で残忍な、実際のHTMLコードを操作できます。
  2. HTMLをXHTMLに変換し、XML抽出ツールを使用します。HTMLをクリーンアップし、正当なXHTMLに変換し、XPath/XQuery/X-whateverを使用してクエリしますXMLデータとして。
    • ツール:TagSoup、HTMLTidyなど
    • HTMLからXHMLへの変換の品質は非常に重要で、非常に変動します。
    • 必要なデータがHTMLレイアウトとタグ(HTMLテーブル、リスト、DIV/SPANグループなどのデータ)で構成されている場合の最適なソリューション
    • リンク構造、ネストされたテーブル、画像、リストなどの取得に最適
    • オプション1よりも高速で、オプション3よりも低速である必要があります。
    • コンテンツのフォーマットが変化する/変化する場合はうまく機能しますが、ドキュメントの構造/レイアウトは変化しません。
    • データがHTMLタグで構成されていない場合は、問題が発生しています。
    • オプション1で使用できます。
  3. パーサージェネレーター(ANTLRなど)-ページを解析および分析するための文法を作成します。
    • 私の(乱雑な)ページには適さなかったので、私はこれを試していません
    • HTML構造が高度に構造化され、非常に一定で、規則的で、変更されない場合に最適です。
    • ドキュメントに説明しやすいパターンがあり、HTMLタグが含まれておらず、再帰または複雑な動作が含まれる場合に使用します。
    • XHTML入力は不要
    • 一般的に最速のスループット
    • 学習曲線は大きいが、維持が容易

オプション2で webハーベスト をいじってみましたが、構文がおかしな感じがします。 XMLといくつかの疑似Javaスクリプト言語の組み合わせ。 Javaが好きで、XMLスタイルのデータ抽出(XPath、XQuery)が好きなら、それがチケットになるかもしれません。


編集:正規表現を使用する場合は、遅延数量詞とキャプチャグループを含むライブラリを使用してください。 PHPの古い正規表現ライブラリにはこれらがなく、HTMLの開始/終了タグ間でデータを一致させるために不可欠です。

24
BobMcGee

解析するfixed HTML構造がないと、データを検索するための正規表現を維持するのが嫌になります。ツリーを構築する適切なパーサーを使用してHTMLを解析する方が幸運かもしれません。次に、より保守しやすい要素を選択します。

明らかに、最良の方法は、解析および検証できる固定マークアップ付きのエンジンからのXML出力です。生成されたツリーを「暗闇で」調査するHTML解析ライブラリは、正規表現よりも保守が簡単だと思います。

このように、<a href="blah" class="cache_link">...<a href="blah" class="cache_result">...に変わったかどうかを確認する必要があります。

結論として、特定の要素を正規表現でgrepするのは厳しいでしょう。より良いアプローチは、ページのモデルのようなDOMを構築し、タグ内の文字データへの「アンカー」を探すことです。

またはメールを送信 XML APIのケースを記載したサイトに...雇われるかもしれません!

3
Aiden Bell

あなたはあなたが使用している言語を言っていません。 Java土地では、 TagSoup とXPathを使用して、痛みを最小限に抑えることができます。 このブログ の例があります(もちろん、XPathは必要に応じて、さらに複雑になります):

URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);

XPath式を外部化することをお勧めします。これにより、サイトが変更された場合にある程度の保護が得られます。

これは、このサイトのスクリーンスクレイピングに使用していないXPathの例です。まさか、私じゃない:

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3"
3
Rich Seller

使用しているテクノロジースタックについては言及していません。 HTMLを解析している場合は、解析ライブラリを使用します。

あなたが言っていることを正確に実行するウェブサービスもあります-商用で無料です。彼らはサイトをこすり取り、ウェブサービスインターフェースを提供します。

また、スクリーンスクレイピングを提供する一般的なWebサービスはYahoo Pipesです。 その前のスタックオーバーフローの質問

2
Jon Galloway

それは絶対確実ではありませんが、 Beautiful Soup などのパーサーを確認することをお勧めします。レイアウトが変更されても魔法のように同じ情報を見つけることはできませんが、複雑な正規表現を記述するよりもはるかに簡単です。これはpythonモジュールです。

2
Jared

HTML操作ライブラリの使用を検討しましたか? Rubyには、かなりいいものがあります。例 hpricot

適切なライブラリを使用すると、CSSセレクターまたはxpathを使用して、ページの必要な部分を指定できます。これらは、正規表現を使用するよりもかなり強力です。

Hpricot wikiの例:

 doc = Hpricot(open("qwantz.html"))
 (doc/'div img[@src^="http://www.qwantz.com/comics/"]')
   #=> Elements[...]

.NETやPythonなどで同様のことを行うライブラリを見つけることができると思います。

1
BaroqueBobcat

残念ながら、あなたがウェブサイトからHTMLを解析しようと試みたように、「スクレイピング」が最も一般的なソリューションです。ページの構造的な変更を検出して、修正するように警告のフラグを立てることができます。そのため、最後に変更を加えても、データが失われることはありません。セマンティックWebが現実になるまでは、それが大規模なデータセットを保証する唯一の方法です。

または、APIによって提供される小さなデータセットを使用することもできます。 YahooはAPI(YDNを参照)を介して検索可能なデータを提供するために一生懸命取り組んでいます。AmazonAPIはたくさんの本のデータなどを開くと思います.

少しお役に立てば幸いです。

編集:そしてPHPを使用している場合、私はSimpleHTMLDOMをお勧めします

1
Al.

画面のスクレイピングと希望する言語をグーグルで試します。私はpythonのいくつかのオプションを知っています、あなたの好みの言語に相当するものを見つけるかもしれません:

  • 美しいスープ
  • mechanize:Perl WWW:Mechanizeに似ています。ブラウザのようなオブジェクトでWebページを操作できます
  • lxml:python libwwwへのバインディング
  • scrapemark:テンプレートを使用してページの一部をこする
  • pyquery:xml/xhtmlドキュメントでjQueryクエリを作成できます
  • scrapy:Webページをクロールして解析するスパイダーを作成するための高レベルのスクレイピングおよびWebクロールフレームワーク

スクレイピングするWebサイトによっては、上記の方法を1つ以上使用する必要がある場合があります。

1
filippo

他の人が言ったように、DOM表現を構築するHTMLパーサーを使用して、XPath/XQueryでそれを照会できます。私はここで非常に興味深い記事を見つけました:Java理論と実践:XQueryによる画面スクレイピング- http://www.ibm.com/developerworks/xml/library/j- jtp03225.html

0
cdarwin

Tag Soup のようなものを使用できる場合、それが出発点になります。次に、ページをXML APIのように扱うことができます。

JavaとC++実装があり、うまくいくかもしれません!

0
Nick Veys

http://www.parselets.com のパセリはかなり滑らかに見えます。

JSONを使用して「parslets」を定義し、ページ上で何を探すかを定義し、そのデータを解析します。

0
Alex Black