スキル

python使ってDMMから商品情報を取得してみる

今回は、pythonを使ってDMMから商品の情報を取得する処理のプログラミングです。

ここの部分の処理ですね。

DMMから情報取得する仕様の確認

DMMへの接続は、「DMM Webサービス」の利用ガイドを参照してREST APIを使って接続します。

DMMの提供するAPIは、次の7種類が用意されています。とりあえず商品情報APIを使ってデータを取得してみます。

提供APIAPI説明
商品情報API DMM.com の商品の情報を取得
女優検索API女優情報を取得
ジャンル検索APIジャンル一覧を取得
メーカー検索APIメーカー一覧を取得
シリーズ検索APIシリーズ一覧を取得
作者検索API作者一覧を取得
フロア検索APIフロア一覧を取得

商品情報APIの仕様を確認

APIの動作仕様は、左下メニューの「APIver3.0リファレンス」から確認できます。

リクエストURLから手動でAPIをリクエストして結果を確認しましょう。

使用するリクエストURLの確認

まずは、リファレンスを確認して、使用するURLを確認します。

リファレンスページのリクエストURLがREST APIで接続に行くエンドポイントになります。これを参考にリクエストパラメータを修正してデータを取得します。

必須パラメータの修正

リクエストパラメータの表を参照して、API発行時に必要なパラメータを修正します。

修正が必要なパラメータは、この3つです。

APIIDの修正

まずは、APIIDの修正です。

https://api.dmm.com/affiliate/v3/ItemList?api_id=[APIID]&affiliate_id=[アフィリエイトID]&site=FANZA&service=digital&floor=videoa&hits=10&sort=date&keyword=%e4%b8%8a%e5%8e%9f%e4%ba%9c%e8%a1%a3&output=json

APIIDはアフィリエイトアカウント作成時に発行されたIDで左上に画面左上に確認用のボタンがあります。まだ登録していない人は、こちらの記事を参照して登録しちゃってください。

https://api.dmm.com/affiliate/v3/ItemList?api_id=uVusadkefJDwfdsasef1aRtF&affiliate_id=[アフィリエイトID]&site=FANZA&service=digital&floor=videoa&hits=10&sort=date&keyword=%e4%b8%8a%e5%8e%9f%e4%ba%9c%e8%a1%a3&output=json

アフィリエイトIDの修正

続いてアフィリエイトIDを修正します。

https://api.dmm.com/affiliate/v3/ItemList?api_id=uVusadkefJDwfdsasef1aRtF&affiliate_id=[アフィリエイトID]&site=FANZA&service=digital&floor=videoa&hits=10&sort=date&keyword=%e4%b8%8a%e5%8e%9f%e4%ba%9c%e8%a1%a3&output=json

アフィリエイトIDは登録情報メニューから確認できます。Webサービスの登録を行っていれば、末尾990番のアフィリエイトIDが確認できます。

アフィリエイトIDは末尾990のIDを指定します。

適当な文字でも発行はできます。そこから報酬が発生しないだけですが、動作確認であれば、IDはなくても問題ありません。

https://api.dmm.com/affiliate/v3/ItemList?api_id=uVusadkefJDwfdsasef1aRtF&affiliate_id=XXXX-990&site=FANZA&service=digital&floor=videoa&hits=10&sort=date&keyword=%e4%b8%8a%e5%8e%9f%e4%ba%9c%e8%a1%a3&output=json

サイト名変更

3つ目はサイト名の変更です。DMMは一般サイトのDMM.comとアダルト用サイトのFANZAの2サイトのいずれかを選択します。

https://api.dmm.com/affiliate/v3/ItemList?api_id=uVusadkefJDwfdsasef1aRtF&affiliate_id=XXXX-990&site=FANZA&service=digital&floor=videoa&hits=10&sort=date&keyword=%e4%b8%8a%e5%8e%9f%e4%ba%9c%e8%a1%a3&output=json

リクエストAPIのサンプルがデフォルトでFNAZAになっていますので、DMM.comに修正します。

