さわのアプリ開発部屋

つまづいたこととかを初心者向けに書いていきたいなぁ

【超初心者向け】YOLPで店舗情報を取得する(Python3)

概要

YOLPのなかでもYahoo!ローカルサーチAPIというYahoo!JAPANが提供しているAPIで、お店の情報を取得します。言語はPython3です。 developer.yahoo.co.jp

うまくいくとこのように、入力した単語にヒットしたお店の情報をJSON返してくれます。

f:id:sugisawa57:20181217235809p:plain
クエリにヒットした店舗情報をJSONで返してくれる

YOLPを使うための前準備

1. アカウント作成またはログイン

YOLPを利用するにはアカウント登録が必要です(無料)。
通常のYahoo!JAPANのIDで大丈夫です。ログインしましょう。
するとこのような画面になります。

f:id:sugisawa57:20181218000359p:plain
YOLPログイン時の画面

2. アプリケーションの登録

ログインできたら画面の右端にある「アプリケーションを開発」をクリックしましょう。

f:id:sugisawa57:20181218001318p:plain
「アプリケーションを開発」をクリック

ご利用ガイドが出てきました。開発手順がわかりやすく載っているので是非読んでください。
では、「アプリケーションを登録」をクリックして次へ進みましょう。
f:id:sugisawa57:20181218001632p:plain
「アプリケーションを登録」をクリック

3. アプリケーションの情報入力

3-1. Web APIを利用する場所

いずれはスマホアプリから使いたいなぁ、と思ったのでYahoo!ID連携v2」「クライアントサイド」を選択しました。
どっちでもいい、みたいなことも書いてあるんでどっちでもいいのかな?(良く分かってないです)

f:id:sugisawa57:20181218002605p:plain
Yahoo!ID連携v2」「クライアントサイド」を選択

3-2. アプリケーションの基本情報

基本そのままでいいのですが、なんとなくアプリケーション名を変更してみました。
お好みの名前で大丈夫です。私は「TestApp」にしてみました。

f:id:sugisawa57:20181218003348p:plain
アプリケーション名を変更

3-3. ガイドラインを確認する

そのまんまですね。ガイドラインを確認して同意しましょう!

f:id:sugisawa57:20181218003703p:plain
ガイドラインを確認して「同意する」にチェック

3-4. 「確認」して「登録」

3-1から3-3まで出来たかどうか、今一度確認したら「確認」をクリックしましょう。
もう一回!もう一回だけ確認しましょう。下線部はOKですか?大丈夫なら「登録」をクリックしてアプリケーションを登録しましょう。

f:id:sugisawa57:20181218004317p:plain
下線部がOKなら「登録」

4. 登録完了!

登録完了です!お疲れ様です。
Client ID(アルファベットと数字の羅列)が表示されていると思います。
これは大事なものなので、こっそりと大事にしましょう。
また、あとで使うのでコピーしておくラクチンです。

f:id:sugisawa57:20181218004836p:plain
登録完了

Python3のコードを書く

1. 前準備(Client IDのコピー)

さっそくコードを書いていきましょう!
と、その前にYOLPのアプリケーションのClient IDをコピーしておいてください!
アプリケーションの管理>アプリケーションの詳細 でClient IDを確認できます。

f:id:sugisawa57:20181218010950p:plain
Client ID確認手順

2. 必要なライブラリのインポート

ではさっそくコードを書いていきましょう。
urllib.request, urllib.parse, pprint, jsonをインポートしましょう。

import urllib.request
import urllib.parse
import json
import pprint

それぞれインポートする理由はこんな感じです。
クリックすると公式ドキュメントページに飛べるのでそちらも参考にしてください。

3. 要素(パラメータ)を指定する

