web-dev-qa-db-ja.com

Rubyベースの優れたWebクローラーは何ですか?

私は自分で書くことを考えていますが、Rubyで書かれた優れたWebクローラーがそこにあるかどうか疑問に思っています。

本格的なWebクローラーがなければ、Webクローラーの構築に役立つ可能性のある宝石があれば便利です。質問のこの部分がいくつかの場所で触れられていることは知っていますが、Webクローラーの構築に適用できるgemのリストも素晴らしいリソースになります。

21

Webページをクロールしてコンテンツを抽出するためのRubyDSLであるwombatを構築しています。 githubでチェックしてください https://github.com/felipecsl/wombat

それはまだ初期段階ですが、基本的な機能ですでに機能しています。より多くのものが本当にすぐに追加されます。

19
Felipe Lima

私は自分の仕事のためにスパイダー、ページスクレーパー、サイトアナライザーを作成していましたが、それでも定期的に作成して、かゆみを掻き立てていました。

Rubyには、簡単にするための優れた宝石がいくつかあります。

  • Nokogiri は、HTMLパーサーの私の一番の選択です。以前はHpricotを使用していましたが、炎上して爆発する場所がいくつか見つかりました。その後、のこぎりに乗り換えて、とても満足しています。 HTML、RDF/RSS/Atom、XMLの解析に定期的に使用しています。 Ox も面白そうなので、別の候補かもしれませんが、Oxから返されるものなど、大きなハッシュを調べるよりもDOMの検索の方がはるかに簡単です。
  • OpenURI は単純なHTTPクライアントとしては優れていますが、より複雑なことをしたい場合や、複数のリクエストを同時に実行する必要がある場合に邪魔になる可能性があります。中程度から重い仕事については、 HTTPClient または Typhoeus with Hydra を参照することをお勧めします。 Curb はcURLライブラリを使用しているので良いですが、インターフェイスは私にはそれほど直感的ではありません。しかし、一見の価値があります。 HTTPclient も一見の価値がありますが、私は前述のものに傾倒しています。

    注:OpenURIには、疑いを持たないプログラマーに影響を与える可能性のあるいくつかの欠陥と脆弱性があるため、やや不利になっています。 RestClient は非常に価値のある後継者です。

  • バッキングデータベースと、それと通信するための何らかの方法が必要になります。これはRails自体のタスクではありませんが、Railsから切り離されたActiveRecordを使用してできますデータベースに追加しました。これを数回実行しましたが、問題なく動作します。代わりに、ORMの Sequel が本当に好きです。データベースとの通信方法が非常に柔軟です。クエリをプログラムで構築するSequelの機能を使用し、データベースをモデル化し、移行を使用するためのストレートSQLデータベースを構築したら、Railsを使用して、データのフロントエンドとして機能できます。しかし。
  • 単にページを取得してリンクをたどる以外の方法でサイトをナビゲートする場合は、 機械化 を確認することをお勧めします。フォームへの入力とページの送信が簡単になります。追加のボーナスとして、ページのコンテンツをNokogiri HTMLドキュメントとして取得し、Nokogiriの多数のトリックを使用して解析することができます。
  • URLのマッサージ/マングリングについては、私は本当に好きです Addressable :: URI 。組み込みのURIモジュールよりもフル機能です。 URIが行うことの1つは、文字列をスキャンしてURLを探す RI#extract メソッドがあることです。その文字列がたまたまWebページの本文である場合、リンクを見つける別の方法になりますが、その欠点は、画像、ビデオ、広告などへのリンクも取得されるため、それらをフィルタリングする必要があることです。おそらく、パーサーを使用して<a>タグを排他的に検索する場合よりも多くの作業が発生します。さらに言えば、Mechanizeにはページ内のすべてのリンクを返す links メソッドもありますが、それらをフィルタリングして、フォローするか無視するかを決定する必要があります。 。
  • Javascriptで操作されたページ、またはAJAXからコンテンツを動的に取得するページを処理する必要があると思われる場合は、 [〜#〜] watir [〜#〜] のいずれかを使用することを検討する必要があります。バリアント。 Firewatir、Safariwatir、Operawatirなど、OSごとに異なるブラウザ用のフレーバーがあるため、何が効果的かを理解する必要があります。
  • あなたは[〜#〜] not [〜#〜]は、訪問するURLのリストまたは訪問したURLをメモリに保持することに依存したくありません。データベーススキーマを設計し、その情報をそこに保存します。スキーマを設計する前に時間をかけて、サイトでリンクを収集するときに知りたいことを考えてください。データベースのニーズの大きさに応じて、SQLite3、MySQL、Postgresはすべて優れた選択肢です。私のサイトアナライザーの1つは、Fortune50企業にSEOの変更を推奨するのに役立つようにカスタム設計されました。十分なデータが得られて停止するまで、約20の異なるサイトをカバーする3週間以上実行されました。停電が発生し、そのすべてのデータがビットバケットに入った場合に何が起こったかを想像してみてください。

結局のところ、コードに適切なスパイダリングのエチケットを認識させる必要があります: Webクローラーを作成する際の重要な考慮事項は何ですか?

71
the Tin Man

だからあなたは良いRubyベースの ウェブクローラーが欲しい

スパイダー または アネモネ を試してください。 RubyGemsのダウンロード数によると、どちらも確実に使用されています。

これまでのところ、他の答えはdetailedhelpfulですが、質問にレーザーのように焦点を合わせていません。 Ruby Web用ライブラリクローラーを要求します)この区別は混乱する可能性があるようです: myを参照してください「クロールvs.ウェブスクレイピング?」への回答

5
David J.

ブリキの木こりの包括的な リスト は良いですが、私にとっては部分的に時代遅れです。

私の顧客が扱っているほとんどのWebサイトは、AJAX/Javascriptに大きく依存しています。私もWatir/watir-webdriver/Seleniumを数年使用していますが、そのDOMのものをレンダリングするために、バックエンドに非表示のWebブラウザーをロードする必要があるというオーバーヘッドは、実行可能ではありません。新しいコードの実行でこの目的のためにメモリ内の古いブラウザを再利用できるようにするための使用可能な「ブラウザセッションの再利用」はまだ実装されておらず、最終的にAPIレイヤーを上っていった可能性のあるチケットを撃墜します。 ( https://code.google.com/p/Selenium/issues/detail?id=18 を参照)**

https://rubygems.org/gems/phantomjs

これは、新しいプロジェクトを現在移行しているものであり、目に見えないXvfbメモリやCPUを大量に消費するWebブラウザを使用せずに必要なデータをレンダリングできるようにします。

**代替アプローチもうまくいきませんでした:

1
Marcos

独自に作成したくない場合は、通常のWebクローラーを使用してください。そこには数十があります。

あなたがあなた自身を書きたいのなら、あなた自身を書きなさい。 Webクローラーは、厳密には複雑なアクティビティではなく、次のもので構成されます。

  1. ウェブサイトをダウンロードしています。
  2. そのウェブサイトでURLを見つけ、フィルタリングしましたが、うまくやってください。
  3. そのWebサイトのURLごとに、手順1を繰り返します。

ああ、これは " RubyのWebクローラー "の複製のようです。

0
Arafangion