印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
LinuxPerl Freetel のサイトをスクレイピング

Freetel サイトのスクレイピングを行って,通信量と料金を取得する。

■ ■ ■

はじめに

FREETEL(フリーテル) は格安 SIM を販売する MVNO 事業者である。価格が安いのと,従量制のプランがあるというのが魅力で,今年の4月から利用している (nlog(n): さようなら Y!mobile こんにちは freetel)。

現在のところ,Freetel には従量制のプランがあるものの,専用アプリが提供されていないため,現在までの通信量と料金が Web サイトにアクセスしなければ分からないという欠点がある。複数回線を契約して家族に使わせている場合,個別の通信量が分からないという問題もある。さらに,月間使用量が最終的に何 GB になったのかについても明細書に記載されないため,料金の内訳が分からないという問題もある。

そこで,今回は Freetel サイトのスクレイピングを行って,現在時点の通信量と料金を取り出することにした。

動作環境

動作環境は,Vine Linux 6.2, Perl 5.12.3, Web::Scraper 0.38 である (nlog(n): Web::Scraper のインストール)。

Web サイトの調査

Web サイトをスクレイプする場合,目的の数値がどこに記載されているのかを突き止める必要がある。今回は Chrome 51.0 を使用した。

Chrome で Web サイトを表示し,「表示」→「開発/管理」→「デベロッパーツール」の順で選択する。目的の数値までたどって,HTML ソースの行を右クリックし,「Copy」→「Copy selector」または「Copy Xpath」とする。今回は CSS セレクタを使うことにした。

Perl スクリプト

Freetel マイページの「ご利用料金」から電話番号と現在までの料金を,「節約モード設定」から電話番号と現在までの通信量を取り出すことにする。ユーザID freetel_userid@your.domain と,パスワード freetel_password は自分のものに書き換える。

#!/usr/bin/perl
use strict;
use Web::Scraper;
use WWW::Mechanize;
use DateTime;
use Data::Dumper;

my $userid = 'freetel_userid@your.domain';
my $passwd = 'freetel_password';

my $dt = DateTime->now(time_zone => 'local');

my $mech = WWW::Mechanize->new();
$mech->get('https://mypage.freetel.jp/login') or die;
$mech->submit_form(
    fields => {
        'data[SimUser][userDesignationId]' => $userid,
        'data[SimUser][password]' => $passwd,
    }
);

my $scraper1 = scraper {
    process 'h2', 'phone[]' => 'TEXT';
    process 'dl > dt > span', 'usage[]' => 'TEXT';
};
my $scraper2 = scraper {
    process 'div > div.col-xs-12.col-sm-4', 'phone[]' => 'TEXT';
    process 'div > div.col-xs-6.col-sm-3.align-right > span:nth-child(1)', 'charge[]' => 'TEXT';
};
$mech->get('https://mypage.freetel.jp/SavingMode') or die;
my $result1 = $scraper1->scrape($mech->content);
$mech->get('https://mypage.freetel.jp/Specification/thisMonth/' . $dt->strftime('%Y%m')) or die;
my $result2 = $scraper2->scrape($mech->content);

print Dumper $result1;
print Dumper $result2;

現在のところ,Freetel の Web サイトには,要素に統一性がなく,行き当たりばったりで書いている雰囲気である。そのため,CSS セレクタの指定がページ毎にまちまち。

実行結果

実行結果は以下のとおりである。

$VAR1 = {
          'phone' => [
                          '070-xxxx-xxxx',
                          '090-xxxx-xxxx'
                        ],
          'usage' => [
                       ' 7.75GB ',
                       '/10GB',
                       ' 879.61MB ',
                       '/10GB'
                     ]
        };
$VAR1 = {
          'phone' => [
                          ' 070xxxxxxxx (FreetelSIM) ',
                          ' 090xxxxxxxx (FreetelSIM) '
                        ],
          'charge' => [
                        '2,531',
                        '759'
                      ]
        };

電話番号の表記方法もページごとに違っていて,通信量のページはハイフン付きで 070-xxxx-xxxx なのに,料金のページはハイフンなしで 070xxxxxxxx になっている。

まとめ

Freetel の Web サイトをスクレイプして通信量と料金の数値を取得した。この手のプログラムの悲しいところは,サイトの表記が変わると動作しなくなることである。「その場限りの,暫定的な」プログラムになってしまう。Freetel のサイトは,表記の統一がされておらず (HTML5 のソースも電話番号も) ボロボロだが,Freetel の中の人は無理して直さなくていいから! 「更新しました」とかされると,プログラムの書き直しをしなくてはならないので面倒だから!

次回はこれをグラフ化する (nlog(n): Freetel の通信量を Zabbix 2.4 でグラフ化nlog(n): Freetel の通信量を Google スプレッドシートでグラフ化)。

2016年9月27日追記:
2016年9月20日頃に表示形式が変わりました。「\x{301c}」は「〜」を表しています。

$VAR1 = {
          'usage' => [
                       " 2.50GB \x{301c} 2.51GB ",
                       '/10GB',
                       " 320MB \x{301c} 330MB ",
                       '/10GB'
                     ],
          'phone' => [
                          '070-xxxx-xxxx',
                          '090-xxxx-xxxx'
                        ]
        };

2016年11月11日追記:
freetel.jp のウェブサイトが変更され,上記スクリプトは動作しなくなりました。グラフ化用スクリプトはメンテナンスしています (nlogist/freetel-usage-charge)。

Posted by n at 2016-08-21 11:37 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?