[スポンサーリンク]
ISBNから図書情報を取得したい
先日古本屋にて気になった本を買って来たところ
本棚に既に同じ本が有りました・・・涙
(大した冊数はないのですが)
本棚にある本の情報の一覧を作りたいということに至りました
本を開いて情報を手打ちしてもいいのですが
面倒なのでISBNから本の情報を取得することをPythonで実現してみたいと思います
ISBNとは
世界基準で本に一意に番号が振ろうという規格がありそのコードがISBNです
ISBNはInternational Standard Book Numberの頭文字で、国際標準図書番号と呼ばれています
2006年までは10桁コードでISBN-10、2007年以降は13桁コードになりISBN-13となっています
ISBNの意味や利便性は日本図書コード管理センターさんのサイトに記載があります
今回はこのISBNから図書情報を取得していきます
[スポンサーリンク]
Amazon Product Advertising API
図書情報の取得にAmazon Product Advertising APIを使ってみます
Amazonさんがアフリエイターに向けて公開している商品情報APIで、商品の情報を取得することが出来ます
今回はこのAPIに、ISBNをキーに検索を掛けて、タイトルや著者、出版社情報等を取得してみます
APIを使うにはトラッキングIDと、アクセスキー、シークレットキーが必要になります
まずはその情報を確認します
トラッキングIDの確認方法
Amazonのアフリエイトアカウントの情報の中にトラッキングIDは表記されています
アフリエイトホーム画面の右上のアカウント情報から参照します
上部に現在のデフォルトトラッキングIDが表示されます
複数所有している場合は下段に、全てが表示されます
アクセスキー、シークレットキーの発行方法
次にAPIに接続する為のアクセスキーとシークレットキーを発行します
尚このAPIについては、アフリエイトの成功数が必要で、売り上げに繋がる広告がないと使用が停止されます
私が確認した時点では下記のような記載がヘルプに記載されていました
売上実績の発生がない場合は、PA-APIの利用開始はできません。また、発送済み商品売上が過去30日以内に発生していない場合、PA-APIをご利用いただけなくなる恐れがございます。
https://affiliate.amazon.co.jp/help/node/topic/GW65C7J2CSK7CA6C
私は本の情報取得という目的の為なので、APIが停止されても困らないので気にせず進めます
もしISBNの検索を長期的に使用し続けたく、またAmazonアフリエイトの成功数がない場合は避けるべきですね
GoogleブックなどISBNを検索できるAPIは他にもあるので、そちらを使用した方が良さそうです
アクセスキー、シークレットキーの発行は、Amazonアフリエイトのページから実施出来ます
メニューからAmazon Product Advertising APIを選択し、「認証情報を追加する」を押下します
すると、アクセスキーとシークレットキーが表示されます
この情報をメモしておきます
再発行する場合は、両方ともキーが新しくなるので、忘れないないようにする必要があります
「認証情報をダウンロードする」を押下すると、アクセスキーとシークレットキーが記載されたcsvファイルをダウンロードすることも出来ます
[スポンサーリンク]
PythonでAmazon Product Advertising APIを使用する
Amazon Product Advertising API 5.0は下記サイトの通り、公式ドキュメントが公開されています
公式で配布されいるサンプルコードを使用することも出来ます
今回は、参考にさせて戴いた下記サイトの様に、amazon-paapi5を使用してAPIを使ってみます
amazon-paapi5とは
amazon-paapi5はAmazon Product Advertising APIのラッパーとして公開されています
これを使用することで、簡単にAPIを使用することが出来ます
確認時点では、AmazonJapanに対応しており、Python3.6以上が動作確認されています
amazon-paapi5のインストール方法
pipコマンドでインストールが可能です
1 |
pip install amazon-paapi5 --upgrade |
1 2 3 4 5 6 7 8 9 10 11 12 |
# pip install amazon-paapi5 --upgrade WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip. Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue. To avoid this problem you can invoke Python with '-m pip' instead of running pip directly. Defaulting to user installation because normal site-packages is not writeable Requirement already satisfied: amazon-paapi5 in ./.local/lib/python3.6/site-packages (1.1.2) Requirement already satisfied: amightygirl.paapi5-python-sdk in ./.local/lib/python3.6/site-packages (from amazon-paapi5) (1.0.0) Requirement already satisfied: certifi in /usr/local/lib/python3.6/site-packages (from amightygirl.paapi5-python-sdk->amazon-paapi5) (2020.12.5) Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.6/site-packages (from amightygirl.paapi5-python-sdk->amazon-paapi5) (1.15.0) Requirement already satisfied: urllib3>=1.15 in /usr/local/lib/python3.6/site-packages (from amightygirl.paapi5-python-sdk->amazon-paapi5) (1.26.3) Requirement already satisfied: python-dateutil in ./.local/lib/python3.6/site-packages (from amightygirl.paapi5-python-sdk->amazon-paapi5) (2.8.1) # |
実行時点では、バージョン 1.1.2がインストールされました
1 |
pip show amazon-paapi5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# pip show amazon-paapi5 WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip. Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue. To avoid this problem you can invoke Python with '-m pip' instead of running pip directly. Name: amazon-paapi5 Version: 1.1.2 Summary: Amazon Product Advertising API 5.0 wrapper for Python Home-page: https://github.com/alefiori82/amazon-paapi5 Author: Alessandro Fiori Author-email: alessandro.fiori@gmail.com License: GPL-3.0 Location: /home/masashi/.local/lib/python3.6/site-packages Requires: amightygirl.paapi5-python-sdk Required-by: # |
amazon-paapi5の使い方
amazon-paapi5はライブラリに含まれる関数を使用することで、簡単にAmazon Product Advertising APIを使用することが出来ます
関数や、引数については下記の通り情報が公開されています
Amazon Product Advertising APIサンプルコード
今回の目的であるISBNコードから図書情報を取得するコードを書いてみます
Amazon Product Advertising APIのSearchItemsを使って検索をします
いつもの通りサンプルコードなので、エラーハンドリングやキーの外出しはしていません
ラッパーamazon-paapi5をインポート
1 |
from amazon.paapi import AmazonAPI |
amazon-paapi5のAmazonAPI関数で接続設定
1 |
AmazonAPISearchItemsConnection = AmazonAPI(AccessKey, SecretKey, TrackingID, Country) |
amazon-paapi5のsearch_items関数でAmazon Product Advertising APIのSearchItemsを実行
1 |
AmazonAPISearchItemsResult = AmazonAPISearchItemsConnection.search_items(keywords=AmazonAPISearchKeyword) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# coding: utf_8 # ライブラリインポート from amazon.paapi import AmazonAPI # APIキー&トークン&トラッキングID&国設定 AccessKey = 【アクセスキー】 SecretKey = 【シークレットキー】 TrackingID = 【トラッキングID】 Country = "JP" AmazonAPISearchItemsConnection = AmazonAPI(AccessKey, SecretKey, TrackingID, Country) # 検索キーワード設定 AmazonAPISearchKeyword = 【検索キーワード(今回はISBN)】 # 検索実行 AmazonAPISearchItemsResult = AmazonAPISearchItemsConnection.search_items(keywords=AmazonAPISearchKeyword) print(AmazonAPISearchItemsResult) |
Amazon Product Advertising APIサンプルレスポンス
JSON形式のレスポンスが返ってきます
著者や訳者、出版社、出版日などが取得出来ます
アフリエイトAPIなので、detail_page_urlにアフリエイトURLも取得出来ていることが分かります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
{'data': [{'asin': '4041055776', 'browse_node_info': {'browse_nodes': [{'ancestor': {'ancestor': {'ancestor': {'ancestor': {'ancestor': None, 'context_free_name': '本', 'display_name': '本', 'id': '465392'}, 'context_free_name': '本', 'display_name': 'ジャンル別', 'id': '465610'}, 'context_free_name': '文学・評論', 'display_name': '文学・評論', 'id': '466284'}, 'context_free_name': '文芸作品', 'display_name': '文芸作品', 'id': '548206'}, 'children': None, 'context_free_name': '英米文学', 'display_name': '英米文学', 'id': '506988', 'is_root': False, 'sales_rank': 3556}, {'ancestor': {'ancestor': {'ancestor': {'ancestor': None, 'context_free_name': '本', 'display_name': '本', 'id': '465392'}, 'context_free_name': '本', 'display_name': 'ジャンル別', 'id': '465610'}, 'context_free_name': '文学・評論', 'display_name': '文学・評論', 'id': '466284'}, 'children': None, 'context_free_name': 'ミステリー・サスペンス・ハードボイルド', 'display_name': 'ミステリー・サスペンス・ハードボイルド', 'id': '507216', 'is_root': False, 'sales_rank': 4247}, {'ancestor': {'ancestor': {'ancestor': {'ancestor': {'ancestor': {'ancestor': None, 'context_free_name': '本', 'display_name': '本', 'id': '465392'}, 'context_free_name': '本', 'display_name': 'ジャンル別', 'id': '465610'}, 'context_free_name': '文学・評論', 'display_name': '文学・評論', 'id': '466284'}, 'context_free_name': '評論・文学研究', 'display_name': '評論・文学研究', 'id': '467262'}, 'context_free_name': '外国文学研究', 'display_name': '外国文学研究', 'id': '507444'}, 'children': None, 'context_free_name': '英米文学研究', 'display_name': '英米文学', 'id': '506992', 'is_root': False, 'sales_rank': 3524}], 'website_sales_rank': {'context_free_name': '本', 'display_name': '本', 'id': None, 'sales_rank': 177092}}, 'detail_page_url': 'https://www.amazon.co.jp/dp/4041055776?tag=***************&linkCode=osi&th=1&psc=1', 'images': {'primary': {'large': {'height': 500, 'url': 'https://m.media-amazon.com/images/I/5104EM8KoEL._SL500_.jpg', 'width': 345}, 'medium': {'height': 160, 'url': 'https://m.media-amazon.com/images/I/5104EM8KoEL._SL160_.jpg', 'width': 110}, 'small': {'height': 75, 'url': 'https://m.media-amazon.com/images/I/5104EM8KoEL._SL75_.jpg', 'width': 51}}, 'variants': None}, 'item_info': {'by_line_info': {'brand': {'display_value': 'KADOKAWA', 'label': 'Brand', 'locale': 'ja_JP'}, 'contributors': [{'locale': 'ja_JP', 'name': 'ダン・ブラウン', 'role': '著'}, {'locale': 'ja_JP', 'name': '越前 敏弥', 'role': '翻訳'}], 'manufacturer': {'display_value': 'KADOKAWA', 'label': 'Manufacturer', 'locale': 'ja_JP'}}, 'classifications': {'binding': {'display_value': '単行本', 'label': 'Binding', 'locale': 'ja_JP'}, 'product_group': {'display_value': '本', 'label': 'ProductGroup', 'locale': 'ja_JP'}}, 'content_info': {'edition': None, 'languages': {'display_values': [{'display_value': '日本語', 'type': '発行済み'}], 'label': 'Language', 'locale': 'ja_JP'}, 'pages_count': {'display_value': 344, 'label': 'NumberOfPages', 'locale': 'en_US'}, 'publication_date': {'display_value': '2018-02-28T00:00:01Z', 'label': 'PublicationDate', 'locale': 'en_US'}}, 'content_rating': None, 'external_ids': {'ea_ns': {'display_values': ['9784041055779'], 'label': 'EAN', 'locale': 'en_US'}, 'isb_ns': {'display_values': ['4041055776'], 'label': 'ISBN', 'locale': 'en_US'}, 'up_cs': None}, 'features': None, 'manufacture_info': None, 'product_info': {'color': None, 'is_adult_product': {'display_value': False, 'label': 'IsAdultProduct', 'locale': 'en_US'}, 'item_dimensions': {'height': None, 'length': None, 'weight': {'display_value': 0.79, 'label': 'Weight', 'locale': 'ja_JP', 'unit': 'ポンド'}, 'width': None}, 'release_date': {'display_value': '2018-02-28T00:00:01Z', 'label': 'ReleaseDate', 'locale': 'en_US'}, 'size': None, 'unit_count': {'display_value': 1, 'label': 'NumberOfItems', 'locale': 'en_US'}}, 'technical_info': None, 'title': {'display_value': 'オリジン 上', 'label': 'Title', 'locale': 'ja_JP'}, 'trade_in_info': None}, 'offers': {'listings': [{'availability': {'max_order_quantity': None, 'message': '在庫あり。', 'min_order_quantity': 1, 'type': 'Now'}, 'condition': {'display_value': None, 'label': None, 'locale': None, 'sub_condition': {'display_value': None, 'label': None, 'locale': None, 'value': 'New'}, 'value': 'New'}, 'delivery_info': {'is_amazon_fulfilled': False, 'is_free_shipping_eligible': False, 'is_prime_eligible': False, 'shipping_charges': None}, 'id': 'AAvTjWpUOXxugv%2FcJASOLNnLBJF5RXJ5dUSWAjjNArrqg5zh%2F697sBT8k%2FHOuhVjNcy0XOYnIPgn4xlXWUClWCRmQiTGA1hyZXctkGztFTZX7OOreu3M9Hvota1cCxWaIn7%2Br9NpV5beJzthFKPMqg%3D%3D', 'is_buy_box_winner': True, 'loyalty_points': None, 'merchant_info': {'default_shipping_country': 'JP', 'id': 'A1BZOWUXIZF0FE', 'name': '?令和書店? ' '★毎日発送中です!【安心の返金保証適用品】'}, 'price': {'amount': 1699.0, 'currency': 'JPY', 'display_amount': '¥1,699', 'price_per_unit': None, 'savings': None}, 'program_eligibility': {'is_prime_exclusive': False, 'is_prime_pantry': False}, 'promotions': None, 'saving_basis': None, 'violates_map': False}], 'summaries': [{'condition': {'display_value': None, 'label': None, 'locale': None, 'sub_condition': None, 'value': 'Collectible'}, 'highest_price': {'amount': 5499.0, 'currency': 'JPY', 'display_amount': '¥5,499', 'price_per_unit': None, 'savings': None}, 'lowest_price': {'amount': 1500.0, 'currency': 'JPY', 'display_amount': '¥1,500', 'price_per_unit': None, 'savings': None}, 'offer_count': 5}, {'condition': {'display_value': None, 'label': None, 'locale': None, 'sub_condition': None, 'value': 'Used'}, 'highest_price': {'amount': 4850.0, 'currency': 'JPY', 'display_amount': '¥4,850', 'price_per_unit': None, 'savings': None}, 'lowest_price': {'amount': 1.0, 'currency': 'JPY', 'display_amount': '¥1', 'price_per_unit': None, 'savings': None}, 'offer_count': 66}, {'condition': {'display_value': None, 'label': None, 'locale': None, 'sub_condition': None, 'value': 'New'}, 'highest_price': {'amount': 5170.0, 'currency': 'JPY', 'display_amount': '¥5,170', 'price_per_unit': None, 'savings': None}, 'lowest_price': {'amount': 1698.0, 'currency': 'JPY', 'display_amount': '¥1,698', 'price_per_unit': None, 'savings': None}, 'offer_count': 11}]}, 'parent_asin': None, 'rental_offers': None, 'score': None, 'variation_attributes': None}], 'http_info': None} |
戻り値はcontains the AmazonProduct listが含まれるディクショナリー形式となっています
to_dict()で辞書型に変換して、戻り値に含まれる値を取得しました
もっとうまい方法などはいっぱいあると思いますが、当初狙っていた、ISBNから検索し、図書に関する情報を取得することが出来ました
1 2 3 4 5 |
AmazonSearchItemsApiResultAmazonProduct = AmazonSearchItemsApiResult['data'][0].to_dict() Title = AmazonSearchItemsApiResultAmazonProduct['item_info']['title']['display_value'] Contributors = AmazonSearchItemsApiResultAmazonProduct['item_info']['by_line_info']['contributors'] Manufacturer = AmazonSearchItemsApiResultAmazonProduct['item_info']['by_line_info']['manufacturer']['display_value'] PublicationDate = AmazonSearchItemsApiResultAmazonProduct['item_info']['content_info']['publication_date']['display_value'] |
[スポンサーリンク]
コメント