SimpleBrowser v.s. WWW::Mechanize
SimpleTestのSimpleBrowserのサンプルを読んでいると、SimpleBrowserも結局はWWW::Mechanizeとやろうとしていることはほとんど同じ?と思いました。そこでSimpleBrowserを使ってGoogleから「php」で検索して、その結果のページのタイトルを取ってくるという簡単なサンプルを作ってみました。同様にPerlでもWWW::Mechanizeを使って実装してみました。両方ともほとんど同じような感じで作れることがわかりました。
SimpleBrowser
以下がSimpleBrowserで実装したバージョンです。
<?php require_once('simpletest/browser.php'); $browser = &new SimpleBrowser(); $browser->addHeader('User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ' . 'en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6'); $browser->get('http://www.google.com'); $browser->setField('q', 'php'); $browser->clickSubmitByName('btnG'); print $browser->getResponseCode() . "<br>"; print $browser->getTitle(); ?>
$browser->addHeader()メソッドでUserAgentをセットしています。この引数の値は以下のようにしてWWW::Mechanizeのソースコードを見て、それをコピー&ペーストしました。これくらいのレベルのコードならモジュールプログラミングの詳細を知っていなくても、理解できるようになりました。Perlの勉強をして良かった...
$ vi `perldoc -l WWW::Mechanize` [...] my %known_agents = ( 'Windows IE 6' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Windows Mozilla' => 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6', 'Mac Safari' => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85 (KHTML, like Gecko) Safari/85', 'Mac Mozilla' => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4a) Gecko/20030401', 'Linux Mozilla' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624', 'Linux Konqueror' => 'Mozilla/5.0 (compatible; Konqueror/3; Linux)', ); sub agent_alias { my $self = shift; my $alias = shift; if ( defined $known_agents{$alias} ) { return $self->agent( $known_agents{$alias} ); } else { $self->warn( qq{Unknown agent alias "$alias"} ); return $self->agent(); } } [...]
WWW::Mechanize
以下がWWW::Mechanizeで実装したバージョンです。「BlogHacks」の「HACK #48 Orkutの検索結果をRSSに」を参考にしました。
#!/usr/bin/perl -w use strict; use WWW::Mechanize; use CGI; my $mech = WWW::Mechanize->new(); $mech->agent_alias('Windows Mozilla'); $mech->get('http://www.google.com'); $mech->form_number(1); $mech->field(q => 'php'); $mech->click(); if ($ENV{GATEWAY_INTERFACE}) { print CGI::header("text/html; charset=utf8"); } print $mech->status() . "<br>"; print $mech->title();