2012-04-22 52 views
3

我在我的Ruby on Rails应用程序中使用Mechanize和Nokogiri来刮擦我们的本地打印机管理面板,以检索打印机生命周期中的打印页数。机械化陷入Javascript重定向页面

我有以下的rake任务:

# Logs into printer admin page and retrieved counts. 
require 'rubygems' 
require 'mechanize' 
require 'logger' 

# Create a new mechanize object 
agent = Mechanize.new 

# Load the printer admin page 
page = agent.get("http://192.168.1.126/index.html?lang=1") 

# Select the form with an action of index.cqi 
form = agent.page.form_with(:action => "index.cgi") 
form.radiobuttons_with(:id => '0x3fdb24153404')[1] 

# Submit the form 
page = form.submit form.buttons.first 

pp page 

返回以下内容:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> 
<script type="text/javascript"> 
<!-- 
window.onload=function(){setTimeout(function(){document.menu_link.submit();},0);} 
//--> 
</script> 
</head> 
<body> 
<form name="menu_link" action="index.html" method="post" enctype="application/x-www-form-urlencoded"> 
<input type="hidden" name="lang" value="1"> 
</form> 
</body> 
</html> 

我似乎不能够选择上述网页的形式,和脚本似乎停止在该页面,不遵循重定向。

有没有使用这种重定向的标准方式?也许暂停脚本直到重定向发生?它是否每个都允许重定向工作?

任何指针,将不胜感激!

+0

你如何在第二页中选择表格? – Christian 2012-04-22 12:18:47

+0

我刚刚选择了名称为menu_link的表单。 – dannymcc 2012-04-22 15:17:34

回答

1

你有两个选择。或者:

  1. Submit the form manually
  2. 使用WatirSelenium

基本上机械化不会运行JavaScript,所以你必须手动模拟的JavaScript运行(选项1)或自动一个真正的浏览器做(选项2)

如果你只是做POSTlang=1而不是get,因为这是所有的表单正在做的,选项1应该是双倍的。

我猜是这样的:

page = agent.post('http://192.168.1.126/index.html', { 
    "lang" => "1" 
}) 

但我从来没有实际使用机械化。

+0

我已经在登录页面'page = agent.get(“http://192.168.1.126/index.html?lang=1”)请求lang = 1请求它再次给出404错误。 – dannymcc 2012-04-30 12:28:14

+1

这不是'get',你需要做一个'post'。 – mattmanser 2012-04-30 15:32:25

0

你应该尝试的对重定向添加如下这样

agent.follow_meta_refresh = true 

此外,如果这是JavaScript的控制行为,则是不好的位置,因为机械化不能遵循这一点。他不执行js。你将不得不在js中看到他是如何做到的,并在机械化模拟相同的呼叫。

但我认为你需要做的只是

agent.post <url> 

,因为他似乎在期待POST方法。

有骨灰级另类:)使用Node.js的中 https://github.com/joshfire/node-crawler 它可以评估从客户端页面的服务器端JavaScript节点履带。

+0

如果我做agent.post“index.html”,它会将我返回到登录页面? – dannymcc 2012-04-30 12:26:25

+0

该HTML没有元刷新,这是一个js表单提交,完全不同的机制 – mattmanser 2012-04-30 15:30:12

+0

到node.js替代品的链接已损坏。我认为它已经移到这里https://github.com/sylvinus/node-crawler – dantheta 2013-01-07 21:24:42