Adobe Creative Suite 出力対応店一覧をGoogle Mapsで表示させる(13)
スポンサードリンク
アドビのCS5対応プリントショップのリストのページから、Google Mapsに表示させるやつの13回目。
前回は、アドビのサイトのHTMLをスクレイピングするスクリプト、Google Geocoding APIを使い、住所から緯度/経度を取得するスクリプトをくっつけて、それぞれの印刷会社の住所を取得してみましたが、何やらサーバから取得失敗しているんじゃね、的な不穏なエラーメッセージが混ざっていました。
今回は、エラーメッセージの出方を解析し、さらにエラーメッセージが出ないように取得してみたいと思います。
前回取得したテキストファイル results11.txt には、
... --- results: - address_components: - long_name: 22 short_name: 22 types: - sublocality_level_5 - sublocality - political - long_name: 3 short_name: 3 types: - sublocality_level_4 - sublocality - political - long_name: りんくう南浜 short_name: りんくう南浜 types: - sublocality_level_1 - sublocality - political - long_name: 泉南市 short_name: 泉南市 types: - locality - political - long_name: 大阪府 short_name: 大阪府 types: - administrative_area_level_1 - political - long_name: 日本 short_name: JP types: - country - political formatted_address: '日本, 大阪府泉南市りんくう南浜3−22' geometry: location: lat: 34.3778781 lng: 135.2629286 location_type: APPROXIMATE viewport: northeast: lat: 34.3810257 lng: 135.2660762 southwest: lat: 34.3747305 lng: 135.259781 types: - sublocality_level_5 - sublocality - political status: OK --- results: [] status: OVER_QUERY_LIMIT --- results: [] status: OVER_QUERY_LIMIT --- results: [] status: OVER_QUERY_LIMIT --- results: [] status: OVER_QUERY_LIMIT --- results: [] status: OVER_QUERY_LIMIT --- results: [] status: OVER_QUERY_LIMIT --- results: [] status: OVER_QUERY_LIMIT --- results: [] status: OVER_QUERY_LIMIT --- results: [] status: OVER_QUERY_LIMIT --- results: [] status: OVER_QUERY_LIMIT
と、statusにOVER_QUERY_LIMITとかでていました。他の個所には、ZERO_RESULTSとか入ってきていました。
そこで、得られたテキストの全体から、エラーメッセージがどういうタイミングで出ているのか、確認したいと思います。
どのように調べるかというと、grepを使います。
もうみんな忘れているかもしれないけれども、今回の制作物はLinux環境で作っていますので、こんな感じで入力するとよいです。
$ grep -e 'status' results11.txt > status.txt
結果はこんなかんじです。
Filename: status.txt
status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OK status: OK status: OK status: OK status: ZERO_RESULTS status: ZERO_RESULTS status: OK status: OK status: OK status: OK status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT status: OVER_QUERY_LIMIT
前回のスクリプトでは、Google Maps APIというネットワーク上のアクセスポイントに問い合わせをしていましたが、どうやら、問い合わせの制限があるところを超えてしまった、ということみたいです。
ということは、Google Maps APIへの問い合わせを行うタイミングをゆっくりにすればいいのかな? ということで、前回のプログラムをちょっと変えてみて、ゆっくり問い合わせするようにしてみます。具体的には、ウェイト(待ち時間)を付けてみます。
Filename: test12.pl
#!/usr/bin/perl use strict; use warnings; use utf8; use Web::Scraper; use YAML; use Encode; use WebService::Simple; my $geo = WebService::Simple->new( response_parser => 'JSON', base_url => 'http://maps.google.com/maps/api/geocode/', param => { region => 'jp', language => 'ja', sensor => 'false', }, ); open my $fh, '<', 'printshop.html'; my $html = decode_utf8(do { local $/; <$fh> }); close $fh; my $s = scraper { process '//div[@class="tabcontent"][1]//table[@class="data-bordered max"]/tbody/tr', 'codes[]' => scraper { process '//td[1]', pref => [ 'TEXT', sub { s/\s//g; } ]; process '//td[2]', company => [ 'TEXT', sub { s/\s//g; } ]; process '//td[3]', address => [ 'TEXT', sub { s/\s//g; s/TEL:.+$//i; return $_; } ]; process '//td[3]', phone => [ 'TEXT', sub { s/\s//g; if(m/TEL:([\d-]+)/i){return $1;};}]; process '//td[3]', fax => [ 'TEXT', sub { s/\s//g; s/:/:/g; if(m/FAX:([\d-]+)/i){return $1;};undef;}]; process '//td[4]', illustratorcs5 => [ 'TEXT', sub { return $_ =~m|yes|i ? 1 : undef; } ]; process '//td[5]', indesigncs5 => [ 'TEXT', sub { return $_ =~m|yes|i ? 1 : undef; } ]; process '//td[6]', pdfx1a => [ 'TEXT', sub { return $_ =~m|yes|i ? 1 : undef; } ]; process '//td[7]', pdfx4 => [ 'TEXT', sub { return $_ =~m|yes|i ? 1 : undef; } ]; }; }; my $scraped = $s->scrape($html); #print Dump($scraped->{codes}); foreach my $item ( @{$scraped->{codes}} ) { my $address = $item->{address}; #print "$address\n"; my $res = $geo->get( 'json', { address => $address } ); my $val = $res->parse_response(); print Dump( $val ); sleep 1; } exit; __END__
sleep 1; ていうので、プログラムが1秒止まりますので、Google Maps APIへの問い合わせも、1秒ごとになります。
$ perl test12.pl > results12.txt
$ grep -e 'status' results12.txt > status12.txt
$ less status12.txt
status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: ZERO_RESULTS status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: ZERO_RESULTS status: ZERO_RESULTS status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK status: OK
どうやら、sleep 1; がうまく効いて、OVER_QUERY_LIMIT が解消しました。
ZERO_RESULTSっていうエラーが残っていますが、これに関しては、次回調べてみますね。
投稿 大野 義貴 [GoogleMaps] | 固定リンク |
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3414
コメントする