# VOD効率化
## コードの内容
使用言語:Python
aukanaからスクレイピングをしてVODの月初更新を行う。
## 進捗
### OK
U-NEXT
Hulu
DMM TV
dアニメストア
FODプレミアム
ABEMAプレミアム
amazonプライムビデオ
### NG
paravi(U-NEXT)
TSUTAYA DISCAS
Lemino
SPOOX
ディズニープラス
TSUBURAYA IMAGINATION
### aukanaの存在
全てで1588×13=20,644個埋めなくてはいけない。
1588レコード中1326レコードはaukanaに存在する。つまり、9282個については自動化が完了している。
したがって、人力で行う作業の45%の作業は軽減されるはず。
(実際、調べなくても良いものもあると思うので作業量は半減以上しているはず。)
## 使い方
### 環境構築
1. Python3をインストール
<参考サイト>
https://qiita.com/Haruka-Ogawa/items/b37d0a2b48d14e29e802
2. 必要なライブラリをインストール
```
pip install beautifulsoup4
pip install openpyxl
pip install gspread
pip install oauth2client
```
<参考サイト>
https://qiita.com/sim58/items/03f0eee74c9fffa39293
3. Vscodeのインストール
<参考サイト>
https://qiita.com/cmssai/items/cde9080e32b7dfd75030
ここまで終わって、Vscode上でPythonが動いたらOK。
### 動作
1. Excelのシート。

<br>
A列にはフラグが三種類入っている。ここのフラグによってプログラムが分岐されているため、結構大切。
C列にスクレイピングしたいタイトルを入れる。
黄色→aukanaに情報がないもの。
オレンジ→探索ができるもの。aukanaに情報があるもの。
青色→シリーズ作品軸の先頭。
D列にaukanaのURL
#### 作品軸→個別作品。


#### シリーズ作品軸→シリーズ作品軸は基本これ。aukanaでDMM TVで視聴できるシリーズ作品が存在するものはこのフラグ。


