1

いくつかの Web サイトをクロールしてデータをスクレイピングするアプリケーションを作成しています。これを行うために、Ruby、Curl、および Nokogiri を使用しています。ほとんどの場合、これは簡単で、URL に対して ping を実行して HTML データを解析するだけで済みます。セットアップは完全に正常に機能します。

ただし、一部のシナリオでは、Web サイトは一部のラジオ ボタンへのユーザー入力に基づいてデータを取得します。これにより、サーバーからさらにデータを取得する JavaScript が呼び出されます。生成される URL と投稿されるデータは、JavaScript コードによって決定されます。

使用することは可能ですか:

  1. HTMLページでJavaScriptを実行するかどうかを判断できるJavaScriptライブラリとこの設定はありますか?

  2. 別のライブラリを使用する以外に、HTML ライブラリと JS ライブラリが通信するための統合または方法はありますか? たとえば、ボタンがクリックされた場合、Nokogiri は JavaScript を呼び出す必要があり、JavaScript は Nokogiri を更新する必要があります。

私のアプローチが最善ではないように思われる場合は、Ruby を使用して Web 上にクローラー + スクレーパーを構築することをお勧めします。

編集: コードに V8 エンジンが組み込まれているため、therubyrace を使用してポイント 1 が可能であるように見えますが、2 に代わるものはありますか?

4

2 に答える 2

7

実際のブラウザを実行し、Webページで考えられるすべてのアクションを実行できるWatirを探しています。Seleniumと呼ばれる同様のプロジェクトがあります。

Linuxマシンのいわゆる「ヘッドレス」ブラウザでWatirを使用することもできます。

ワティルヘッドレスの例

このHTMLがあるとします。

<p id="hello">Hello from HTML</p>

そしてこのJavascript:

document.getElementById('hello').innerHTML = 'Hello from JavaScript';

(デモ: http: //jsbin.com/ivihur

動的に挿入されたテキストを取得したかったのです。まず、たとえばUbuntuにインストールされxvfbたLinuxボックスが必要です。firefox

$ apt-get install xvfb firefox

watir-webdriverとgemも必要になるheadlessので、先に進んでそれらもインストールしてください。

$ gem install watir-webdriver headless

次に、次のようなページから動的コンテンツを読み取ることができます。

require 'rubygems'
require 'watir-webdriver'
require 'headless'

headless = Headless.new
headless.start
browser = Watir::Browser.new

browser.goto 'http://jsbin.com/ivihur' # our example
el = browser.element :css => '#hello'
puts el.text

browser.close
headless.destroy

すべてがうまくいった場合、これは次のように出力されます。

Hello from JavaScript

これもバックグラウンドでブラウザを実行していることは知っていますが、私が思いついた問題に対する最も簡単な解決策です。ブラウザの起動にはかなり時間がかかりますが、その後のリクエストは非常に高速です。(goto上記の動的テキストを複数回実行してフェッチするのに、Rackspace Cloud Serverでのリクエストごとに約0.5秒かかりました)。

出典:http ://watirwebdriver.com/headless/

于 2012-07-15T19:44:06.223 に答える
0

カピバラ + PhantomJS

私のお気に入りの Ruby 制御のヘッドレス ブラウザはPhantomJSです。PhantomJS は、ヘッドレス WebKit ベースのブラウザーです。カピバラのドライバーであるポルターガイストが含まれています。

要約すると、スタックは次のようになります。

Capybara -> Poltergeist -> PhantomJS -> WebKit

PhantomJS は selenium-webdriver で直接使用できますが、Capybara API の方が優れていることに注意してください (IMHO)。

PhantomJS は最小限の WebKit 実装であるため、Chrome や IE などの完全なブラウザーよりも起動時間が高速です。

Google の結果リンクをスクレイピングするサンプル コード:

module Test
  class Google
    include Capybara::DSL

    def get_results
      visit('/')
      fill_in "q", :with => "Capybara"
      click_button "Google Search"
      all(:xpath, "//li[@class='g']/h3/a").each { |a| puts a[:href] }

    end
  end
end

scraper = Test::Google.new
scraper.get_results

Capybara の標準機能に加えて、Poltergeist は非常に便利なことを実行できます。

  • とを使用して独自の JavaScript を挿入して実行page.evaluate_scriptするpage.execute_script
  • page.within_framepage.within_window
  • page.status_codepage.response_headers
  • page.save_screenshot<- これは、うまくいかないときにとても便利です!
  • page.driver.render_base64(format, options)
  • page.driver.scroll_to(left, top)
  • page.driver.basic_authorize(user, password)
  • element.native.send_keys(*keys)
  • クッキーの取り扱い
  • ドラッグアンドドロップ

これらの機能は、Poltergeist GitHub ページ ( https://github.com/teampoltergeist/poltergeist ) にリストされています。

セレリティ

可能な限り多くのパフォーマンスを実現したいのであれば、JRuby に切り替えることも厭わないのであれば、Celerityが超高速であることがわかりました。

Celerity は、Java の HTMLUnit のラッパーです。HTMLUnit は完全なブラウザではなく、JavaScript を実行するエミュレータであるため、高速です。欠点は、完全なブラウザーがサポートするすべての JavaScript をサポートしていないことです。そのため、JS を多用するサイトはサポートされませんが、ほとんどのサイトでは十分であり、常に改善されています。

もう 1 つの利点は、JRuby のマルチスレッドの性質です。Peach (parallel each) gemを使用すると、多くのブラウザーを並行して起動できます。過去にテストスイートでこれを行ったことがあり、完了するまでの時間を大幅に短縮しました。実際、Celerity + Peach を使用して、通常の JMeter、Grinder、apachebench などよりもはるかに洗練されたロード テスターを作成しました。

于 2014-04-14T21:27:49.710 に答える