https://api.dmm.com/affiliate/v3/ItemList?api_id=uVusadkefJDwfdsasef1aRtF&affiliate_id=XXXX-990&site=DMM.com&service=digital&floor=videoa&hits=10&sort=date&keyword=%e4%b8%8a%e5%8e%9f%e4%ba%9c%e8%a1%a3&output=json

手動でリクエストを出してみる

では、パラメータを変更したURLを使ってリクエストを出してみます。

ブラウザのURL欄にリクエストURLを貼り付けてアクセスしてみます。

一応成功(status=200)です。でも、取得したデータ数は0件(count=0)。文法的に問題ないということです。

では、キーワードパラメータなど不要なパラメータを削除して再度リクエストしてみます。

修正前のリクエストURL

https://api.dmm.com/affiliate/v3/ItemList?api_id=uVusadkefJDwfdsasef1aRtF&
affiliate_id=XXXX-990&site=DMM.com&service=digital&floor=videoa&hits=10&sort=date&keyword=%e4%b8%8a%e5%8e%9f%e4%ba%9c%e8%a1%a3&output=json

修正後のリクエストURL

https://api.dmm.com/affiliate/v3/ItemList?api_id=uVusadkefJDwfdsasef1aRtF&affiliate_id=XXXX-990&site=DMM.com&service=digital&hits=10&sort=date&output=json

結果、データの取得に成功しています。下記では、全データ数が50000件あり、そのうち10件を取得したことを示す結果が出力されています。

first_positionとは、全データ数の何番目のデータから取得するかを指定するパラメータです。

ちなみに、アフィリエイトIDを末尾 001 にしてリクエストすると、エラーが返ってきます。そのほかにも文法上の問題がある場合は、satus:400のエラーが返ってきます。

まずは、これをPythonを使って実装してみます。

Python使ってDMMからデータを取得する

DMMからデータを取得するための作業ステップ

  1. DMMに接続
  2. DMMからデータを取得

ステップにするとたった2ステップ。それぞれの機能毎にコーディングしていきます。

DMMに接続

リクエストURLを書き換えて接続用のURLを作成します。手動で実施した修正と同じです。あなたのIDに合わせて修正してください。

https://api.dmm.com/affiliate/v3/ItemList?api_id=[APIID]&affiliate_id=[アフィリエイトID]&site=DMM.com&service=digital&floor=videoa&hits=10&sort=date&keyword=%e4%b8%8a%e5%8e%9f%e4%ba%9c%e8%a1%a3&output=json

DMMからデータを取得

pythonでデータを取得するコードです。

#ライブラリインポート
import requests
import json
from pprint import pprint

#APIID
API_ID='uVurvdL*******F'

#アフィリエイトID
AFF_ID = 'XXXX-990'

#エンドポイントURL
url="https://api.dmm.com/affiliate/v3/ItemList?api_id="+API_ID+"&affiliate_id="+AFF_ID+"&site=DMM.com&hits=10&output=json"

#リクエスト実行
jsondata=requests.get(url).json()

#取得結果出力
pprint(jsondata)

エンドポイントURL

API_IDとAFF_IDを使ってURLを作成しています。hits=10は検索結果を10件抽出するというパラメータ。output=jsonはJSON形式で取得することを指定しています。

リクエスト実行

リクエストをrequests 関数を使って呼び出して、結果をjsondata に格納しています。

取得結果出力

格納した結果は、pprintを使って表示させています。出力結果は以下の通り

