Starbucksがどこにあるのかを検索しようと公式サイトを覗くも、自分が望むような検索ができず。できればGoogleMap上に店舗があるところにマーカーをたてたいなーと漠然と考える。そうしたことをPerlで実現しようと考え、少しずつ頑張ってみる…という企画の第一弾です。

はじめに

Starbucks公式サイトの検索はこのようになっています

f:id:sirocco634:20081125234824p:image

ソースを覗いてみると、

  • SearchPerfecture
  • /serach/ごにょごにょ.php

という部分が店舗情報へのリンクになっているようです。それを切り出して、店舗情報へのリンクを集めた配列を作ります。

www::Mechanize

基本的な使い方はこんな感じになります。ちなみに以下は私のsnippetとして登録しているものです。:

# character modules
use Encode;
use utf8;
# WWW::Mechanize
use WWW::Mechanize;
use URI;
binmode(STDOUT, ':raw :encoding(utf8)');
binmode(STDERR, ':raw :encoding(utf8)');
# ====================
# === Main Routine ===
# ====================
# creating the object of WWW::Mechanize
my $mech = WWW::Mechanize->new();
# ここでurlを指定してあげる
$mech->get( "http://www.google.com/" );
# Show the error message, if it fails.
die $mech->response->status_line unless $mech->success;
# n番目のフォームにデータをpostする場合はこういう風に指定する
$mech->form_number(1);
# postするデータを用意するにはこんな感じで指定するよ
# $mech->field(ktyp0 => 'SHK');
# データをサブミットする
$mech->submit();
$mech->success or die "Posting data fails: ",
$mech->response->status_line;
# 開いたページから正規表現でリンクを検索し、最初に見つかったリンクを踏む
# $mech->follow_link( url_regex => qr/\d\d\d\d\d+/ );
# die $mech->response->status_line unless $mech->success;
# my $html = decode('euc-jp', $mech->content);
# print($html);

基本的な使い方はこんな感じになります。

作ってみた

# === Libraries ===
use strict;
use warnings;
# character modules
use Encode;
use utf8;
# WWW::Mechanize
use WWW::Mechanize;
use URI;
binmode( STDOUT, ':raw :encoding(utf8)' );
binmode( STDERR, ':raw :encoding(utf8)' );
# ====================
# === Main Routine ===
# ====================
my @url = &get_url_list();
# 重複する要素の削除
&delete_duplicates(@url);
exit;
# ハッシュのキーは重複がないことを利用しているよ
sub delete_duplicates {
my @temp = @_;
my %tmp;
foreach my $x (@temp) {
$tmp{$x} = ;
}
foreach my $x ( sort keys %tmp ) {
print("$x\n");
}
}
# Sub-routine for getting the list of the urls.
sub get_url_list {
# 検索結果のページURLを格納する配列
my @links;
# creating the object of WWW::Mechanize
my $mech = WWW::Mechanize->new();
# Get the contents of the url
$mech->get("http://www.starbucks.co.jp/search/index.html/");
# Show the error message, if it fails.
die $mech->response->status_line unless $mech->success;
# SearchPerfectureにヒットするURLを@lnksに格納する
my @lnks = $mech->find_all_links( url_regex => qr/SearchPerfecture/ );
foreach my $url (@lnks) {
my $tmp = $url->url;
# このままだと相対URLなので、絶対URLに変換する
$tmp = URI->new_abs( $tmp, $url->base );
# 文字コードの変換
$tmp = decode( 'shift-jis', $tmp );
push( @links, $tmp );
}
# 東京や神奈川の処理
@lnks = $mech->find_all_links( url_regex => qr/search\/.*\.php$/ );
foreach my $url (@lnks) {
my $tmp = $url->url;
# Change the relative url into the absolute url
$tmp = URI->new_abs( $tmp, $url->base );
$tmp = decode( 'shift-jis', $tmp );
push( @links, $tmp );
}
return @links;
# my $html = decode('shift-jis', $mech->content);
# print($html);
}

実行結果

http://www.starbucks.co.jp/search/kanagawa.php

http://www.starbucks.co.jp/search/osaka.php

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%88%A4%92m%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%88%A4%95Q%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%88%EF%8F%E9%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%89%AA%8ER%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%89%AB%93%EA%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8A%E2%8E%E8%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8A%F2%95%8C%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8B%7B%8D%E8%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8B%7B%8F%E9%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8B%9E%93s%95%7B

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8CF%96%7B%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8CQ%94n%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8D%81%90%EC%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8D%82%92m%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8D%B2%89%EA%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8D%E9%8B%CA%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8DL%93%87%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8E%A0%89%EA%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8E%AD%8E%99%93%87%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8EO%8Fd%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8ER%8C%60%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8ER%8C%FB%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8ER%97%9C%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8FH%93c%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%90%C2%90X%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%90%C3%89%AA%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%90%CE%90%EC%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%90%E7%97t%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%90V%8A%83%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%91%E5%95%AA%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%92%B7%8D%E8%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%92%B7%96%EC%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%92%B9%8E%E6%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%93%87%8D%AA%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%93%BF%93%87%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%93%C8%96%D8%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%93%DE%97%C7%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%95%9F%88%E4%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%95%9F%89%AA%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%95%9F%93%87%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%95%BA%8C%C9%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%95x%8ER%8C%A7

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%96k%8AC%93%B9

http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%98a%89%CC%8ER%8C%A7

http://www.starbucks.co.jp/search/tokyo.php