“スマート”ウェブサイトのデータを解析して使用する方法は?
-
11-07-2019 - |
質問
ページ上の検索結果から返されたデータをどのようにインテリジェントに解析しますか?
たとえば、多くの本提供者のウェブサイトの検索結果を解析することにより、オンラインの本を検索するウェブサービスを作成したいとしましょう。ページの生のHTMLデータを取得し、Webサービスでデータが機能するように正規表現を実行できましたが、Webサイトのいずれかがページのフォーマットを変更すると、コードが壊れます!
RSSは確かに素晴らしいオプションですが、多くのサイトにはXML / JSONベースの検索がありません。
ページ上の情報を自動的に広めるのに役立つキットはありますか?クレイジーなアイデアは、ファジーAIモジュールに検索結果ページのパターンを認識させ、それに応じて結果を解析することです...
解決
最近この作業をいくつか行いましたが、これが私の経験です。
3つの基本的なアプローチがあります:
- 正規表現。
- 大まかに構造化された情報と変化する形式で最も柔軟で使いやすい。
- 構造/タグ分析を行うのは難しいが、テキストマッチングを行うのは簡単です。
- データ形式の検証に組み込まれています。
- ドキュメントの抽出/変換に使用するパターンごとに正規表現を作成する必要があるため、他のものよりも維持するのが難しい
- 一般に2および3よりも遅い
- 同様の形式のアイテムのリストに適しています
- 優れた正規表現の開発/テストツールといくつかのサンプルページが役立ちます。ここでRegexBuddyについて良いことを言うことができます。デモをお試しください。
- これで最も成功しました。この柔軟性により、厄介で野bruな野性的なHTMLコードを扱うことができます。
- HTMLをXHTMLに変換し、XML抽出ツールを使用します。 HTMLをクリーンアップし、正当なXHTMLに変換し、XPath / XQuery / X-whateverを使用してXMLデータとしてクエリします。
- ツール:TagSoup、HTMLTidyなど
- HTMLからXHMLへの変換の品質は非常に重要であり、非常に可変的です。
- 必要なデータがHTMLレイアウトとタグ(HTMLテーブル、リスト、DIV / SPANグループなどのデータ)で構成されている場合の最適なソリューション
- リンク構造、ネストされたテーブル、画像、リストなどの取得に最適です
- オプション1よりも高速ですが、オプション3よりも低速です
- コンテンツの書式設定が変更された場合/変数であるが、ドキュメントの構造/レイアウトが変更されない場合はうまく機能します。
- データがHTMLタグで構成されていない場合、問題が発生しています。
- オプション1で使用できます。
- パーサージェネレーター(ANTLRなど)-解析用の文法を作成&ページの分析。
- (乱雑な)ページに適していないため、これを試していません
- HTML構造が高度に構造化され、非常に一定で、規則的で、変化しない場合に最適です。
- 文書に記述しやすいパターンがあるが、HTMLタグを含まず、再帰または複雑な動作を含む場合に使用します
- XHTML入力は必要ありません
- 最速のスループット、一般的に
- 学習曲線は大きいが、保守は簡単
オプション2のウェブ収集をいじくりましたが、構文は奇妙になります。 XMLといくつかの擬似Javaスクリプト言語の混合。 Javaが好きで、XMLスタイルのデータ抽出(XPath、XQuery)が好きなら、それはあなたのためのチケットかもしれません。
編集:正規表現を使用する場合は、怠zyな数量詞とキャプチャグループを持つライブラリを使用してください! PHPの古い正規表現ライブラリにはこれらがなく、HTMLの開始/終了タグ間でデータを一致させるために不可欠です。
他のヒント
解析する fixed HTML構造がなければ、データを見つけるための正規表現を維持するのは嫌です。ツリーを構築する適切なパーサーを介してHTMLを解析する運がもっとあるかもしれません。次に、よりメンテナンスしやすい要素を選択します。
明らかに、最良の方法は、解析と検証が可能な固定のマークアップを使用したエンジンからのXML出力です。生成されたツリーを「暗闇で」調査するHTML解析ライブラリは、正規表現よりも保守が簡単だと思います。
この方法では、< a href =" blah"を確認するだけです。 class =" cache_link"> ...
が< a href =" blah"に変わりますclass =" cache_result"> ...
または何でも。
下の行では、特定の要素を正規表現でgrepするのは困難です。より良いアプローチは、ページのモデルのようなDOMを構築し、タグ内の文字データへの「アンカー」を探すことです。
またはメールをサイトに送信して、XML APIの事例を記載してください...雇用される可能性があります!
使用している言語を言わない。 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"
使用しているテクノロジースタックについては言及していません。 HTMLを解析する場合、解析ライブラリを使用します:
- 美しいスープ(Python)
- HTML Agility Pack(.NET)
あなたが言っていることを正確に行うウェブサービスもあります-商用で無料です。サイトをスクレイプし、Webサービスインターフェイスを提供します。
画面スクレイピングを提供する一般的なWebサービスはYahoo Pipesです。 以前のstackoverflowの質問
残念ながら「スクレイピング」は、ウェブサイトからHTMLを解析しようと言ったように、最も一般的なソリューションです。ページの構造的な変更を検出し、修正するためにアラートにフラグを立てることができます。そのため、変更が最後に行われても、データが破損することはありません。セマンティックWebが現実になるまで、それが大規模なデータセットを保証する唯一の方法です。
代わりに、APIが提供する小さなデータセットに固執することもできます。 YahooはAPI(YDNを参照)を介して検索可能なデータを提供するために非常に懸命に取り組んでいます。AmazonAPIは多くの書籍データなどを開くと思います。
少し助けてください!
編集:PHPを使用している場合は、SimpleHTMLDOMをお勧めします
html操作ライブラリの使用を検討しましたか? Rubyにはかなりいいものがあります。例: hpricot
優れたライブラリを使用すると、CSSセレクターまたはxpathを使用して、ページの必要な部分を指定できます。これらは正規表現を使用するよりもはるかに堅牢です。
hpricot wikiの例:
doc = Hpricot(open("qwantz.html"))
(doc/'div img[@src^="http://www.qwantz.com/comics/"]')
#=> Elements[...]
.NETやPythonなどで同様のことを行うライブラリを見つけることができると確信しています。
画面のスクレイピングとお好みの言語をグーグルで試してください。 Pythonにはいくつかのオプションがありますが、好みの言語に相当するものが見つかるかもしれません:
- 美しいスープ
- mechanize:perl WWW:Mechanizeに似ています。 Webページを操作するオブジェクトのようなブラウザを提供します
- lxml:libwwwへのPythonバインディング
- scrapemark:テンプレートを使用してページの断片をスクレイピングする
- pyquery:xml / xhtmlドキュメントでjQueryクエリを作成できます
- scrapy:Webページをクロールおよび解析するスパイダーを作成するための高レベルのスクレイピングおよびWebクロールフレームワーク
スクレイプするWebサイトによっては、上記のアプローチの1つ以上を使用する必要がある場合があります。
タグスープのようなものを使用できる場合は、開始する場所。次に、ページをXML APIのように扱うことができます。
JavaとC ++の実装があり、動作する可能性があります!
http://www.parselets.com のパセリは非常に滑らかに見えます。
JSONを使用して「パーズレット」を定義し、ページで何を検索するかを定義し、そのデータを解析します。
他の人が言ったように、DOM表現を構築し、XPath / XQueryでクエリするHTMLパーサーを使用できます。ここで非常に興味深い記事を見つけました:Javaの理論と実践:XQueryによるスクリーンスクレイピング- http://www.ibm.com/developerworks/xml/library/j-jtp03225.html
まあ、推奨されるように、タグスープメソッドを使用します。
フォローアップの質問として-これらの大きなスクレーパー型サイトは一体どうするのでしょうか?私は、数千のサイトをスキャンする求人検索エンジン(edeedly.comなど)を見てきました!何千もの正規表現ですか?不可能に近い...