【Perl】WWW::Mechanize と Web::Scraper で PASMO の利用履歴を得る(その1)


101002-0002.png

定期券を PASMO に切り替えたらネットで利用履歴が見られることを知った。以下の URL を開いてログインすると、上に挙げたようなページ(内容は適当にいじってある。)が開く。

マイページ PASMO 履歴照会サービス ログイン
https://www.pasmo-mypage.jp/loginwebform.aspx

ここから利用履歴を得るスクリプトを書いてみよう。とりあえず実行結果はこんな感じ。

$ perl pasmo.pl ユーザー名 パスワード
---
- 利用駅1: 横浜市B
  利用駅2: ''
  月日: 0930
  残額: 30
  種別1: バス
  種別2: ''
  運賃: 530
- 利用駅1: 横浜
  利用駅2: 新横浜
  月日: 0925
  残額: 560
  種別1: 入
  種別2: 出
  運賃: 440
- 利用駅1: 横浜
  利用駅2: ''
  月日: 0920
  残額: 1000
  種別1: 現金
  種別2: ''
  運賃: 0
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use Web::Scraper;
use WWW::Mechanize;
binmode STDOUT => ":utf8";
# Windowsなら
# binmode STDOUT => ":encoding(cp932)";

my $m = WWW::Mechanize->new;
$m->get( "https://www.pasmo-mypage.jp/loginwebform.aspx" );
warn "-- ユーザー名・パスワードをセット\n";
$m->set_fields(
    userIdTextBox => shift // die,
    passwordTextBox => shift // die,
);
warn "-- ログイン\n";
$m->click( "loginButton" );
warn "-- 履歴照会画面を開く\n";
$m->follow_link( text => "PASMO履歴照会はこちら" );
my $content = $m->content;

#use Path::Class;
#my $content = file( "sample.html" )->slurp( iomode => "<:encoding(utf8)" );

my $results = scraper {
    process '//tr[@bgcolor="#D0D0D0"]', 'results[]' => scraper {
        process "//td[1]", 月日 => "TEXT";
        process "//td[2]", 種別1 => "TEXT";
        process "//td[3]", 利用駅1 => "TEXT";
        process "//td[4]", 種別2 => [
            "TEXT",
            sub { s/ //g; },
        ];
        process "//td[5]", 利用駅2 => "TEXT";
        process "//td[6]", 残額 => [
            "TEXT",
            sub { s/\*//g; },
        ];
    }
}->scrape( $content )->{results};

for my $i ( 0 .. @$results - 1 ) {
    my $b = $results->[ $i ];
    $b->{運賃} = $i == @$results - 1 ? 0 :
        abs $results->[ $i + 1 ]{残額} - $b->{残額};
}

use YAML; print Dump $results;

WWW::Mechanize で目的のページを得る

WWW::Mechanize を使うと、実際にマウスとキーボードでブラウジングしているようにページを行き来できる。

ただ、そのスクリプトを一から書くことは難しいので、事前に WWW::Mechanize::Shell を使ってコマンドプロンプトからシミュレートしてみよう。

$ perl -MWWW::Mechanize::Shell -e shell
(no url)>

このコマンドで WWW::Mechanize のシェルが起動する。

(no url)>get https://www.pasmo-mypage.jp/loginwebform.aspx
Retrieving https://www.pasmo-mypage.jp/loginwebform.aspx(200)

まずは get コマンドでログインページを開く。

https://www.pasmo-mypage.jp/loginwebform.aspx>forms
Form [1]
POST https://www.pasmo-mypage.jp/loginwebform.aspx [_ctl0]
  userIdTextBox=                 (text)
  passwordTextBox=               (password)
  loginButton=ログイン               (submit)
  registerLinkButton=会員登録        (submit)

forms コマンドでページの中にどんなフォームがあるか調べる。このページにはフォームが一つしかないので問題ないが、2 つ以上のフォームがある場合は“form 3”などとして、目的のフォームを選択しないといけない。

https://www.pasmo-mypage.jp/loginwebform.aspx>fillout

(text)userIdTextBox> [] ユーザー名
(password)passwordTextBox> [] パスワード

フォームの確認が終わったら、fillout コマンドで実際に必要な項目を埋める。

https://www.pasmo-mypage.jp/loginwebform.aspx>click loginButton
(200)

フォームの実行は submit コマンドなのだが、今回のフォームのように submit 属性のボタンが 2 つ以上(今回は“ログイン”及び“会員登録”がこれに当たる。)ある変則的なものには使えない。click コマンドで明示的にボタンを指定しよう。

https://www.pasmo-mypage.jp/MenuWebForm.aspx>links
[0] style.css
[1] ログアウト |
[2] PASMO履歴照会はこちら
[3] パスワード変更

https://www.pasmo-mypage.jp/MenuWebForm.aspx>open 2
(200)

ログインが成功するとメニューが表示される。links コマンドでメニューの項目を表示し、open コマンドで目的のメニューをクリックする。

https://www.pasmo-mypage.jp/CardStatusWebForm.aspx>content

目的のページについた。content コマンドでページのソースを確認しよう。ソースをファイルに保存したいときは“content ファイル名”のように書けばよい。

my $m = WWW::Mechanize->new;
$m->get( "https://www.pasmo-mypage.jp/loginwebform.aspx" );
$m->set_fields(
    userIdTextBox => shift // die,
    passwordTextBox => shift // die,
);
$m->click( "loginButton" );
$m->follow_link( text => "PASMO履歴照会はこちら" );
my $content = $m->content;

以上のような作業を経て、上記のようなスクリプトが得られる。

次回はこのページを Web::Scraper を使って解析する。(続く)

【Perl】WWW::Mechanize と Web::Scraper で PASMO の利用履歴を得る(その2)
https://blog.delphinus.dev/2010/10/get-pasmo-history-with-perl-2.html

コメントを残す