Pythonでタワレコのサイトから作詞作曲編曲情報を引っ張ってくる


はじめに

今回は簡単なスクレイピングをやっていこうと思います。
サブスク全盛期にローカルで音源を集めててなおかつ作詞作曲編曲までタグ付けしてる物好きはほとんどいないと思いますが、もしいたらこれで簡単にタグ付けができるので紹介していきたいと思います。

やってみよう

まずタワレコのサイトの構造です。肝心な情報が詰まってるxpathは調べて見るとつぎのような感じでした。
//*[@id="RelationArtist_0_1_sub"]/div/div[3]/div[2]/a/text()
これでDisc1の1曲目の作詞情報を表します。前の数字からDiscNumber,TracNumber,作詞or作曲or編曲ですね。最後の数字は弄らないでください。
では実際にコードを書いてみましょう。使用するライブラリはlxml(スクレイピング)とurllib(ネット周り)とmutagen(楽曲タグ関連)です。

tagget.py
om mutagen.flac import FLAC
from urllib import request
import requests
from lxml import html
import os
import requests
import json

class Net():
    def Tower(self, no, html2, disc, item):
        content = list()
        if item=="W": #作詞作曲編曲のどれかを判断して適切な数字をいれます
            i = "3"
        elif item=="C":
            i = "4"
        elif item=="A":
            i = "5"
        contentr = html2.xpath('//*[@id="RelationArtist_'+str(disc)+'_'+str(no)+'_sub"]/div/div['+i+']/div[2]/a/text()') #場所を指定

        try:
            content.append(contentr[0].strip('\'').strip()) #スマートじゃないですが複数の値が入ってた場合に対応します
            content.append(contentr[1].strip('\'').strip()) #forかWhileを使おうね!
            content.append(contentr[2].strip('\'').strip())
            content.append(contentr[3].strip('\'').strip())
        except IndexError:
            print(content) #値が入らなくなったらErrorを出してどういうタグを取得したのか出力させます
        return content

class Main():
    def Towerget(self,files,url):
        n = Net()
        r = requests.get(url) #ページを読み込む
        html2 = html.fromstring(r.content) #ページをパースにかける
        for f in files:
            tag = FLAC(f) #タグを読み込んでます
            no = tag['tracknumber'][0].lstrip("0") #僕は1桁のDiscNumberを0xと入力してるのでタワレコにあわせて整形
            disc = int(tag['discnumber'][0].lstrip("0")) - 1 #discを表す数字は0からスタートなので調整します
            print(no)
            tag['word'] = n.Tower(no, html2, disc, item="W") #作詞タグ入力
            tag['composer'] = n.Tower(no, html2, disc, item='C') #作曲タグ入力
            tag['arranger'] = n.Tower(no, html2, disc, item="A") #編曲タグ入力
            tag.pprint() 
            tag.save() #タグを保存

os.chdir("E:\music\未整理\打首獄門同好会 - 獄至十五") #タグ付けするファイルのファイルパスです
files0 = os.listdir(os.getcwd()) #フォルダのファイル一覧を収得
files = list()

for f in files0: #同じファイルにGoogleDriveの管理ファイルやジャケット写真等が入ってたりするのでflacだけ取り出す
    if f.endswith(".flac"):
        files.append(f)
        print(f)
    else:
        print("not "+f)

m = Main()
url = "https://tower.jp/item/4936516/獄至十五" #タワレコのページのURLです
m.Towerget(files, url)

あんまりキレイなコードではありませんがこれで一応収得できます。

改善点

・Overtureなど歌なしで作詞の設定がない曲はズレる。
・タワレコが編曲を入力していない事がある。
・タワレコのページのURLも自動収得したいなぁ(これは難しそう)。