是否有可能堵塞与Ruby和引入nokogiri一个JavaScript引擎?(Is it possi

2019-07-30 10:48发布

我正在写一个应用程序抓取一些网站,并从中抽取数据。 我使用的红宝石,卷曲和引入nokogiri做到这一点。 在大多数情况下,它的简单,我只需要ping一个URL,并解析HTML数据。 安装工作完全正常。

然而,在某些情况下,该网站检索基于某些单选按钮用户输入数据。 这将调用一些JavaScript从服务器获取更多的数据。 所生成的URL和发布数据是由JavaScript代码来确定。

是否有可能使用:

  1. 与此设置里面,就能够确定在HTML网页执行JavaScript我沿着一个JavaScript库?

  2. 除了使用一个不同的库,是有一些整合或为HTML和JS库,以交流的方式? 举例来说,如果一个按钮被按下,引入nokogiri需要调用JavaScript,然后将JavaScript需要更新引入nokogiri。

如果我的做法似乎没有最好的,你会有什么建议是建立一个履带式+刮使用Ruby在网络上。

编辑:看起来像第1点是可以使用therubyrace因为它嵌入在你的代码的V8引擎,但有2个选择吗?

Answer 1:

您正在寻找的Watir运行在真正的浏览器,并允许你执行你能想到的在网页上的每一个动作。 还有一个类似的项目叫做硒 。

你甚至可以使用的Watir与Linux机器上所谓的“无头”的浏览器。

无头的Watir例如

假设我们有这样的HTML:

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

与此Javascript:

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

(演示: http://jsbin.com/ivihur )

你想获得动态插入的文本。 首先,你需要一台Linux机器与xvfbfirefox安装,例如在Ubuntu做:

$ apt-get install xvfb firefox

你也将需要watir-webdriverheadless宝石因此继续并安装它们,以及:

$ 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然后取出上述多次动态文本需要大约0.5秒,在我的Rackspace的云服务器的每个请求)。

来源: http://watirwebdriver.com/headless/



Answer 2:

水豚+ PhantomJS

我最喜欢的红宝石控制的模拟浏览器是PhantomJS 。 PhantomJS是一个无头的基于WebKit的浏览器。 它包括鬼驱人这是水豚驱动程序。

综上所述,堆栈看起来是这样的:

Capybara -> Poltergeist -> PhantomJS -> WebKit

请注意,您可以与硒的webdriver直接使用PhantomJS,但水豚API是更好的(恕我直言)

作为一个最小的WebKit的执行,PhantomJS比一个完整的浏览器如Chrome或IE更快的启动时间。

示例代码凑谷歌结果链接:

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

除了标准的水豚功能,鬼驱人可以做一些非常方便的事情:

  • 注入与运行自己的javascript page.evaluate_scriptpage.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)
  • cookie处理
  • 拖和下降

这些功能列出的骚灵GitHub的页面上: https://github.com/teampoltergeist/poltergeist 。

迅捷

如果你真的想竭力维持尽可能多的性能越好,并且不介意切换到JRuby中这样做,我发现迅捷是超级快。

迅捷是围绕Java的一个的HtmlUnit包装。 这是因为快速的HtmlUnit是不是一个完整的浏览器,它更是执行JavaScript的一个模拟器。 缺点是,它不支持所有的完整的浏览器做,所以它不会支持非常JS-重网站的JavaScript,但它足以满足大多数网站和越来越好所有的时间。

另一个优点是JRuby的的多线程性质。 随着桃(每个平行)的宝石 ,你可以火了许多并行的浏览器。 我有一个测试套件,在过去这样做,大大减少完成的时间。 事实上,我们使用迅捷+桃那是比典型的JMeter,磨床,apachebench等更为复杂的它可以真正行使我们的网站做了负载测试!



文章来源: Is it possible to plug a JavaScript engine with Ruby and Nokogiri?