【python】Yahoo Web APIでバーコード情報(JAN)から商品名を読み出す(数列→商品情報) 【お家IT#18】
本件の実装の一部
motojapan.hateblo.jp
前回の続き
motojapan.hateblo.jp
目次
前回は画像からバーコード情報(数列)を取得した。
今回はこの情報から、商品情報を取得する。
取得方法のアイディア
実際このバーコード情報から商品名を求める方法はいくつかある。
今回はWebAPIを中心に話を進めるが折角なのでスクレイピングも少しみてみる。
1.スクレイピングする方法
例えば、JANコード「9000009984074」に対応するのは、お馴染み「クリスタルカイザー」という飲料水。
これを検索にかけてみるとこうなる。
BeautifulSoup4 をインストール
$ apt-cache search beautifulsoup $ sudo apt-get install python3-bs4
実装
python3.x系で実装するとこんな感じ
import urllib.request from bs4 import BeautifulSoup headers = { "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0", } request = urllib.request.Request(url='https://www.google.co.jp/search?q=9000009984074+jan', headers=headers) response = urllib.request.urlopen(request) html = BeautifulSoup(response) print(html)
2.WebAPIで検索する方法(種類)
脱線したがこちらが本筋。
WebAPIでバーコード情報から商品名を求められるメジャーどころは下記。
Product Advertising API (Amazon Web Services)
楽天商品検索API (Rakuten Developers)
Yahoo! Developer Networksを使ってみる
今回はまず手軽にやってみたいので、Yahoo! APIにした。
さらに、Yahoo! Developer Networksを使うモチベーションは、Yahoo!が提供する地図や気象情報などの多種多様なサービスがWebAPIから扱えるという点もあったので、今回登録してみた。
次の前提は把握していたほうが話がスムーズ。
- Yahoo! Developer Networksは、ディベロッパー(アカウント)登録が必要である
- 「アプリケーション」という単位で管理している
- 1アカウント当たり、10個までのアプリケーションを登録できる
- クエリ数は、アプリケーション通算の総カウントで計算される
- API別に上限がある
登録
ディベロッパー登録
まずディベロッパー登録を下記から行う。
Yahoo! JAPAN ID登録 - Yahoo! JAPAN
gmailでも登録できる。
アプリケーション登録
「アプリケーション管理」から「新しいアプリケーションを開発」を選択。
アプリケーションの種類を選択し、他の入力情報を埋める。
「クライアントサイド」を選択する場合はこんな感じ。
クライアントID取得
アプリケーションを登録後、「デベロッパーネットワークトップ」>「アプリケーションの管理」>「アプリケーションの詳細」から、「Client ID」をメモする。
ここでメモしたIDを、
インストール & 実装
必要モジュールをインストール
$ pip install beautifulsoup4
単なるWebAPIとして扱えるので「スクレイピングする方法」と似たように簡単だが今度はpython2.7系で実装するとこんな感じ。
import urllib from bs4 import BeautifulSoup // code : バーコード情報 def code_to_product_info(code): print('*********** start product_info ************') start_time = time.time() product_info = None client_id = '<client_id>' url = 'http://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch?appid={0}&jan={1}'.format(client_id, code) response = urllib.urlopen(url).read() soup = BeautifulSoup(response) res = soup.find_all('name') // nameタグを取得 //ここから超雑 if len(res) > 0: product_info = res[0] print 'proc_time {0:f} [ms] '.format((time.time() - start_time) * 1000) return product_info print('*********** end product_info ************')
結果
クリスタルガイザー ミネラルウォーター 500ml×48本 並行輸入品 代引不可
処理速度は50-150[ms]程度。(通信状況によって揺らぐ)
以上。
ここまでで、画像から商品名(食品名)を検索するモジュールができた。
次回からは、OCRを用いて画像から賞味期限を取得するモジュールの話を進めたい。