评估Ruby上的javascript

我尝试获取网页的代码html,但网页包含一些生成我需要的数据的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 

但这只返回html而不评估javascript。 我想在评估页面的javascript后获得最终的html。

做出的假设:您的Javascript位于网页上的单个标记中。 否则你将不得不通过寻找你想要的每一个j来解析。 你想要的gem被称为“therubyracer”,它将谷歌的v8 javascript执行引擎嵌入到你的ruby中。

转到您的命令行并安装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('')..-1] cxt = V8::Context.new result = cxt.eval(js) puts result 

使用JavaScript进行抓取很难。 基本上,如果您想要可靠地完成它,您需要能够完全模拟浏览器。

幸运的是,那里有gem可以做到这一点。 您可以将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 。