M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2010年11月22日 22:11

Adobe Creative Suite 出力対応店一覧をGoogle Mapsで表示させる(13)

このエントリーをはてなブックマークに追加 mixiチェック

アドビの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

コメントする