31 KiB
title | author | date | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|
Starbucksの店舗情報を取得する – その1 | kazu634 | 2008-11-25 |
|
|
Starbucksがどこにあるのかを検索しようと公式サイトを覗くも、自分が望むような検索ができず。できればGoogleMap上に店舗があるところにマーカーをたてたいなーと漠然と考える。そうしたことをPerlで実現しようと考え、少しずつ頑張ってみる…という企画の第一弾です。
はじめに
Starbucks公式サイトの検索はこのようになっています
ソースを覗いてみると、
- 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