我正在写一个应用程序抓取一些网站,并从中抽取数据。 我使用的红宝石,卷曲和引入nokogiri做到这一点。 在大多数情况下,它的简单,我只需要ping一个URL,并解析HTML数据。 安装工作完全正常。
然而,在某些情况下,该网站检索基于某些单选按钮用户输入数据。 这将调用一些JavaScript从服务器获取更多的数据。 所生成的URL和发布数据是由JavaScript代码来确定。
是否有可能使用:
与此设置里面,就能够确定在HTML网页执行JavaScript我沿着一个JavaScript库?
除了使用一个不同的库,是有一些整合或为HTML和JS库,以交流的方式? 举例来说,如果一个按钮被按下,引入nokogiri需要调用JavaScript,然后将JavaScript需要更新引入nokogiri。
如果我的做法似乎没有最好的,你会有什么建议是建立一个履带式+刮使用Ruby在网络上。
编辑:看起来像第1点是可以使用therubyrace因为它嵌入在你的代码的V8引擎,但有2个选择吗?
您正在寻找的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机器与xvfb
和firefox
安装,例如在Ubuntu做:
$ apt-get install xvfb firefox
你也将需要watir-webdriver
和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
然后取出上述多次动态文本需要大约0.5秒,在我的Rackspace的云服务器的每个请求)。
来源: http://watirwebdriver.com/headless/
水豚+ 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_script
和page.execute_script
-
page.within_frame
和page.within_window
-
page.status_code
和page.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等更为复杂的它可以真正行使我们的网站做了负载测试!