blog/content/post/2008-11-29-00001077.md

14 KiB
Raw Blame History

title author date url wordtwit_post_info categories
Starbucksの店舗検索からスクレイピング kazu634 2008-11-29 /2008/11/29/_1157/
O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4405;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}
Perl
scraper

Starbucksの店舗情報を取得する その1 武蔵の日記」のつづきだよ。

これまでのまとめ

ページを表示できません。|スターバックス コーヒー ジャパンからリンクの抽出を前回行いました。今回は個別のページから情報を取得します。

取得したいページ

たとえば「http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%8B{%8F%E9%8C%A7:title]」のページです。個々の情報が次のように並んでいます。

f:id:sirocco634:20081129222026p:image

ここから情報を取得します。

Web::Scraper

こういう場合はWeb::Scraperを使うとよいようです。そこで実際に使ってみました。

参考にしたのは以下のページです:

実際のコード

# === Libraries ===
use strict;
use warnings;
use URI;
use Web::Scraper;
use YAML;
use Encode;
use utf8;
# === Main part ===
# Web::Scraperのインスタンスを作成
my $scraper = scraper {
# 切り出す位置を指定
# 今回は複数ある「<div class="Table01">...</div>」の間を切り出し、
# storesという配列に格納
process '//div[contains(@class, "Table01")]', 'stores[]' => scraper {
# 「<div class="Table01">」からの相対的な位置で切り出す位置を指定
# 「//tr[1]/td[2]」は「<div class="Table01">」から
# 一つ目の「<tr>」の中にある二つ目の「<td>...</td>」の間にあるテキスト情報を
# キー「store_name」としてハッシュに格納する
process '//tr[1]/td[2]', 'store_name' => 'TEXT';
process '//tr[2]/td[2]', 'address'    => 'TEXT';
process '//tr[3]/td[2]', 'tel'        => 'TEXT';
process '//tr[4]/td[2]', 'nearby_station' => 'TEXT';
process '//tr[5]/td[2]', 'open_close' =>'TEXT';
}
};
# 実際に情報を取得する
my $result = $scraper->scrape(
URI->new(
"http://www.starbucks.co.jp/search/result_city2.php?SearchPerfecture=%88%A4%92m%8C%A7"
)
);
# 情報の表示
print encode( 'utf8', Dump($result->{stores}) );

実行結果

  • address: 郵便番号450-6013愛知県 名古屋市中村区 名駅 1-1-4 JRセントラルタワーズ 13F

nearby_station: ‘名古屋駅 ( JR東海道本線、JR関西本線、名古屋市営地下鉄桜通線、名古屋市営地下鉄東山線、近鉄名古屋線 ) 徒歩2分 新名古屋駅 ( 名鉄名古屋本線、名鉄犬山線 ) 徒歩4分 名古屋セントラルタワーズ内’

open_close: ‘月~木: 8:00 23:00 [LO 22:30]金: 8:00 23:00 [LO 22:30]土: 8:00 23:00 [LO 22:30]日: 8:00 23:00 [LO 22:30]祝日: 8:00 23:00 [LO 22:30]定休日:不定休’

store_name: 名古屋JRセントラルタワーズ店

tel: 052-586-7087 

  • address: 郵便番号460-0008愛知県 名古屋市中区 栄 4-6-1 ホテルプリシード名古屋 1F

nearby_station: ‘栄駅 ( 名古屋市営地下鉄東山線、名古屋市営地下鉄名城線 ) 徒歩7分 栄町駅 ( 名鉄瀬戸線 ) 徒歩7分 ホテルプリシード名古屋’

open_close: ‘月~木: 7:00 22:00金: 7:00 22:30土: 7:00 22:30日: 7:00 22:00祝日: 7:00 22:00定休日不定休

store_name: ‘ホテルプリシード名古屋 栄4丁目店

tel: 052-251-7773 

  • address: 郵便番号444-0840愛知県 岡崎市 戸崎町外山 38-5 イオンモール岡崎

nearby_station: ‘岡崎駅 ( JR東海道本線、愛知環状鉄道 ) 徒歩20分 東岡崎駅 ( 名鉄名古屋本線 ) 徒歩35分 イオンモール岡崎内’

open_close: ‘月~木: 10:00 22:00金: 10:00 22:00土: 10:00 22:00日: 10:00 22:00祝日: 10:00 22:00定休日不定休

