MotoJapan's Tech-Memo

技術めも

【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)
結果

こんな感じで欲しいワード「クリスタルカイザー」は出ているのでこれを頑張って引っ張り出せばできなくもないかも。
f:id:motojapan:20171026022432p:plain
形態素解析してBoWとかでまず頑張るとか、でも食品名は無限に増え続ける固有名詞と考えるとそれだけで自然言語のタスクとして楽しそう。(今回はやらないが)

2.WebAPIで検索する方法(種類)

脱線したがこちらが本筋。
WebAPIでバーコード情報から商品名を求められるメジャーどころは下記。

Product Advertising API (Amazon Web Services)
楽天商品検索API (Rakuten Developers)
ショッピング商品検索(Yahoo! Developer Networks)

Yahoo! Developer Networksを使ってみる

今回はまず手軽にやってみたいので、Yahoo! APIにした。

さらに、Yahoo! Developer Networksを使うモチベーションは、Yahoo!が提供する地図や気象情報などの多種多様なサービスがWebAPIから扱えるという点もあったので、今回登録してみた。

次の前提は把握していたほうが話がスムーズ。

  • Yahoo! Developer Networksは、ディベロッパー(アカウント)登録が必要である
  • 「アプリケーション」という単位で管理している
  • 1アカウント当たり、10個までのアプリケーションを登録できる
  • クエリ数は、アプリケーション通算の総カウントで計算される
  • API別に上限がある

登録

ディベロッパー登録

まずディベロッパー登録を下記から行う。
Yahoo! JAPAN ID登録 - Yahoo! JAPAN
gmailでも登録できる。

アプリケーション登録

「アプリケーション管理」から「新しいアプリケーションを開発」を選択。
f:id:motojapan:20171029012051p:plain

アプリケーションの種類を選択し、他の入力情報を埋める。
f:id:motojapan:20171029012238p:plain
「クライアントサイド」を選択する場合はこんな感じ。

クライアントID取得

アプリケーションを登録後、「デベロッパーネットワークトップ」>「アプリケーションの管理」>「アプリケーションの詳細」から、「Client ID」をメモする。
f:id:motojapan:20171029012729p:plain
ここでメモした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本 並行輸入品 代引不可

f:id:motojapan:20171028180346p:plain

処理速度は50-150[ms]程度。(通信状況によって揺らぐ)
以上。


ここまでで、画像から商品名(食品名)を検索するモジュールができた。
次回からは、OCRを用いて画像から賞味期限を取得するモジュールの話を進めたい。