##### シリーズ作品軸_フラグ用→シリーズ作品軸の例外。aukanaでDMM TVで視聴できるシリーズ作品が存在しないものはこのフラグ。
2. エクセルに行を追加するとき。
- A列に対応するフラグを入れる。
- シリーズ作品軸の場合→C列に入れるタイトルをaukanaの表記に合わせる。
- C列は対応する色付けを行う。
- D列にaukanaのURLを入れる。
3. プログラムの中身
``` python=
import gspread
from openpyxl import load_workbook
from oauth2client.service_account import ServiceAccountCredentials
import requests
from bs4 import BeautifulSoup
import time
# import re
def get_piece_counts(url,sheet,row):
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
tables = soup.find_all('table', class_='vod-list-by-price')
for table in tables:# 各'table'タグごとに処理
tr_tags = table.find_all('tr')
for tr in tr_tags:
# 'th'タグを取得
th_tag = tr.find('th')
# 'th'タグのクラスに応じて処理を分岐
if 'type_monthly_sub' in th_tag.get('class', []):
p_text = th_tag.find('p').text if th_tag.find('p') else "Pタグがありません"
elif 'type_digital_rent' in th_tag.get('class', []):
p_text = th_tag.find('p').text if th_tag.find('p') else "Pタグがありません"
elif 'type_physical_rent' in th_tag.get('class', []):
p_text = th_tag.find('p').text if th_tag.find('p') else "Pタグがありません"
elif 'type_no_charge' in th_tag.get('class', []):
p_text = th_tag.find('p').text if th_tag.find('p') else "Pタグがありません"
else:
p_text = "未定義のクラス"
# 'td'タグを取得
td_tag = tr.find('td')
a_tags = td_tag.find_all('a')
# 各'a'タグに対する処理
for a in a_tags:
# 'a'タグの'data-vod'属性の値を取得
data_vod = a.get('data-vod')
# 'data-vod'のテキストを出力
# print(f"'a'タグのdata-vod: {data_vod}")
# データを変更する
if(data_vod == "u-next"):
# print(type(p_text))
sheet[f"F{row}"] = p_text
if(data_vod == sheet["G1"].value): #paravi
sheet[f"G{row}"] = p_text
if(data_vod == "hulu"):
sheet[f"H{row}"] = p_text
if(data_vod == sheet["I1"].value):
sheet[f"I{row}"] = p_text
if(data_vod == "dmm-tv"):
sheet[f"J{row}"] = p_text
if(data_vod == sheet["K1"].value):
sheet[f"K{row}"] = p_text
if(data_vod == sheet["L1"].value):
sheet[f"L{row}"] = p_text
if(data_vod == "danimestore"):
sheet[f"M{row}"] = p_text
if(data_vod == "abematv"):
sheet[f"N{row}"] = p_text
if(data_vod == sheet["O1"].value):
sheet[f"O{row}"] = p_text
if(data_vod == "amazon"): #amazon prime video
sheet[f"P{row}"] = p_text
if(data_vod == sheet["Q1"].value):
sheet[f"Q{row}"] = p_text
if(data_vod == sheet["R1"].value):
sheet[f"R{row}"] = p_text
# ファイルに保存
wb.save('/Users/tsuchitashion/個人開発/マーケットエンタープライズ/VOD作品軸月初更新用シート.xlsx')
# wb.save('/Users/tsuchitashion/個人開発/マーケットエンタープライズ/VOD作品軸月初更新用シートのコピー.xlsx')
print('------------------')
return
def get_video_platform_counts(url,sheet,row,kw):
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
items = soup.find_all('div', class_='brand-detail-list__item')
for i in range(len(items)): #シリーズの動画が配信されているサービス詳細
# 配信サービス名取得
div_img = items[i].find('div', class_='brand-detail__img')
img = div_img.find_all('img')
services_name = img[0].get('alt')
# print("・"+services_name)
#配信サービスの種類取得
price_type = items[i].find('h3', class_='price_type_name')
# print(price_type.text)
titles = items[i].find_all('p', class_='title')
for j in range(len(titles)):
# print("・"+ titles[j].text)
# print(services_name)
# データを変更する
if(kw in titles[j].text and services_name == sheet["F1"].value):
sheet[f"F{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["G1"].value):
sheet[f"G{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["H1"].value):
sheet[f"H{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["I1"].value):
sheet[f"I{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["J1"].value):
sheet[f"J{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["K1"].value):
sheet[f"K{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["L1"].value):
sheet[f"L{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["M1"].value):
sheet[f"M{row}"] = price_type.text
if(kw in titles[j].text and services_name == "ABEMA"):
sheet[f"N{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["O1"].value):
sheet[f"O{row}"] = price_type.text
if(kw in titles[j].text and services_name == "Amazonプライムビデオ(Amazon Prime Video)"):
sheet[f"P{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["Q1"].value):
sheet[f"Q{row}"] = price_type.text
if(kw in titles[j].text and services_name == sheet["R1"].value):
sheet[f"R{row}"] = price_type.text
# ファイルに保存
wb.save('/Users/tsuchitashion/個人開発/マーケットエンタープライズ/VOD作品軸月初更新用シート.xlsx')
# wb.save('/Users/tsuchitashion/個人開発/マーケットエンタープライズ/VOD作品軸月初更新用シートのコピー.xlsx')
print('------------------')
return
# ワークブックを読み込む
wb = load_workbook('/Users/tsuchitashion/個人開発/マーケットエンタープライズ/VOD作品軸月初更新用シート.xlsx')
sheet = wb.active
# print("・何が配信されているかを調べます。")
# D列(aukana URL)をループ処理
for row in range(610,612):
cell_value = sheet[f'D{row}'].value
if cell_value is not None: # URLがあれば処理を実行
print(f"行 {row}: URLを処理します - {cell_value}")
a_column_value = sheet[f'A{row}'].value
# A列の値に応じて処理を分岐
if a_column_value == "作品軸":
print("作品軸の処理を行います。")
url = cell_value
print(get_piece_counts(url,sheet,row))
elif a_column_value == "シリーズ作品軸":
# シリーズ作品軸の場合の処理
print("シリーズ作品軸の処理を行います。")
# シリーズ作品軸に関する処理をここに記述
url = cell_value
kw = sheet[f"C{row}"].value
print("タイトル:"+kw)
print(get_video_platform_counts(url,sheet,row,kw))
elif a_column_value == "シリーズ作品軸_フラグ用":
#外見はシリーズ作品軸だけど、中身は個別軸の場合の処理
print("シリーズ作品軸_フラグ用の処理を行います。")
url = cell_value
print(get_piece_counts(url,sheet,row))
else: # URLがなければスキップ
print(f"行 {row}: URLがありません。スキップします。")
continue
time.sleep(1)
```
71行目、126行目、133行目→作業したいエクセルファイルのパスを記入。
138行目→range(開始行数,終了行数)の部分は500個区切りずつなどで進めるとよい。(途中でプログラムが止まるとデータが壊れるため。)
## 懸念点
情報の最新性の担保