今回は Perl で外部サイトにアクセスしてその情報を取得する方法を紹介します。
サンプルコードでは、Yahoo にログインし、ログイン状態を保持しています。
また画像認証が出てきたときのために、Mechanize オブジェクトをファイルに保存しています。
サンプルコードはこちらです。
今回は以下の3つのCPAN モジュールを使用しています。
WWW::Mechanize
HTTP::Cookies
Storable
WWW::Mechanize(mach) は、WEBサイトとのやりとりを行います。
サイトへの接続や、Form の送信も可能です。
また、mach では訪れたサイトのURLを保持しますので、後々呼び出すことも可能です。
今回はこの mach を使用して、Form を送信することでログイン処理を行っています。
Cookie とはサーバー側がクライアント側に情報を格納し、また取り出すことができる機能です。
これを使用してログイン後の情報を保存することで、ログイン状態を保持しています。
Storable はデータ構造体の永続化を行うモジュールです。
store を使用して保存し、retrieve を使用して読み込みます。
Yahoo では画像認証が表示されることがあります。
画像認証の文字を、プログラムで解析して自動で入力するのはとても難しいことです。
これを行うには、一旦画像を画面に表示して入力処理を行い認証処理を行う必要があります。
しかし、画像認証の文字列はアクセスするたびに毎回かわります。
正しく行うには、画像認証が表示されたときと、画面に表示して入力したときで同じ状態にする必要があります。
そのために Storable を使用して、Mechanize オブジェクトをファイルに保存し、次回読み込み時もこの Mechanize オブジェクトを使用することで、状態を保持します。
今回のサンプルコードでは画像認証の処理については記述していませんが、Machanize オブジェクトを保存して状態を保持するようにしています。
※重要な個所のみピックアップして記述しています。
use WWW::Mechanize;
use HTTP::Cookies;
use Storable;
use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);
our $login_page = 'http://user.auctions.yahoo.co.jp/jp/show/mystatus';
our $cookie_file = 'cookie.dat';
our $mech_file = '20130712101010';
our $user_id = 'user';
our $password = 'pass';
my $cookies = HTTP::Cookies->new(file => $cookie_file, autosave => 1, ignore_discard => 1);
my $mech = WWW::Mechanize->new();
$mech->agent_alias('Windows IE 6');
$cookies->load($cookies);
$mech->cookie_jar($cookies);
$mech->get($login_page);
if ($mech->content =~ m/<title>ログイン \- Yahoo! JAPAN<\/title>/) {
$mech->form_name('login_form');
$mech->field('login', $user_id);
$mech->field('passwd', $password);
$mech->click();
}
$cookies->extract_cookies($mech->response());
$cookies->save($cookie_file);
store ($mech, 'data/' . $mech_file) or die;
use WWW::Mechanize;
use HTTP::Cookies;
use Storable;
use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);
our $login_page = 'http://user.auctions.yahoo.co.jp/jp/show/mystatus';
our $cookie_file = 'cookie.dat';
our $work_session_file = '20130712121212';
my $cookies = HTTP::Cookies->new(file => $cookie_file, autosave => 1, ignore_discard => 1);
my $mech = retrieve 'data/' . $mech_file;
my $content;
$mech->cookie_jar($cookies);
$mech->get($login_page);
$content = $mech->content;