Column

コラム

  • 【API・データ検証奮闘記】#3.音楽系データシリーズ 3部...

【API・データ検証奮闘記】#3.音楽系データシリーズ 3部作 第1部:Spotify

本コラムでは、APIやデータに関連する言語などを無邪気に触ってみた備忘録として、ライトに記載していきます!(連載記事はこちら
「ちょっと違くない」「他にいい方法あるのに」といったご意見もあるかと思いますが、何卒お手柔らかに!!

<プロフィール>
富松 良介
2017年、株式会社サイバー・コミュニケーションズ(CCI)入社。Oracle Bluekai・Treasure Data等のDMPや、AWS・GCP等のPublicCloud領域を担務。2019年6月よりデータの利活用を推進するコンサルティング会社「株式会社DataCurrent」に出向し、事業会社の基盤構築・運用や自社ソリューション開発を担当。

※音楽系データシリーズ 3部作 他記事はこちら
第2部:AppleMusic 編
第3部:YouTube 編

●Spotifyランキング取得やってみた

ボス
ボス
Spotifyのランキングデータが欲しい。
モブ
モブ
かしこまり!!

Spotifyのデータ取得の手順から取得した結果までをご紹介致します。

対象 Spotify ランキング
URL: https://spotifycharts.com/regional/jp/daily/latest

ステップ1. どうやって取得できるか調査してみた

モブ1
モブ1
API!!
モブ2
モブ2
スクレイピング!!
モブ3
モブ3
ツール!!
モブ
モブ
WebページのCSVをPythonで取得することにしよう!!
ボス
ボス
それでやってくれ。

●ステップ2. データ取得してみた

早速Pythonでデータを取得してみる。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from io import StringIO
import pandas as pd
import requests
import itertools
import datetime as datetime
from time import sleep
def get_charts_data(datelist):
result_charts_list = []
for charts_date in datelist:
endpoint_url = "https://spotifycharts.com/regional/jp/daily/"+ str(charts_date) + "/download"
sleep(0.5)
try:
res = requests.get(endpoint_url, timeout=(1800.0, 180.5))
except:
raise
if res.status_code == 200:
str_content=str(res.content,'utf-8')
data = StringIO(str_content)
df=pd.read_csv(data,header=1)
rename_df = df.rename(
columns={
'Position': 'position',
'Track Name': 'track_name',
'Artist': 'artist',
'Streams': 'streams',
'URL': 'url'
})
rename_df["date"] = str(charts_date)
result_charts_list.append(rename_df.values.tolist())
return result_charts_list
def main():
START_DATE = "2016-12-31"
END_DATE = "2020-11-05"
date_from = datetime.datetime.strptime(START_DATE,'%Y-%m-%d')
date_to = datetime.datetime.strptime(END_DATE,'%Y-%m-%d')
datelist = []
while (date_from-date_to)!=datetime.timedelta(days=0):
date_from = date_from + datetime.timedelta(days=1)
datelist.append(date_from.strftime('%Y-%m-%d'))
charts_list = get_charts_data(datelist)
result_df = pd.DataFrame(list(itertools.chain.from_iterable(charts_list)), index=None,columns=['position','track_name','artist','streams','url','date'])
if __name__ == '__main__':
main()
from io import StringIO import pandas as pd import requests import itertools import datetime as datetime from time import sleep def get_charts_data(datelist): result_charts_list = [] for charts_date in datelist: endpoint_url = "https://spotifycharts.com/regional/jp/daily/"+ str(charts_date) + "/download" sleep(0.5) try: res = requests.get(endpoint_url, timeout=(1800.0, 180.5)) except: raise if res.status_code == 200: str_content=str(res.content,'utf-8') data = StringIO(str_content) df=pd.read_csv(data,header=1) rename_df = df.rename( columns={ 'Position': 'position', 'Track Name': 'track_name', 'Artist': 'artist', 'Streams': 'streams', 'URL': 'url' }) rename_df["date"] = str(charts_date) result_charts_list.append(rename_df.values.tolist()) return result_charts_list def main(): START_DATE = "2016-12-31" END_DATE = "2020-11-05" date_from = datetime.datetime.strptime(START_DATE,'%Y-%m-%d') date_to = datetime.datetime.strptime(END_DATE,'%Y-%m-%d') datelist = [] while (date_from-date_to)!=datetime.timedelta(days=0): date_from = date_from + datetime.timedelta(days=1) datelist.append(date_from.strftime('%Y-%m-%d')) charts_list = get_charts_data(datelist) result_df = pd.DataFrame(list(itertools.chain.from_iterable(charts_list)), index=None,columns=['position','track_name','artist','streams','url','date']) if __name__ == '__main__': main()
from io import StringIO
import pandas as pd
import requests
import itertools
import datetime as datetime
from time import sleep

def get_charts_data(datelist):
  result_charts_list = []

  for charts_date in datelist:
    endpoint_url = "https://spotifycharts.com/regional/jp/daily/"+ str(charts_date) + "/download"

    sleep(0.5)
    try:
      res = requests.get(endpoint_url, timeout=(1800.0, 180.5))
    except:
      raise
    if res.status_code == 200:
      str_content=str(res.content,'utf-8')
      data = StringIO(str_content) 

      df=pd.read_csv(data,header=1)
      rename_df = df.rename(
          columns={
              'Position': 'position', 
              'Track Name': 'track_name', 
              'Artist': 'artist', 
              'Streams': 'streams', 
              'URL': 'url'
              })
      rename_df["date"] = str(charts_date)
      result_charts_list.append(rename_df.values.tolist())
  return result_charts_list

def main():
  START_DATE = "2016-12-31"
  END_DATE = "2020-11-05"

  date_from = datetime.datetime.strptime(START_DATE,'%Y-%m-%d')
  date_to = datetime.datetime.strptime(END_DATE,'%Y-%m-%d')
  datelist = []

  while (date_from-date_to)!=datetime.timedelta(days=0):
    date_from = date_from + datetime.timedelta(days=1)
    datelist.append(date_from.strftime('%Y-%m-%d'))
  charts_list = get_charts_data(datelist)
  result_df = pd.DataFrame(list(itertools.chain.from_iterable(charts_list)), index=None,columns=['position','track_name','artist','streams','url','date'])

if __name__ == '__main__':
    main()

ステップ3. 取得結果

※音楽系データシリーズ 3部作 他記事はこちら
第2部:AppleMusic 編
第3部:YouTube 編

最後に

弊社では、定点的なリサーチやトレンドの分析をおこなっています。性別や年代等の属性を検索トレンドのダッシュボード提供等様々なパッケージをご用意しておりますので、お気軽にお問い合わせください。

本データに関するお問い合わせは下記にて承ります。
株式会社DataCurrent
info@datacurrent.co.jp

人気のコラムランキング

PICK UP

企業のDX推進におけるダッシュボード内製化について

DXmarketingPICK UP コラムダッシュボード内製化

企業のDX推進に向けた人材教育支援について

GA4marketingPICK UP コラム内製化

【データプライバシーコラム】電気通信事業法改正の解説(2022年7月時点)

CMPPICK UP コラムデータプライバシーデータプライバシーコラム個人情報保護

CMP導入時の注意点

CMPPICK UP コラムデータプライバシーデータプライバシーコラム個人情報保護