[Python] 2019-1H 계절 별 음원 사이트(genie) 순위 분석 Analyze the ranking of music sites(genie) by season
본문 바로가기

Data_Science

[Python] 2019-1H 계절 별 음원 사이트(genie) 순위 분석 Analyze the ranking of music sites(genie) by season

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 실행 화면

 

 

 

도표로는 분포를 눈으로 확인하기 어려우니 장르별 원형 차트로도 확인해보자.

 

 

 

 

발라드 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년에 코드 확인 차 돌려보니 웹사이트가 사라짐..