是否可以使用Ruby和Nokogiri插入JavaScript引擎?

nut*_*lly 1 javascript ruby web-crawler nokogiri web-scraping

我正在编写一个应用程序来抓取一些网站并从中抓取数据.我正在使用Ruby,Curl和Nokogiri来做这件事.在大多数情况下,它很简单,我只需要ping一个URL并解析HTML数据.设置完美无缺.

但是,在某些情况下,网站会根据某些单选按钮上的用户输入检索数据.这会调用一些JavaScript,从服务器获取更多数据.生成的URL和发布的数据由JavaScript代码确定.

是否可以使用:

  1. 一个JavaScript库以及这个设置,它能够确定在我的HTML页面中执行JavaScript吗?

  2. 除了使用不同的库之外,还有一些集成或HTML和JS库进行通信的方式吗?例如,如果单击一个按钮,Nokogiri需要调用JavaScript,然后JavaScript需要更新Nokogiri.

如果我的方法看起来不是最好的,那么你的建议是使用Ruby在Web上构建一个crawler + scraper.

编辑:使用therubyrace看起来像第1点是可能的,因为它在你的代码中嵌入了V8引擎,但有2的替代品吗?

Pat*_*ity 7

您正在寻找运行真实浏览器的Watir,并允许您在网页上执行您能想到的所有操作.还有一个名为Selenium的类似项目.

您甚至可以在Linux机器上使用Watir和所谓的"无头"浏览器.

Watir无头的例子

假设我们有这个HTML:

<p id="hello">Hello from HTML</p>
Run Code Online (Sandbox Code Playgroud)

这个Javascript:

document.getElementById('hello').innerHTML = 'Hello from JavaScript';
Run Code Online (Sandbox Code Playgroud)

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

并且您想获得动态插入的文本.首先,你需要一个带有xvfbfirefox安装的Linux盒子,例如在Ubuntu上:

$ apt-get install xvfb firefox
Run Code Online (Sandbox Code Playgroud)

你还需要watir-webdriverheadless宝石,所以继续安装它们:

$ gem install watir-webdriver headless
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下内容从页面中读取动态内容:

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
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,这将输出:

Hello from JavaScript
Run Code Online (Sandbox Code Playgroud)

我知道这也在后台运行浏览器,但它是我能想到的最简单的问题解决方案.启动浏览器需要很长时间,但后续请求速度非常快.(goto对于我的Rackspace云服务器上的每个请求,运行然后多次获取动态文本大约需要0.5秒).

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