{'request': {'parameters': {'affiliate_id': 'XXXX-990',
                            'api_id': 'uVur*************aRtF',
                            'hits': '10',
                            'output': 'json',
                            'site': 'DMM.com'}},
 'result': {'first_position': 1,
            'items': [{'URL': 'https://www.dmm.com/mono/hobby/-/detail/=/cid=cha_toumusical1746/',
                       'affiliateURL': 'https://al.dmm.com/?lurl=https%3A%2F%2Fwww.dmm.com%2Fmono%2Fhobby%2F-%2Fdetail%2F%3D%2Fcid%3Dcha_toumusical1746%2F&af_id=XXXX-990&ch=api',
                       'category_name': 'ホビー通販',
                       'content_id': 'cha_toumusical1746',
                       'date': '2023-04-17 10:00:00',
                       'directory': [{'id': 4944, 'name': 'グッズ'},
                                     {'id': 5046, 'name': 'キャラクター雑貨'},
                                     {'id': 5479, 'name': 'その他_キャラクター雑貨'}],
                       'floor_code': 'hobby',
                       'floor_name': 'ホビー',
                       'imageURL': {'large': 'https://pics.dmm.com/mono/hobby/cha_toumusical1746/cha_toumusical1746pl.jpg',
                                    'list': 'https://pics.dmm.com/mono/hobby/cha_toumusical1746/cha_toumusical1746pt.jpg',
                                    'small': 'https://pics.dmm.com/mono/hobby/cha_toumusical1746/cha_toumusical1746ps.jpg'},
                       'iteminfo': {'genre': [{'id': 15226,
                                               'name': 'ミュージカル『刀剣乱舞』'},
                                              {'id': 79022, 'name': '刀剣乱舞'}],
                                    'maker': [{'id': 63888,
                                               'name': 'ミュージカル『刀剣乱舞』'}],
                                    'series': [{'id': 65820,
                                                'name': 'ミュージカル『刀剣乱舞』'}]},
                       'prices': {'list_price': '200', 'price': '200'},
                       'product_id': 'cha_toumusical1746',
                       'service_code': 'mono',
                       'service_name': '通販',
                       'stock': 'reserve',
                       'title': '【受注生産】ミュージカル『刀剣乱舞』 江 おん すていじ 〜新編 里見八犬伝〜 '
                                'ランダムすていじカード(全24種)',
                       'volume': 'W55mm×H85mm'},
                      {'URL': 'https://dlsoft.dmm.com/detail/dacapo_0027/',
                       'affiliateURL': 'https://al.dmm.com/?lurl=https%3A%2F%2Fdlsoft.dmm.com%2Fdetail%2Fdacapo_0027%2F&af_id=XXXX-990&ch=api',

pprintがJSON形式のデータを見やすく表示してくれます。

{・・・}はその要素の塊

result{・・・} は、resultの内容はこの中に記載しているという意味。
情報として、zirst_position,items,category_nameなどの情報を持ってることを示す。

[・・・]はその要素が複数ある時のインデックス

Items[・・・]はitemsが複数の情報を持っているということを示す。Itemsの内容は、URL, ‘affiliateURL, ’category_name, content_idなどのラベル情報を持っていて、それを複数存在することを示す。また、各情報の値は、「ラベル:値」という表記になっている。

例)次の例では、

  • resultにはitemsresult_count、status、total_countという要素がある。
  • itemsには、affiliateURL、category_name、titleの3つの要素がある。
  • itemsは2つの情報を持っている
  • 2つ目の情報のタイトルはitems[1]title の値だから、[resut][items][1][title]で表現できて、値は、「エルダー・スクロールズ・オンライン」である。

という形で構成されています。items[]の数字は0から始まることに注意です。

result{
  items: [
   {affiliateURL : https://al.dmm.com/?lurl=https%3A%2F%2Fwww.dmm.com%2Fmono%2Fhobby%2F-%2Fdetail%2F%3D%2Fcid%3Dcha_toumusical1746%2F&af_id=XXXX-990&ch=api,
    category_name : ホビー通販,
    title : ミュージカル『刀剣乱舞』 江 おん すていじ 〜新編 里見八犬伝〜},
   {affiliateURL :https://al.dmm.com/?lurl=https%3A%2F%2Fdlsoft.dmm.com%2Fdetail%2Fdacapo_0027%2F&af_id=XXXX-990&ch=api,
    category_name : PCゲーム,
    title : エルダー・スクロールズ・オンライン}]
  result_count: 2,
  status: 200,
  total_count: 50000}}

上記の説明では要素をそのまま書きましたが、実際はシングルクォーテーションで囲む必要があります。

['resut']['items'][1]['title']

次はいよいよ、取得したDMMデータからツイート用文章を作成して、実際にツイートを行います。

-スキル
-, , , , ,