3

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>

上記のページでフォームを選択できないようで、スクリプトがそのページで停止し、リダイレクトに従っていないようです。

この種のリダイレクトを処理する標準的な方法はありますか? リダイレクトが行われるまでスクリプトを一時停止することはありますか? リダイレクトが機能することをすべて許可しますか?

任意のポインタをいただければ幸いです!

4

2 に答える 2

1

2 つのオプションがあります。また:

  1. フォームを手動で送信する
  2. WatirまたはSeleniumを使用する

基本的に Mechanise は JavaScript を実行しないため、実行中の JavaScript を手動でシミュレートするか (オプション 1)、実際のブラウザーを自動化して実行する (オプション 2) 必要があります。

POSTgetのlang=1代わりに of を実行するだけの場合、オプション 1 は double にする必要があります。

私は次のように推測します:

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

しかし、Mechanize を実際に使用したことはありません。

于 2012-04-29T20:44:09.057 に答える
0

このようなリダイレクトにフォローを追加してみてください

agent.follow_meta_refresh = true

また、これが JavaScript で制御された動作である場合、mechanize はこれに従うことができないため、不適切な位置にいます。彼はjsを実行しません。彼がどのようにそれを行うかを js で確認し、mechanize で同じ呼び出しをエミュレートする必要があります。

しかし、私はあなたがする必要があるのはただ

agent.post <url>

彼はポストメソッドを期待しているようだからです。

筋金入りの代替手段があります:) node.js https://github.com/joshfire/node-crawlerでnode-crawlerを使用するには 、クライアントページサーバー側からjavascriptを評価できます。

于 2012-04-29T20:53:03.387 に答える