完全加载任何页面而不在浏览器上呈现

时间:2014-04-06 03:09:17

标签: javascript ruby-on-rails ruby dom

我需要完全呈现页面,而不是在浏览器中实际加载页面并将内容读取为字符串。像所有dom操作由js完成之后的实际最终页面文本一样。你们能建议我解决这个或我可以使用的任何其他工具吗?

我在rails框架上使用ruby。

2 个答案:

答案 0 :(得分:0)

以下是我能想到的几种方法:

  • 在RoR中使用MSHTML COM对象
    • 如果你在Windows机器上并且你的RoR安装可以调用COM / ActiveX对象,你可以实例化一个MSHTML对象,渲染页面并获取内容
  • 编写NodeJS服务器
    • 您可以使用NodeJS在内存中呈现页面,并将内容作为Web服务提供给您的RoR实例
  • 编写Node-Webkit服务器
    • 与上述相同的想法,但您可以直接访问WebKit渲染引擎

所有这些都可以工作,但是每次调用其中一个进程时,您都希望至少添加一秒的加载时间。此外,您实际上正在制作一个迷你版的网络浏览器,它可能会造成内存损失,并可能影响服务器的长期稳定性。

答案 1 :(得分:0)

1)安装PhantomJS,以便通过操作系统上的命令行提供

2)

# config/application.rb
module YourApp
  class Application < Rails::Application
    config.after_initialize do
      require Rails.root.join('lib/page_to_s.rb')
    end
  end
end


# lib/page_to_s.rb
require 'tempfile' # see: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html
module PageToS
  extend self
  def get(url)
    file = ::Tempfile.new('page_to_s.js')
    begin
      # http://techslides.com/grabbing-html-source-code-with-phantomjs-or-casperjs/
      file.write("var page = require('webpage').create();page.open('#{url}', function (status) {var js = page.evaluate(function () {return document;});console.log(js.all[0].outerHTML); phantom.exit();});")
      file.close
      `phantomjs #{file.path}`
    ensure
      file.unlink
    end
  end
end

# anywhere
str = PageToS.get('http://localhost:3000/any_page')

example usage