机械化卡在Javascript重定向页面上

时间:2012-04-22 10:47:25

标签: javascript ruby-on-rails-3 redirect nokogiri mechanize

我在Ruby on Rails应用程序中使用Mechanize和Nokogiri来刮取本地打印机管理面板,以检索打印机生命周期中打印页面的数量。

我有以下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>

我似乎无法在上面的页面上选择表单,并且脚本似乎停在该页面而不是遵循重定向。

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

任何指针都将不胜感激!

2 个答案:

答案 0 :(得分:1)

你有两个选择。之一:

  1. Submit the form manually
  2. 使用WatirSelenium
  3. 基本上,Mechanise不会运行javascript,因此您必须手动模拟运行的javascript(选项1)或自动执行真正的浏览器(选项2)

    如果您只是POST lang=1而不是获取,那么选项1应该是双倍的,因为所有形式都在这样做。

    我猜是这样的:

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

    但我从未真正使用过Mechanize。

答案 1 :(得分:0)

你应该尝试在这样的重定向上添加关注

agent.follow_meta_refresh = true

此外,如果这是javascript控制的行为,那么你处于不利的位置,因为机械化不能遵循这一点。他没有执行js。你将不得不在js中看到他是如何做到这一点并在机械化中模拟相同的调用。

但我认为你需要做的只是

agent.post <url>

因为他似乎在期待post方法。

有一个硬核替代方案:)在node.js中使用node-crawler https://github.com/joshfire/node-crawler 它可以从客户端页面服务器端评估javascript。