UNIX処方箋:WWW::MechanizeモジュールによるWebアクセスの自動化

最新のハードウェアやソフトウェアにかんするニュースもいいけれど、「事件は枯れたシステムが稼働する現場で起こってるんだ」と現場ですぐに役立つ知識を欲するあなたへ贈る珠玉のTips集。今回は、Perlスクリプトを用いたWebアクセスの自動化だ。


80x80_1_unix.jpg

郵便番号検索などが行えるWebサイトをよく利用します。ただ、毎回Webブラウザで項目を入力して検索するのは面倒なので、スクリプトなどを利用したいと考えています。どのように実現したらよいでしょうか?


80x80_2.jpg

 一般的なCGIに対しては、Perlスクリプトなどを用いると簡単に検索できます。ここでは、「MACアドレスのベンダーコード検索」サービス用のスクリプトとして、WWW::Mechanizeモジュールを利用したoui-search.plを紹介します(リスト1)

 なおシステムには、PerlおよびWWW::Mechanizeモジュールを事前にインストールしてください。WWW::Mechanizeモジュールは依存するものが複数あるので、CPANモジュールを利用すると簡単に導入できます。


# perl -MCPAN -e shell
cpan> install WWW:Mechanize


 1 #!/usr/bin/perl -w
 2
 3 use strict;  4 use WWW::Mechanize;  5
 6 unless($ARGV[0] =~ m/^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$/i)  7 {  8         print("ERROR: Invalid argument.\n");  9         print(" ex\) $0 08-00-20\n"); 10         exit(1); 11 } 12
13 my $url = 'http://standards.ieee.org/regauth/oui/index.shtml'; 14 my $agent = WWW::Mechanize -> new(); 15 $agent -> get($url); 16 $agent -> field("x", $ARGV[0]); 17 $agent -> submit_form(form_number => "1"); 18
19 print("IEEE OUI Company_id\n"); 20 print("-------- -----------------------\n"); 21 if($agent -> content =~ m/(?:[0-9A-F]{6})\s+\(base 16\)\s+(.+)/) 22 { 23         print("$ARGV[0] $1\n"); 24 } 25 else 26 { 27         print("$ARGV[0] NOT FOUND\n"); 28 } 29
30 exit(0);
リスト1 oui-search.pl

oui-search.plの実行と内容

 oui-search.plを実行する際は、引数としてMACアドレスのベンダーコードを指定します。例えば、「08-00-20」を指定すると、


% ./oui-search.pl 08-00-20
IEEE OUI  Company_id
--------  -----------------------
08-00-20  SUN MICROSYSTEMS INC.

のように表示されます。ここで、存在しないコードを指定した場合は、


% ./oui-search.pl 08-00-dd
IEEE OUI  Company_id
--------  -----------------------
08-00-dd  NOT FOUND

と「NOT FOUND」が表示されるので注意してください。

 oui-search.plの内容を見てみると、まず6行目で引数の型チェックを行っています。14行目でインスタンスを生成し、15行目で指定URLへアクセスします。16行目では、「x」というテキストフィールドに対して、引数で与えられたベンダーコードを入力しています。最後に17行目で[Submit]ボタンを押し、検索を実行します。そして21行目では、検索結果表示ページの内容からベンダー名を抜き出し、23行目で標準出力へ表示させています。

プロキシサーバーを利用した応用

 このように、WWW::Mechanizeモジュールを利用すれば、Web経由での管理インタフェースしか持たないネットワーク機器などのメンテナンスが容易になります。例えば、「cronで定期的にスクリプトを実行し、ステータス表示画面からデータを抜き出して管理者にメールする」という操作も実現できるわけです。

 スクリプトを作成するうえで面倒なのが、HTMLソースコードからフォームの名称や値の入力方法を調べる部分だと思います。これについては、HTTP::Recorderモジュールを用いることで、スクリプト主要部分のひな形を生成させることが可能です。例えば、HTTP::ProxyモジュールとHTTP::Recorderモジュールを利用して簡易プロキシサーバーrecord-http.plを作成し(リスト2)、Webブラウザでのアクセスを経由注5させることで、HTTP通信の内容(Webブラウザから送信された内容の主要部分)を取得できます(実行例1)


#!/usr/bin/perl -w

use strict; use HTTP::Proxy; use HTTP::Recorder;
my $proxy = HTTP::Proxy -> new(); my $agent = HTTP::Recorder -> new (         file            => "/tmp/myagent",         showwindow      => 0 ); $proxy -> agent($agent); $proxy -> start();
1;
リスト2 record-http.pl

# ./record-http.pl & ←Webブラウザでベンダーコード検索を実行
# cat /tmp/myagent
$agent->get("http://standards.ieee.org/regauth/oui/
index.shtml");
$agent->field("x", "08-00-20");
$agent->submit_form(form_number => "1");

実行例1 record-http.plによるHTTP通信内容の取得

 JavaScriptを利用している場合など、一部のWebページでは正常に記録されないことがありますが、この内容をカスタマイズすることで、HTMLソースコードを参照することなしに、WWW::Mechanizeモジュールを利用したスクリプトの作成が可能になります。

関連キーワード

Perl | CGI


Copyright© 2010 ITmedia, Inc. All Rights Reserved.




キャリアアップ



エンタープライズ・ピックアップ

news004.jpg 世界で勝つ 強い日本企業のつくり方:利用契約の検討――グローバルクラウドで失敗しないために(前編)
2010年以降、クラウドサービスの利用がさらに加速する。サービスを利用する企業はプロバイダーのデータセンターに預けた自社情報を保護するために、法的な要素を理解しておかなければならない。企業が注意を払うべき法的な検討事項を整理する。

news001.jpg IT投資の新方程式:「Twitter使ってます」――現役MS社員が“社員力”を語る(前編)
マイクロソフトが掲げるプロモーションメッセージ「社員にチカラを。ITで企業力を。(以下、BIEB)」からは、ITで社員の生産性を向上することが業績の拡大につながる、といったニュアンスを感じる。そこで気になるのが「じゃあ、マイクロソフトの社員自身はどうなのよ?」ということ。3人の現役MS社員により実態が明らかになる……?

news010.jpg 産業構造を変えるか:「住宅クラウド」の衝撃
住宅都市工学研究所が進める「住宅クラウド」は、クラウドが企業のIT領域にとどまらず、ビジネスのやり方自体を変える可能性を示している。

news010.jpg オルタナティブな生き方 栗原進さん:ネットでリアルを楽しくしたい
SE出身の企業広報マンでありながら、趣味は落語で憧れの人はインディ・ジョーンズとアナログ全開の栗原さんに、ブログを書く理由やネットからはじまるコミュニケーションについて伺った。

news001.jpg 最強最速アルゴリズマー養成講座:トップクラスだけが知る「このアルゴリズムがすごい」――「探索」基礎最速マスター
プログラミングにおける重要な概念である「探索」を最速でマスターするために、今回は少し応用となる探索手法などを紹介しながら、その実践力を育成します。問題をグラフとして表現し、効率よく探索する方法をぜひ日常に生かしてみましょう。