store_name: ‘イオンモール岡崎店’

tel: 0564-59-1010 

  • address: 郵便番号480-1124愛知県 愛知郡 長久手町戸田谷 901-1 アピタ長久手店

nearby_station: ‘藤ヶ丘駅 ( 名古屋市営地下鉄東山線、東部丘陵線リニモ ) 徒歩25分 アピタ長久手店ショッピングセンター内1F

open_close: ‘月~木: 10:00 22:00金: 10:00 22:00土: 10:00 22:00日: 10:00 22:00祝日: 10:00 22:00定休日不定休

store_name: ‘名古屋 アピタ長久手店’

tel: 0561-61-7022 

  • address: 郵便番号450-0002愛知県 名古屋市中村区 名駅 4-7-25 名駅地下街サンロード

nearby_station: ‘名古屋駅 ( JR東海道本線、JR関西本線、名古屋市営地下鉄桜通線、名古屋市営地下鉄東山線、近鉄名古屋線 ) 徒歩3分 新名古屋駅 ( 名鉄名古屋本線、名鉄犬山線 ) 徒歩3分 婦人服ITOJUの向かい側

open_close: ‘月~木: 7:30 21:30金: 7:30 21:30土: 7:30 21:30日: 7:30 21:30祝日: 7:30 21:30定休日不定休

store_name: ‘名駅地下街 サンロード店’

tel: 052-586-3252 

  • address: 郵便番号460-0008愛知県 名古屋市中区 栄 3-1-8 名古屋栄東急イン 1F

nearby_station: ‘栄駅 ( 名古屋市営地下鉄東山線、名古屋市営地下鉄名城線 ) 徒歩3分 栄町駅 ( 名鉄瀬戸線 ) 徒歩3分 栄東急イン1F

open_close: ‘月~木: 7:00 22:00金: 7:00 22:30土: 7:00 22:30日: 7:00 22:00祝日: 7:00 22:00定休日不定休

store_name: ‘栄東急イン店’

tel: 052-262-2156 

  • address: 郵便番号460-0003愛知県 名古屋市中区 錦 2-18-19 三井住友銀行名古屋ビル 1F

nearby_station: ‘伏見駅 ( 名古屋市営地下鉄東山線、名古屋市営地下鉄鶴舞線 ) 徒歩3分 電気文化会館の前の三井住友銀行の中’

open_close: ‘月~木: 7:00 22:00金: 7:00 22:00土: 8:00 22:00日: 8:00 21:00祝日: 8:00 21:00定休日不定休

store_name: ‘三井住友銀行名古屋ビル店’

tel: 052-232-1516 

  • address: 郵便番号470-2100愛知県 知多郡 東浦町緒川申新田二区 67-8 イオンモール東浦

nearby_station: ‘緒川駅 ( JR武豊線 ) 徒歩5分 イオン東浦ショッピングセンター’

open_close: ‘月~木: 10:00 22:00金: 10:00 22:00土: 10:00 22:00日: 10:00 22:00祝日: 10:00 22:00定休日不定休

store_name: ‘イオンモール東浦店’

tel: 0562-82-2723 

  • address: 郵便番号456-8580愛知県 名古屋市熱田区 神宮 3-6-34 名鉄パレ百貨店 神宮

nearby_station: ‘神宮前駅 ( 名鉄名古屋本線、名鉄常滑線 ) 徒歩1分 東口の階段降りてすぐ’

open_close: ‘月~木: 7:00 21:30金: 7:00 21:30土: 7:00 21:30日: 7:00 21:00祝日: 7:00 21:00定休日不定休

store_name: ‘名鉄 神宮前駅店’

tel: 052-683-5013 

  • address: 郵便番号460-0002愛知県 名古屋市中区 丸の内 3-20-17 中外東京海上ビル 1F

nearby_station: ‘久屋大通駅 ( 名古屋市営地下鉄名城線、名古屋市営地下鉄桜通線 ) 徒歩1分 地下鉄久屋大通駅1番出口すぐ

open_close: ‘月~木: 7:00 22:00金: 7:00 22:30土: 7:00 22:30日: 8:00 22:00祝日: 8:00 22:00定休日不定休

store_name: ‘桜通り大津店’

tel: 052-962-1055 

これからの課題

  • 検索トップページから再帰的に全てのページの店舗情報を取得できるようにする