mapデータにまあまあ詳しくなってきた、ユゲタです。
「GPS」とかけまして、
「待ち合わせの時の暇つぶし」と、ときます。
そのココロは・・・
くるまで(車で、来るまで)便利に使えます。
yahooマップは優秀
以前紹介した「geocoding.jp」サービスで、住所を検索してみても、GPSの値が取得できずにエラーページになってしまう事が何度か発生したので、GPS値クローリングのシステムを見直すことにしました。
リンク :
[便利サービス] 住所からGPSの値を取得できるフリーサイトgeocoding
Googlemapは、初回からクレカ登録をしなければいけないので、実験段階の今の段階ではもっと簡易にしたいと考えてyahooマップを使うことにしました。
geocodingで検索できなかった住所も、yahooマップでは表示されているので、双方をうまく使って検索結果率を高めてみたいと思います。
URL設定と検索処理が必要
googleMapやgeocodingでは、サイトドメインにクエリとして住所を追加して、そのURLを開いただけで、マップが表示されていたので、yahooマップも同じ仕様だと思っていたんですが、どうやら、違っていました。
yahooマップのトップページは、以下のURL
https://map.yahoo.co.jp/maps
検索すると本当のトップページは下記なのですが、上のURLの方が、曖昧な住所も検索してくれて非常に便利に使えます。
https://map.yahoo.co.jp/
そして、検索フォームに住所を登録して、「検索」ボタンを押すとマップが表示されるという感じですね。
ちなみに、ダイレクトにURLクエリにアクセスしてみると、GPS値の取得がされず、ピンも立たないマップが表示されます。
クローリング方法
そして、検索したページ内の、".jssearch"(class名)というaリンクの属性に、"lat"と"lon"があるので、これが検索結果のGPS値になります。
puppeteerのコースコードも載せておきます。
var puppeteer = require('puppeteer');
var path_chromium = '/usr/bin/chromium-browser';
var url = "https://map.yahoo.co.jp/maps";
var response = await page.goto(url, {waitUntil: "load",timeout:0}).catch(function(err){console.log(err);});
await page.waitFor("#yschsp", {waitUntil: "load",timeout:5000}).catch(function(err){console.log(err);});
await page.type("#yschsp", "住所");
page.click('#search');
await page.waitFor(".jssearch", {waitUntil: "load",timeout:5000}).catch(function(err){console.log(err);});
var gps = await page.evaluate(function(){
var elm = document.querySelector(".jssearch");
if(elm){
return elm.getAttribute("lat")+","+elm.getAttribute("lon")
}
else{
return "";
}
}).catch(function(err){console.log(err);});
console.log(gps);
await browser.close();
住所の箇所に、リアルな都道府県からの地名を入れると、gpsの値が、"lat,lon"形式で返るようになっています。
使用の環境に合わせてソースを書き換えてお使いください。
yamlを使ったほうがいい?
puppeteerで便利に住所入力して、検索ボタンを押して、GPS値を取得できるようになったので、とりあえず、geocodingと併用してGPSデータ取得に活用させてもらおうと思います。
でも、YahooにはYAMLという便利なAPIがあり、これを使ったほうが遥かに正確に問題なくスピードも早くデータ取得ができてしまうことは、重々承知の上です。
そうした場合は、puppeteerではなくて、PHPでダイレクトに取得できるので、構成自体が変わってしまうので、今のところはこれでヨシとしておきましょう。
0 件のコメント:
コメントを投稿