# 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のシート。 ![スクリーンショット](https://hackmd.io/_uploads/r1s2mZL5T.png) <br> A列にはフラグが三種類入っている。ここのフラグによってプログラムが分岐されているため、結構大切。 C列にスクレイピングしたいタイトルを入れる。 黄色→aukanaに情報がないもの。 オレンジ→探索ができるもの。aukanaに情報があるもの。 青色→シリーズ作品軸の先頭。 D列にaukanaのURL #### 作品軸→個別作品。 ![スクリーンショット 3](https://hackmd.io/_uploads/Syq7LZ89a.png) ![スクリーンショット](https://hackmd.io/_uploads/ryPBIW8qp.png) #### シリーズ作品軸→シリーズ作品軸は基本これ。aukanaでDMM TVで視聴できるシリーズ作品が存在するものはこのフラグ。 ![スクリーンショット](https://hackmd.io/_uploads/SkMYIZ8ca.png) ![スクリーンショット](https://hackmd.io/_uploads/Skr9UWIcp.png) ##### シリーズ作品軸_フラグ用→シリーズ作品軸の例外。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個区切りずつなどで進めるとよい。(途中でプログラムが止まるとデータが壊れるため。) ## 懸念点 情報の最新性の担保