ライブラリのインポート
import pandas as pd
from bs4 import BeautifulSoup
import requests
#使用サイト
Uta-Netのランキング『 https://www.uta-net.com/user/ranking/artist_betu.html』
右側のTOTALの方を使います。
スクレイピングに使う関数①〜⑤
①曲名リストを作成する関数
def song_title(url):
song_title_list = []
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
links = soup.find_all('td', class_='side td1')
for link in links:
title = link.find('a').text
song_title_list.append(title)
return song_title_list
②アーティストリストを作成する関数
def song_artist(url):
song_artist_list = []
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
links = soup.find_all('td', class_='td2')
for link in links:
artist = link.find('a').text
song_artist_list.append(artist)
return song_artist_list
③作詞家リストを作成する関数
def song_writer(url):
song_writer_list = []
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
links = soup.find_all('td', class_='td3')
for link in links:
writer = link.find('a').text
song_writer_list.append(writer)
return song_writer_list
④作曲家リストを作成する関数
def song_composer(url):
song_composer_list = []
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
links = soup.find_all('td', class_='td4')
for link in links:
composer = link.find('a').text
song_composer_list.append(composer)
return song_composer_list
⑤歌詞リストを作成する関数
ここの関数だけ他と異なっていて、各曲のURLに移動し、そこでスクレイピングを行っている。
def song_lyric(url):
'''
アーティストごとの歌詞リストを作成する関数
'''
song_lyric_list = []
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
links = soup.find_all('td', class_='side td1')
for link in links:
url = 'https://www.uta-net.com' + (link.a.get('href'))
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
lyric = soup.find('div', itemprop='text')
lyric = lyric.text
lyric = lyric.replace('\n','')
song_lyric = lyric.replace('\u3000','')
song_lyric_list.append(song_lyric)
return song_lyric_list
関数の作成はこれで全て完了。
いよいよここから、曲名、アーティスト、作詞家、作曲家、歌詞を取得し、リスト化していく。
人気ランキングからリストを作成
#人気ランキングのページのurl
url = 'https://www.uta-net.com/user/ranking/artist_betu.html'
人気アーティストの各々のurlリストを作成
backnumber、嵐、RADWIMPS、…、Acid Black Cherry
Top50のアーティストのURLをartist_ranking_urlに追加し、リストを作成。
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
soup = soup.find('tbody', id="ranking-table-body-total")
links = soup.find_all('ol',class_="ranking-ol-table")
links = links[0].find_all('a')
artist_ranking_url = []
for link in links:
url_1 = 'https://www.uta-net.com' + link.get('href')
artist_ranking_url.append(url_1)
曲名、アーティスト、作詞家、作曲家、歌詞のリストを作成
#曲名
song_title_list = []
for url in artist_ranking_url:
song_title_list.extend(song_title(url))
#アーティスト
song_artist_list = []
for url in artist_ranking_url:
song_artist_list.extend(song_artist(url))
#作詞家
song_writer_list = []
for url in artist_ranking_url:
song_writer_list.extend(song_writer(url))
#作曲家
song_composer_list = []
for url in artist_ranking_url:
song_composer_list.extend(song_composer(url))
#歌詞
song_lyric_list = []
for url in artist_ranking_url:
song_lyric_list.extend(song_lyric(url))
作成したリストを結合する
songs_data = pd.DataFrame({'title':song_title_list,
'artist':song_artist_list,
'writer':song_writer_list,
'composer':song_composer_list,
'lyric':song_lyric_list})
#あとがき
以上、 BeautifulSoup4とRequestsを使ったスクレイピングの練習でした。
短時間で大量のデータを取得できることから、スクレイピングの重要性を感じます。
再生数とかは取得できないので、もっと有意義なデータを取得するなら、音楽配信サービスのAPIが必要です。そのうち勉強します。