タイトルのようなことがしたくて色々調べていると、Perlのモジュールに
Net::CIDR::MobileJP
ってのがあって、この中に各キャリアのIPアドレス帯域がのってるHPをスクレイピングするスクリプトが含まれている・・・ってことがこちら
http://dsas.blog.klab.org/archives/51117561.html
に書いてありました。
どうやらこの中に含まれる
net-cidr-mobilejp-scraper.pl
というファイルがスクレイピングしているようです。
Perlはまったく詳しくないので先程のサイトに載せてあったスクリプトをそのまま使おうとしたところ、
Net::CIDR::MobileJP::Scraper::*
がないよ、と怒られてしまいました。
ぱっと探したところ見当たらない。
Perlは詳しくないので(2回目)ソースを読んでもよくわからないので、スクレイピングをしているであろう処理のところだけ修正してみることにしました。
net-cidr-mobilejp-scraper.plを見ると、実際にスクレイピングをしているのは
WWW::MobileCarrierJP
というモジュールで、他にも色々なデータが取れるみたいですが、今回はCIDRのみ。
ん?ってことはNet::CIDR::MobileJPはいらないのかな?
Net::CIDR::MobileJPはどうやらスクレイパーではなく、ipアドレスを渡してそれが携帯のIPアドレスかどうかを判断してくれるモジュールだったみたいです。勘違い。
よってスクレイピングするだけならWWW:MobileCarrierJPだけで十分・・・なハズ。
気をとりなおしてWWW::MobileCarrierJPをインストール。
http://dsas.blog.klab.org/archives/51117561.html
こちらのソースをいじった部分は以下のようなな感じ、
#================================== # 略 #================================== use WWW::MobileCarrierJP 0.19; use WWW::MobileCarrierJP::DoCoMo::CIDR; use WWW::MobileCarrierJP::EZWeb::CIDR; use WWW::MobileCarrierJP::AirHPhone::CIDR; use WWW::MobileCarrierJP::ThirdForce::CIDR; #================================== # 略 #================================== # name of WWW::MobileCarrierJP::*::CIDR Readonly my @CARRIER => qw(DoCoMo EZWeb ThirdForce); #================================== # 略 #================================== for my $carrier (@CARRIER) { ### start: $carrier my $result; my @cidrs; my $class = "WWW::MobileCarrierJP::${carrier}::CIDR"; $result = $class->scrape; # スクレイピング $result = $class->scrape; # スクレイピングした結果をCIDR形式の文字列にして格納 for (@$result) { my %val = %$_; my $cidr = $val{ip} . $val{subnetmask}; push(@cidrs, $cidr); } my $cidr_new = \@cidrs; my $cidr_old; if (-r "${STORE_DIR}/${carrier}.yaml") { $cidr_old = YAML::LoadFile("${STORE_DIR}/${carrier}.yaml"); } else { $cidr_old = ['NO DATA']; } #================================== # 略 #==================================
softbankは第三勢力らしい。
Net::CIDR::MobileJPでやってたところを、WWW::MobileCarrierJPで行ってるだけ
追記:ちょっと雑にいじり過ぎたので後日ちゃんと修正したものをうpします。
Array::Diffがこのままじゃ反応しない
追記(2010-11-01): ArrayDiffはちゃんと配列でないと動いてくれないので、WWW::MobileCarrierJPを使った場合は結果がハッシュで帰ってくるのでそれを文字列にして配列に格納する処理を挟みました