2019_1H Web/Python Programming
"계절에 따라 차트에 있는 음악의 장르 분포가 다를까?"를 알아보기 위한 프로젝트.
2018년도 지니뮤직(https://www.genie.co.kr/)의 월간 차트를 웹크롤링하여 장르 분포를 도표로 작성하였다.
전체 Code :
import requests
from bs4 import BeautifulSoup as BS
import pandas as pd
import matplotlib.pyplot as plt
titles=[]
artists=[]
genres=[]
results1=[]
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
for i in range(0,12):
if i<10:
day="0"+str(i+1)
else:
day=str(i+1)
ballad=0
rap_hiphop=0
dance=0
pop=0
RB=0
indi_music=0
electronica=0
OST=0
rock=0
el_se=0
for page in [1,2]:
req= requests.get('https://www.genie.co.kr/chart/top200?ditc=M&ymd=2018' + day + '01&hh=07&rtm=N&pg='+str(page), headers = headers)
html = BS(req.text, 'html.parser')
tr_list = html.select('#body-content > div.newest-list > div > table > tbody > tr')
for tr in tr_list:
rank = tr.find('td',{'class':'number'}).text
song = tr.get('songid')
title = tr.find('td',{'class':'info'}).find('a',{'class':'title ellipsis'}).text
artist = tr.find('td',{'class':'info'}).find('a',{'class':'artist ellipsis'}).text
req2 = requests.get('https://www.genie.co.kr/detail/songInfo?xgnm=' + song , headers = headers)
html2 = BS(req2.text, 'html.parser')
genre = html2.find('div',{'class':'song-main-infos'}).find('div',{'class':'info-zone'}).find('ul',{'class':'info-data'}).find_all('span',{'class':'value'})[2].text
if genre[:3] == '가요 ':
if genre[5:] == '발라드':
ballad += 1
elif genre[5:] == 'R&B/소울':
RB += 1
elif genre[5:] == '인디':
indi_music += 1
elif genre[5:] == '댄스':
dance += 1
elif genre[5:] == '랩/힙합':
rap_hiphop += 1
elif genre[5:] == '일렉트로니카':
electronica += 1
elif genre[5:] == '락':
rock += 1
else:
el_se +=1
elif genre[:3] == 'OST':
OST += 1
elif genre[:3] == 'POP':
if genre[6:] == '팝':
pop += 1
elif genre[6:] == '일렉트로니카':
electronica += 1
elif genre[6:] == '락':
rock += 1
else:
el_se +=1
else:
el_se +=1
sum_all=[ballad, rap_hiphop, dance, rock, pop, RB, indi_music, electronica, OST, el_se]
results1.append([ballad, rap_hiphop, dance, rock, pop, RB, indi_music, electronica, OST, el_se, sum(sum_all)])
data1=pd.DataFrame(results1)
data1.columns = ['발라드', '랩/힙합', '댄스', '락', '팝', 'R&B', '인디', '일렉트로니카', 'OST','그 외 장르', '합계']
data1.index = ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월']
data1
실행 화면 :

도표로는 분포를 눈으로 확인하기 어려우니 장르별 원형 차트로도 확인해보자.
발라드 Code:
ballads=[]
for k in range(0,12):
ballads.append(results1[k][0])
label=["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
plt.pie(ballads, labels=label)
plt.title('ballad', fontsize=20)
plt.show
실행 화면:

댄스 Code:
dances=[]
for k in range(0,12):
dances.append(results1[k][2])
label=["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
plt.pie(dances, labels=label)
plt.title('dance', fontsize=20)
plt.show
실행 화면:

확연히 겨울에 발라드의 비율이 높고 여름에 댄스곡의 비율이 높은 것을 확인할 수 있었다.
아쉬운 점:
1. 굉장히 원시적인 방법으로 코드를 작성하였음
처음 진행하는 프로젝트여서 그런지 코드를 융통성있게 작성하는 법을 아직 익히지 못한 것 같음
2. 여러 음악사이트를 시도해보았으나 가장 깔끔히 나오는 사이트가 지니였다.
멜론 -> 크롤링 실패. 아마 자바로 작성되었기 때문인듯함
엠넷 -> 성공하였으나, 2020년에 코드 확인 차 돌려보니 웹사이트가 사라짐..
'Data_Science' 카테고리의 다른 글
[Python] 2019-2H 질병 데이터 분석하기 Analyzing disease data (0) | 2020.08.23 |
---|