KoBERT를 통한 노래 가사 감정분석(1)-멜론 연도별 차트 노래가사 크롤링

JSK·2022년 12월 22일
0

개요

노래가사를 KoBERT를 이용해서 감정분석을 해보기 위해서 멜론에서 노래 가사를 크롤링하려하는데 대부분의 글들이 현재 Top100차트를 크롤링하는 내용이었습니다. 그런데 저는 100곡 이외에더 더 많은 곡을 분석해보고 싶어서 연도별 Top100 차트를 크롤링하려고 시도해보았습니다. 만약 저처럼 연도별 차트 가사 크롤링이 필요하신 분은 이 코드를 이용해보셔도 좋을 것 같습니다.

크롤링 해보기

준비물: 구글 크롬, 크롬드라이버, 파이썬, 귀찮음을 극복할 의지

순서

  1. 파이썬 프로젝트를 생성합니다.
  2. 크롬드라이버 다운로드에 들어가서 크롬드라이버를 다운받고 파이썬 프로젝트 폴더에 넣어줍니다.
  3. 파이썬에서 셀레니움을 설치해줍니다. (pip install elenium)
  4. 멜론 사이트에 들어가서 자신이 원하는 연도의 차트 페이지 주소를 가져옵니다.
    가져온 주소는 크롬을 실행하는 주소를 지정하는 driver.get을 통해서 시작페이지로 지정해줍니다.
    (제가 올린 소스 코드에서는 연도 부분을 비워놓고 반복문을 통해서 여러 연도를 한 번에 크롤링해옵니다.)
  5. 멜론 사이트에서 F12를 눌러 콘솔 창에 들어가서 각 노래의 번호를 알아내야 합니다. Elements에서 body 부분에서 찾을 수 있습니다.
    제가 색칠해놓은 data-song-no부분이 해당 노래의 번호입니다.
    멜론에서 노래 정보의 주소는 (melon.com/song/detail.htm?songid=노래번호)로 되어있기 때문에 각 노래들의 번호를 저장해놓은 뒤 저 주소에 노래 번호만 입력해주면 저장된 노래의 정보를 볼 수 있습니다.
    그리고 멜론에서는 차트에 100곡이 있으면 1위부터 50위까지 한 카테고리 51위부터 100위까지를 한 카테고리로 지정해놓았기 때문에 1위부터 50위까지의 차트를 저장하는 lst50, 51위부터 100위까지의 차트를 저장하는 lst100을 만들어줍니다.
  6. 차트에 있는 모든 곡들의 번호를 받아왔으면 그 번호를 이용해서 멜론의 노래 정보 페이지에 들어가서 가사와 곡 정보를 크롤링해옵니다.
    크롤링을 수행하는데는 craw_lyrics 함수를 사용합니다.
    곡 제목은 song_name, 가수명은 artist로 저장되어 있습니다.
    가사는 lyric으로 저장되어 있습니다.
    이제 필요한 정보들이 저장되어 있는 곳을 알아냈으니 필요한 정보들을 받아옵니다.
  7. 차트의 모든 노래들의 정보를 받아왔으면 크롤링한 내용을 csv파일로 출력합니다.

소스코드

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import chromedriver_autoinstaller
import subprocess
import time
import pandas as pd


def craw_lyrics():
    try:
        artist = driver.find_elements(By.CLASS_NAME, 'artist')
        song_name = driver.find_elements(By.CLASS_NAME, 'song_name')
        lyric = driver.find_elements(By.CLASS_NAME, 'lyric')
        driver.implicitly_wait(60)

        lyrics = lyric[0].text.split('\n')

        artists.append(artist[0].text)
        song_names.append(song_name[0].text)
        ly.append(lyrics)
    except:
        return


for year in range(2012, 2022):
    subprocess.Popen(r'C:\Program Files\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrometemp"') 

    option = Options()
    option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

    chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
    try:
        driver = webdriver.Chrome('/chromedriver.exe', options=option)
    except:
        chromedriver_autoinstaller.install(True)
        driver = webdriver.Chrome('/chromedriver.exe', options=option)
    driver.implicitly_wait(10)

    driver.get('https://www.melon.com/chart/age/index.htm?chartType=YE&chartGenre=KPOP&chartDate={y}'.format(y=year))
    time.sleep(2)
    song_num = []
    artists = []
    song_names = []
    ly = []

    lst50 = driver.find_elements(By.CSS_SELECTOR, "#lst50 > td:nth-child(5) > div > button")
    lst100 = driver.find_elements(By.CSS_SELECTOR, "#lst100 > td:nth-child(5) > div > button")

    for i in lst50:
        song_num.append(i.get_attribute('data-song-no'))

    for i in lst100:
        song_num.append(i.get_attribute('data-song-no'))

    for i in song_num:
        driver.get('https://www.melon.com/song/detail.htm?songId={song_num}'.format(song_num=i))
        craw_lyrics()

    df = pd.DataFrame(artists, columns=['artist'])
    df['song_name'] = song_names
    df['lyric'] = ly

    df.to_csv("song{y}.csv".format(y=year), index=False, encoding='utf-8')

ps. 다른 분들이 올리신 크롤링 코드들을 이리저리 수정해가면서 만든 코드라서 제가 이 코드에 대해서 제대로 이해하고 있는지도 모르겠네요. 그래도 대충 사용해볼 만은 할 거라고 생각 들어서 올렸으니 필요하신 분들은 사용해보시면 좋을 것 같습니다.

profile
학사지만 AI하고 싶어요...

0개의 댓글