こんにちは、ミナピピン(@python_mllover)です。
今回はMENTAの案件でDMMのAPIを使ってFANZAのサンプル動画をPythonからダウンロードするスクリプトを作成したので、ここに保存しておこうと思います。
PythonでDMMのAPIを叩く
検索したところdmm-search3というラッピングライブラリが有志の方によって作成されています。
# ライブラリのインストール $pip install dmm-search3
ライブラリの使い方はgitからそのまま持ってきただけですが↓のような感じです。
# モジュールのインポート import dmm # API ID と アフィリエイトIDをセット api_id = "" affiliate_id = "" # インスタンスを作成 api = dmm.API(api_id=api_id, affiliate_id=affiliate_id) # 商品検索 item_search = api.item_search(site="FANZA", hits=1, keyword="バレンタイン") # フロア一覧 floor_list = api.floor_list() # 女優検索 actress_search = api.actress_search() # ジャンル検索 genre_search = api.genre_search(floor_id=91) # メーカー検索 maker_search = api.maker_search(floor_id=91) # シリーズ検索 series_search = api.series_search(floor_id=91) # 作者検索 author = api.author_search(floor_id=72)
参照:https://github.com/miya/dmm-search3/blob/master/test.py
これで作品検索とか女優検索はAPI経由ですぐ実行できるのですが、サンプル動画のダウンロードについては自分の環境ではうまく動作しませんでした。
サンプル動画のURLを取得する
というわけでDMMのエッチのビデオのサンプル動画をダウンロードする機能を自分の方で書き直してみたので、その過程をここにまとめておきます。
まず適当な女優名で検索して検索結果を取得します。
res = api.item_search(site="FANZA", hits=1, keyword="飛鳥りん")
引数hits=1を適当な数字に変えるとその分だけ検索結果を取得してくれます。
レスポンスで必要な部分を抜き出すとこんな感じです。↓
>>res['result']['items'][0]['sampleMovieURL'] <実行結果> {'size_476_306': 'https://www.dmm.co.jp/litevideo/-/part/=/cid=atkd298/size=476_306/', 'size_560_360': 'https://www.dmm.co.jp/litevideo/-/part/=/cid=atkd298/size=560_360/', 'size_644_414': 'https://www.dmm.co.jp/litevideo/-/part/=/cid=atkd298/size=644_414/', 'size_720_480': 'https://www.dmm.co.jp/litevideo/-/part/=/cid=atkd298/size=720_480/', 'pc_flag': 1, 'sp_flag': 1}
サンプル動画が存在している場合はレスポンスにサンプル動画のURLが返されます。
見ればわかりますが、丁寧にサイズごとに別々にURLを返してくれます。
サンプル動画をPythonからダウンロードする
最初に紹介したライブラリのリファレンスを見るとサンプル動画のダウンロード機能が実装されているみたいなのですが、実行するとエラーになったので自分で書きなおしてみました。
import re import requests from bs4 import BeautifulSoup # APIのレスポンスで返されたサンプルビデオのURL r = requests.get('https://www.dmm.co.jp/litevideo/-/part/=/cid=atkd298/size=720_480/') find_src = soup.find("iframe", allow="autoplay").get("src") tcid = re.findall("cid=(.*)/mtype", find_src)[0] video_url = "http://cc3001.dmm.co.jp/litevideo/freepv/{}/{}/{}/{}_sm_w.mp4".format(tcid[:1], tcid[:3], tcid, tcid) response = requests.get(video_url) with open(r'C:\~~\test.mp4', 'wb') as saveFile: saveFile.write(response.content)
やっていることはBeautifulSoupで動画のURLからmp4ファイル名を推測し、それをリクエストで叩いてコンテンツをmp4ファイルに書き出しているだけです。dmm-search3のソースコードと流れは同じなのですが、あちらは内部でyoutube-dlを使用しておりそれの仕様変更がエラーの原因なのかなーって思いました。
参照:【Python】youtube-dlでmp4/mp3をYoutubeからダウンロードする
関連記事:【Python】requestsで画像・動画ファイルを書き出し・ダウンロードするサンプルプログラム
関連記事:【Python】YoutubeのAPIを叩いて検索結果と各動画の再生回数を取得する
参照:https://boukenki.info/python-douga-download-houhou/
コメント
始めまして。
主様のようにDMMからサンプル動画を取得したいと思い
サンプルコードを実行しましたが
find_src = soup.find(“iframe”, allow=”autoplay”).get(“src”)
のところで
‘NoneType’ object has no attribute ‘get’
のエラーが発生して詰まっております。
なにが原因だと考えられますでしょうか?
コメントありがとうございます。
サンプル動画のURLのレスポンスをBS4のクラス型に格納する必要があると思います。