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

Mechanize getting stuck on Javascript redirect page

本文关键字:重定向 Javascript 机械化      更新时间:2023-09-26

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

我有以下耙子任务:

# 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>

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

有没有处理这些重定向的标准方法?也许暂停脚本直到重定向发生?它会允许重定向工作吗?

任何指示将不胜感激!

你有两个选择。也:

  1. 手动提交表单
  2. 使用瓦蒂尔或硒

基本上 Mechanise 不会运行 javascript,所以你必须手动模拟运行 javascript (选项 1)或自动化一个真正的浏览器来做到这一点(选项 2)

选项 1 应该是双倍的,如果你只是做一个lang=1POST而不是一个 get,因为这就是表单所做的一切。

我猜是这样的:

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

但我从未真正使用过 Mechanize。

您应该尝试添加这样的后续重定向

agent.follow_meta_refresh = true

此外,如果这是javascript控制的行为,那么你就处于不利的位置,因为机械化无法遵循这一点。他不执行js。你必须在js中看到他是如何做到的,并在机械化中模拟同样的调用。

但我认为你需要做的就是

agent.post <url>

因为他似乎在期待后法。

有硬核替代:)在节点中使用节点爬网程序.jshttps://github.com/joshfire/node-crawler它可以从客户端页面服务器端评估JavaScript。