5

Webページのコードhtmlを取得しようとしましたが、Webには、必要なデータを生成するjavascriptコードが含まれています。

http = Net::HTTP.new('localhost')
path = '/files.php'

# POST request -> logging in
data = ''
headers = {
   'Referer' =>  'http://localhost:8080/files.php',
   'User-Agent' => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0',
   'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language' => 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
   'Content-Encoding' => 'gzip, deflate',
   'Connection' => 'keep-alive',
   'Cookie' => ''
}

resp, data = http.post(path, data, headers)

puts resp.body

ただし、これはjavascriptを評価せずにhtmlを返すだけです。ページのJavaScriptを評価した後、最終的なhtmlを取得したいと思います。

4

2 に答える 2

1

JavaScriptを有効にしてスクレイピングを行うのは難しいです。基本的に、確実に実行するには、ブラウザを完全にエミュレートできる必要があります。

幸いなことに、まさにそれを行う宝石があります。Capybaraは、SeleniumのようなJavaScript対応のドライバーで使用できます。例(このブログ投稿から採用):

require "capybara"
require "capybara/dsl"

Capybara.run_server = false
Capybara.current_driver = :selenium
Capybara.app_host = "http://www.google.com/"

class Scraper
  include Capybara::DSL

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

Seleniumがお好みでない場合は、代替のJavaScriptドライバーがあります(独自の「ヘッドレス」ブラウザーを実装するのではなく、Firefoxなどのブラウザーを文字通り自動化します)。ヘッドレスブラウザドライバについては、たとえば、capybara-webkitまたはpoltergeistを参照してください。

于 2013-01-06T20:51:31.717 に答える
0

前提条件:Javascriptはページ上の単一のタグに存在します。それ以外の場合は、必要なjsの各ビットを探して解析する必要があります。あなたが望む宝石は「therubyracer」と呼ばれ、それはあなたのルビーにグーグルのv8javascript実行エンジンを埋め込みます。

コマンドラインに移動し、次のコマンドでtherubyracerをインストールします

 gem install therubyracer

それから:

 require 'v8'

 data = ''
 headers = {
    'Referer' =>  'http://localhost:8080/files.php',
    'User-Agent' => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0',
    'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language' => 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
    'Content-Encoding' => 'gzip, deflate',
    'Connection' => 'keep-alive',
    'Cookie' => ''
 }

 resp, data = http.post(path, data, headers)

 js = resp[resp.index('<script')..resp.index('</script>')]
 js = js[js.index('/>')..-1]

 cxt = V8::Context.new
 result = cxt.eval(js)
 puts result
于 2013-01-06T20:33:37.607 に答える