今回必要な要素は元のURL, Client ID, 検索したいワード, アウトプットの形式です。
さて、それぞれの要素を指定しましょう!
ちなみに、この要素のことを以下パラメータと呼ぶことにします。

  • 元のURL:今回はYOLPのなかでもYahoo!ローカルサーチAPIを使うので、https://map.yahooapis.jp/search/local/V1/localSearchです。
  • Client ID:先ほどコピーしたあなたのアプリケーションのClient IDです。アルファベットや数字の羅列。
  • 検索したいワード:「ラーメン屋」でも「駄菓子屋」でも動いてほしいので、input()で好きな文字列を入力できるようにしましょう。また、そのままだと使えないのでパーセントエンコーディングしましょう(後述)。
  • アウトプットの形式:今回はJSON形式にしたいので、"json"としましょう。 これらをコードで書くとこういう感じになります!
BASE_URL = "https://map.yahooapis.jp/search/local/V1/localSearch" # Yahoo!ローカルサーチAPI
CLIENT_ID = "ここにClient IDをペーストしてください" # あなたのClient ID
QUERY = urllib.parse.quote(input('検索したいワードは?:')) # 入力されたクエリをパーセントエンコーディング
OUTPUT="json"

だいたい読めそう。でも待って。パーセントエンコーディングってなんでしょう?

パーセントエンコーディング(英: percent-encoding)とは、URIにおいて使用できない文字を使う際に行われるエンコード(一種のエスケープ)の名称である。 一般にURLエンコードとも称される。1

要は、日本語はURIで使えないから、代わりに日本語以外で表しましょうってことなんですかね(?)
パーセントエンコーディングのやり方は簡単。
urllib.parse.quote()の()の中に入れちゃうだけ。
input()と組み合わせるのもチョイチョイです。
word = urllib.parse.quote(input())とすれば、入力した文字をパーセントエンコーディングしたものがwordのなかに入ります!

4. パラメータを渡す

Web APIへのパラメータの渡し方として、公式にもありますがさらっと説明します。
まずはWeb APIの使い方(GETリクエスト)の「Web APIへのパラメータの渡し方」をごらんください。 developer.yahoo.co.jp
パラメータ名=パラメータの値が基本で、それらを&でつなげばいいということが書いてありますね。
では次に、Yahoo!ローカルサーチAPIのリクエストパラメータ一覧をごらんください。

developer.yahoo.co.jp

今回必要なアプリケーションID、検索クエリ、出力形式が見つけられたでしょうか?
アプリケーションIDはappid, 検索クエリはquery, 出力形式はoutputというのがパラメータ名となっているようです。
ということは、パラメータの渡し方はappid=あなたのID&query=Query&output=OUTPUTで良いのです。
これをコードに書くとこういう感じになります。

url = BASE_URL + "?appid=%s&query=%s&output=%s" % (CLIENT_ID,QUERY,OUTPUT)
print(url) # どんなURLになったか確認できたら、このprint文は消して大丈夫です。

5. 出力(これで最後)

やっとURLが指定できたので、今度は出力しましょう。
さて、さっき一生懸命用意したURLを開くには、urllib.request.urlopen()が必要になります。
urlを開きたいので、urllib.request.urlopen(url)と書けば良いですね。
そして、文字列全てを読み込みたいのでうしろに.read()をつけましょう
そして、見やすいようにpprintで出力しましょう。
コードで書くとこうなります。

json_tree = json.loads( urllib.request.urlopen(url).read())
pprint.pprint(json_tree)

さぁ、いままでのコードを実行してみましょう!
入力したクエリに応じてお店の情報が返ってきたら成功です!

f:id:sugisawa57:20181217235809p:plain
こんな感じになれば成功(再掲)

最後に

APIもPython3も初めて!という方向けにかなり丁寧に書いたつもりです。
これを読んでみなさんの楽しいプログラミング生活に少しでも貢献出来たらうれしいです。
また私自身も初心者なので、もし「間違っている」とか「ここはこの表現のほうがいい」等ありましたらコメントでお願いいたします。

参考

参考にさせて頂いた記事です。ありがとうございました。 qiita.com