レストランの住所や特定の場所のさまざまなイベントの日付など、さまざまな Web ページからデータを取得したいと考えています。特定のサイト セットからこのデータを抽出するために使用できる最適なライブラリは何ですか?
13 に答える
.net プログラマー向けの HTML Agility Pack はすばらしいものです。XPath でクエリできる XML ドキュメントで Web ページを変換します。
HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href")
{
HtmlAttribute att = link"href";
att.Value = FixLink(att);
}
doc.Save("file.htm");
ここで見つけることができます。 http://www.codeplex.com/htmlagilitypack
Python を使用している場合は、Beautiful Soup ( http://crummy.com/software/BeautifulSoup )をよく見てください。
非常に有能なライブラリで、スクレイピングが簡単になります。
ここでの一般的な答えは、任意の言語 + http ライブラリ + html/xpath パーサーを使用することだと思います。ruby + hpricot を使用すると、きれいな解決策が得られることがわかりました。
require 'rubygems'
require 'hpricot'
require 'open-uri'
sites = %w(http://www.google.com http://www.stackoverflow.com)
sites.each do |site|
doc = Hpricot(open(site))
# iterate over each div in the document (or use xpath to grab whatever you want)
(doc/"div").each do |div|
# do something with divs here
end
end
Hpricot の詳細については、http: //code.whytheluckystiff.net/hpricot/ を参照してください。
個人的には、この種のタスクにはWWW::Mechanize Perl モジュールが気に入っています。典型的な Web ブラウザをモデルにしたオブジェクトを提供します (つまり、リンクをたどったり、フォームに記入したり、オブジェクトのメソッドを呼び出して「戻るボタン」を使用したりできます)。
実際のコンテンツを抽出するには、それをHTML::TreeBuilderに接続して、現在アクセスしている Web サイトをHTML::Elementオブジェクトのツリーに変換し、必要なデータを抽出します (look_down()
メソッドHTML::Element
は特に使える)。
私はwatirまたはseleniumが最良の選択だと思います。他の言及されたライブラリのほとんどは実際には HTML パーサーであり、それはあなたが望むものではありません... Web サイトの所有者が自分のデータにアクセスすることを望んでいる場合、彼は自分のデータベースまたはサイトのダンプを置きます。トレントを作成し、すべての http リクエストと高価なトラフィックを回避します。
基本的に、HTML を解析する必要がありますが、さらに重要なのはブラウザーを自動化することです。これにより、マウスを動かしてクリックできるようになり、基本的にユーザーを真似ることができます。これを回避するには、スクリーン キャプチャ プログラムを使用してキャプチャを取得し、それらを decaptcha.com に送信する必要があります (数分の 1 セントで解決します)。「表示されるはずの」ブラウザでレンダリングせずにhtmlを解析して、そのキャプチャファイルを保存することを忘れてください。httprequestscraping ではなく、スクリーンスクレイピングです。
watir は、autoitx (マウスを動かしてフィールドにキーを入力するため -> 適切な JavaScript イベントを設定するために必要な場合もあります) とキャプチャ用の単純なスクリーン キャプチャ ユーティリティを組み合わせて、私のためにトリックを行いました。サイトの所有者がテキストの一部をグラフィックに変換したことを確認するために優れた html パーサーを作成しても、まったく役に立ちません。(問題がありますか? いいえ、OCR ライブラリを取得して jpeg をフィードするだけで、テキストが返されます)。その上、中国のサイトではグラフィックスに多くのテキストがありますが、そこまで行くのはめったに見たことがありません。
Xpath は私の 1 日をいつも救ってくれました。Xpath は素晴らしいドメイン固有言語 (IMHO、私が間違っている可能性があります) であり、ページ内の任意のタグにアクセスできますが、微調整が必要になることもあります。
私が見逃したのは「リバーステンプレート」です(セレンのロボットフレームワークにはこれがあります)。Perl の CPAN モジュール Template::Extract にはこれがあり、非常に便利です。
HTML の解析、または DOM の作成はブラウザーに任せます。はい、それほど高速ではありませんが、常に機能します。
また、ユーザーエージェントのふりをするライブラリは役に立たず、サイトは最近のスクレイピングから保護されており、実際の画面でのサイトのレンダリングはキャプチャを超えるために必要になることがよくありますが、情報が表示されるためにトリガーする必要がある JavaScript イベントなどもあります。 .
あなたがRubyに興味があるならWatir、残りはSeleniumだと思います。「ヒューマン エミュレーター」(ロシアでは Web エミュレーター) は、この種のスクレイピング用に作られていますが、その意図を隠していない会社のロシア製品です。
また、最近の 1 週間で Wiley がスクレイピングに関する新しい本を出していると思いますが、これは興味深いものになるはずです。幸運を...
個人的には、http: //github.com/shuber/curl/tree/masterとhttp://simplehtmldom.sourceforge.net/を PHP のスパイダリング/スクレイピング プロジェクトで使用するのに最適だと思います。
Perl WWW::Mechanizeライブラリは、Web サイトと対話して必要な実際のページに到達するというロバ作業を行うのに優れています。
LWP (Perl の場合は Libwww) を使用します。ここに良いガイドがあります: http://www.perl.com/pub/a/2002/08/20/perlandlwp.html
WWW::Scraper のドキュメントは次のとおりです: http://cpan.uwinnipeg.ca/htdocs/Scraper/WWW/Scraper.html これはベースとして役立ちます。おそらく、レストランのマイニングに適合する独自のモジュールを作成したいと思うでしょう。ニーズ。
LWP は、構築するための基本的なクローラーを提供します。
Perl Mechanize を推奨する多くの回答がありましたが、Ruby Mechanize (Perl のバージョンと非常によく似ています) の方が優れていると思います。フォームのようなものを、構文的によりクリーンな方法で処理します。また、Ruby Mechanize の上で動作するフロントエンドがいくつかあり、作業がさらに簡単になります。
誰かが言ったこと。
任意の言語を使用してください。
優れたパーサー ライブラリと http ライブラリがあれば、設定は完了です。
ツリーのものは遅く、優れた解析ライブラリを使用するだけです。
どの言語を使用しますか?
curl with awk だけで十分かもしれません。
tidyを使用して XHTML に変換し、選択した言語で利用可能な XML 処理機能を使用できます。
BeautifulSoupをお勧めします。これは最速ではありませんが、ほとんどのパーサーが詰まる (X)HTML ページの形式が整っていない点に関しては、非常に優れたパフォーマンスを発揮します。