Notice
Recent Posts
Recent Comments
Link
«   2026/09   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

왕초보 괴발자

파이썬 셀레니움으로 멜론 가사 크롤링, 스크래핑 하기 본문

데이터

파이썬 셀레니움으로 멜론 가사 크롤링, 스크래핑 하기

왕초보괴발자 2024. 3. 27. 16:24

1. 이걸 할 거에요

1) 멜론 차트 HOT 100의 음원 정보 일부를 크롤링해요.

	순위	곡ID	곡명	가수	앨범	좋아요
0	1	37138469	나는 아픈 건 딱 질색이니까	(여자)아이들	2	88,969
1	2	37140709	첫 만남은 계획대로 되지 않아	TWS (투어스)	TWS 1st Mini Album ‘Sparkling Blue’	98,596
2	3	37194943	밤양갱	비비 (BIBI)	밤양갱	122,026
3	4	37225604	EASY	LE SSERAFIM (르세라핌)	EASY	60,727
4	5	37145732	Love wins all	아이유	The Winning	150,340

 

2) 크롤링한 음원의 가사를 스크래핑해요.

순위	곡ID	곡명	가수	앨범	좋아요	가사
0	1	37138469	나는 아픈 건 딱 질색이니까	(여자)아이들	2	89,083	오늘도 아침엔 입에 빵을 물고 똑같이 하루를 시작하고 온종일 한 손엔 아이스 아메리카노 피곤해 죽겠네 지하철 속 이 장면 어제 꿈에서 봤나 아참 매일이지 지나치고 바쁜 이 삶에 그냥 흔한 날에 그 애를 보고 말야 평온했던 하늘이 무너지고 어둡던 눈앞이 붉어지며 뭔가 잊고 온 게 있는 것 같아 괜히 이상하게 막 울 것만 같고 그냥 지나치는 게 나을 것 같아 나는 생각은 딱 질색이니까 카페인으로 잡은 정신은 빠졌고 하루 종일 신경 쓰여 토할 것 같아 저녁이 돼도 배고픔까지 까먹고 그치 이상하지 근데 말야 있잖아 처음 본 순간 뭐라 할까 그립달까 나도 웃긴데 말야 평온했던 하늘이 무너지고 어둡던 눈앞이 붉어지며 뭔가 잊고 온 게 있는 것 같아 괜히 이상하게 막 울 것만 같고 그냥 지나치는 게 나을 것 같아 나는 생각은 딱 질색이니까 오랫동안 나를 아는 슬픈 표정을 하고 Oh 흔적 없는 기억 밖 혹 과거에 미래에 딴 차원에 세계에 1 2 3 4 5 6 7 8 평온했던 하늘이 무너지고 어둡던 눈앞이 붉어져도 다시 놓쳐버리는 것만 같아 괜히 이상하게 막 울 것만 같고 그냥 지나치는 게 나을 것 같아 나는 생각은 딱 질색이니까 아냐 지나치는 게 나을 것 같아 나는 아픈 건 딱 질색이니까
1	2	37140709	첫 만남은 계획대로 되지 않아	TWS (투어스)	TWS 1st Mini Album ‘Sparkling Blue’	98,658	Ay ay ay ay ay 거울 속에 내 표정 봐 봐 느낌 So good 기다려온 D-day 연습했던 손든 인사도 그대로 하면 돼 Hairstyle check하고 한 번 Turn around 발걸음은 매일 걷던 그 길로 계획은 완벽 빨리 말 걸어보고 싶어, Hey Woo 문 앞에서 셋을 세어본다, Yeh (셋, 둘, 하나) 첫 만남은 너무 어려워 계획대로 되는 게 없어서 첫 만남은 너무 어려워 내 이름은 말야 Hey, 안녕, 첫 마디를 건넬 때 주변 소린 Canceled 네 말소리는 Playlist Yeh, 질문은 나의 용기, 알려줘 너의 “이름이 뭐야?” 너와 내 거리는 세 걸음 남았어, Yeh (셋, 둘, 하나) 첫 만남은 너무 어려워 계획대로 되는 게 없어서 첫 만남은 너무 어려워 내 이름은 말야 이 순간, Feels so wonderful 조금은 뚝딱거려도 어색한 인사까지도 너와 나의 첫 만남 우리의 사이 Beautiful 내일도 내일모레도 기억해, 영원히 반짝일 순간 Wait wait! Na na na- 이렇게 만나서 반가워 내일 또 봐 안녕

 

2. 순서에요

1) 셀레니움이 설치된 상태여야해요. 크롬 드라이버 설정도 미리 준비해요.

2) 사이트에서 추출할 태그와 클래스를 개발자도구(F12)에서 찾아요.

3) 필요한 정보를 크롤링해요.

4) 곡ID의 노래 가사를 스크래핑해요.

 

3. 이렇게 해요

1) 라이브러리를 불러와요.

import pandas as pd 
from selenium import webdriver
from bs4 import BeautifulSoup as bs 
import requests
from fake_useragent import UserAgent # HTTP에 접근할 랜덤 사용자를 생성해줘요.
pd.set_option('display.max_colwidth', None) # 데이터프레임의 정보가 ...로 생략되지 않게 해줘요.

 

2) 크롤링할 페이지를 열어요.

url = 'https://www.melon.com/chart/hot100/index.htm' # 원하는 사이트의 주소를 입력해요.
chrome_path = 'C:/Users/왕괴발/.wdm/drivers/chromedriver/win64/118.0.5993.89/chromedriver.exe'
		# 본인이 셀레니움을 설치하고 준비하면서 다운받았던 크롬 드라이버의 경로를 입력해요.
        
options = webdriver.ChromeOptions()
options.add_argument(f'--executable-path={chrome_path}')
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(10) # 페이지에서 요소를 찾을 때까지 최대 10초를 대기해 오류를 방지해요.

driver.get(url) # 새로 열린 크롬창은 건들지 않아도 돼요.

 

3) 개발자 도구에서 필요한 요소들을 찾을거에요.

html = driver.page_source
soup = bs(html, 'html.parser')
song_soup = soup.select('tbody > tr') # tbody 태그에 곡정보가 있다는 것을 알 수 있어요.
song_lst = [] # 비어있는 리스트를 하나 만들어요.

for song in song_soup:
    song_title = song.find('div', class_= 'ellipsis rank01').get_text()
    song_no = song.find('div', class_='ellipsis rank01').find('a')['href'].split("'")[2]
    song_artist = song.find('span', class_= 'checkEllipsis').get_text()
    song_album = song.find('div', class_= 'ellipsis rank03').get_text()
    song_likes = song.find('button', class_ = 'button_etc like').get_text()

# 추출한 요소들을 리스트에 추가할 거에요.
    song_lst.append([song_no,
                     song_title.replace('\n', ''),
                     song_artist.replace('\n', ''),
                     song_album.replace('\n', ''),
                     song_likes.replace('\n', '').replace('좋아요총건수', '')])

 

4) 열려있는 셀레니움 크롬창을 닫고, 추출한 요소로 데이터프레임을 만들어요.

driver.quit()

# 추출한 요소들의 컬럼명을 만들어줘요.
df = pd.DataFrame(song_lst, columns = ['곡ID', '곡명', '가수', '앨범', '좋아요'])

df['곡ID'] = df['곡ID'].str.extract(r'(\d+)') # 곡ID의 숫자만 추출해요. 가사 검색할 때 필요해요.
df['순위'] = range(1, len(df) + 1) # 위에서 크롤링하지 못했던 순위를 추가해줘요. 
df = df[['순위', '곡ID','곡명', '가수', '앨범', '좋아요']] # '순위'컬럼을 앞으로 보내줄거에요.
df.head()

  - 다음과 같은 양식으로 데이터프레임이 출력될 거에요. (맨 앞에 0부터 시작하는 번호는 순위가 아니라 index번호에요.)

순위	곡ID	곡명	가수	앨범	좋아요
0	1	37138469	나는 아픈 건 딱 질색이니까	(여자)아이들	2	88,969
1	2	37140709	첫 만남은 계획대로 되지 않아	TWS (투어스)	TWS 1st Mini Album ‘Sparkling Blue’	98,596
2	3	37194943	밤양갱	비비 (BIBI)	밤양갱	122,026
3	4	37225604	EASY	LE SSERAFIM (르세라핌)	EASY	60,727
4	5	37145732	Love wins all	아이유	The Winning	150,340

 

5) 곡ID로 가사를 추출해봐요!

# 가사를 추출하는 함수를 정의해요.
def get_lyrics(song_id):
    headers = {"user-agent": UserAgent().chrome}
    url = f"https://www.melon.com/song/detail.htm?songId={song_id}"
    res = requests.get(url, headers=headers)
    
    if res.status_code == 200:
        soup = bs(res.text, 'html.parser')
        lyrics_tag = soup.find('div', class_='lyric')
        
        if lyrics_tag:
            lyrics = lyrics_tag.get_text(separator=' ', strip=True) # 추출된 가사 앞뒤에 있는 "\t\t\t\t\t\t\t"를 제거해줘요.
            return lyrics

    return None
df2 = pd.DataFrame(df)
df2['가사'] = df2['곡ID'].apply(get_lyrics) # 추출한 가사를 '가사' 컬럼에 추가해요.
df2.head(2)

 

 - 이런 결과가 나와요.

순위	곡ID	곡명	가수	앨범	좋아요	가사
0	1	37138469	나는 아픈 건 딱 질색이니까	(여자)아이들	2	89,083	오늘도 아침엔 입에 빵을 물고 똑같이 하루를 시작하고 온종일 한 손엔 아이스 아메리카노 피곤해 죽겠네 지하철 속 이 장면 어제 꿈에서 봤나 아참 매일이지 지나치고 바쁜 이 삶에 그냥 흔한 날에 그 애를 보고 말야 평온했던 하늘이 무너지고 어둡던 눈앞이 붉어지며 뭔가 잊고 온 게 있는 것 같아 괜히 이상하게 막 울 것만 같고 그냥 지나치는 게 나을 것 같아 나는 생각은 딱 질색이니까 카페인으로 잡은 정신은 빠졌고 하루 종일 신경 쓰여 토할 것 같아 저녁이 돼도 배고픔까지 까먹고 그치 이상하지 근데 말야 있잖아 처음 본 순간 뭐라 할까 그립달까 나도 웃긴데 말야 평온했던 하늘이 무너지고 어둡던 눈앞이 붉어지며 뭔가 잊고 온 게 있는 것 같아 괜히 이상하게 막 울 것만 같고 그냥 지나치는 게 나을 것 같아 나는 생각은 딱 질색이니까 오랫동안 나를 아는 슬픈 표정을 하고 Oh 흔적 없는 기억 밖 혹 과거에 미래에 딴 차원에 세계에 1 2 3 4 5 6 7 8 평온했던 하늘이 무너지고 어둡던 눈앞이 붉어져도 다시 놓쳐버리는 것만 같아 괜히 이상하게 막 울 것만 같고 그냥 지나치는 게 나을 것 같아 나는 생각은 딱 질색이니까 아냐 지나치는 게 나을 것 같아 나는 아픈 건 딱 질색이니까
1	2	37140709	첫 만남은 계획대로 되지 않아	TWS (투어스)	TWS 1st Mini Album ‘Sparkling Blue’	98,658	Ay ay ay ay ay 거울 속에 내 표정 봐 봐 느낌 So good 기다려온 D-day 연습했던 손든 인사도 그대로 하면 돼 Hairstyle check하고 한 번 Turn around 발걸음은 매일 걷던 그 길로 계획은 완벽 빨리 말 걸어보고 싶어, Hey Woo 문 앞에서 셋을 세어본다, Yeh (셋, 둘, 하나) 첫 만남은 너무 어려워 계획대로 되는 게 없어서 첫 만남은 너무 어려워 내 이름은 말야 Hey, 안녕, 첫 마디를 건넬 때 주변 소린 Canceled 네 말소리는 Playlist Yeh, 질문은 나의 용기, 알려줘 너의 “이름이 뭐야?” 너와 내 거리는 세 걸음 남았어, Yeh (셋, 둘, 하나) 첫 만남은 너무 어려워 계획대로 되는 게 없어서 첫 만남은 너무 어려워 내 이름은 말야 이 순간, Feels so wonderful 조금은 뚝딱거려도 어색한 인사까지도 너와 나의 첫 만남 우리의 사이 Beautiful 내일도 내일모레도 기억해, 영원히 반짝일 순간 Wait wait! Na na na- 이렇게 만나서 반가워 내일 또 봐 안녕

 

6) 필요하다면 csv파일로 저장도 해요.

df2.to_csv("가사.csv", encoding="utf-8-sig")

 

4. 주의해요

 - 스크래핑을 너무 자주 시도하면 사이트에서 접속을 차단할 수 있어요. 그럴 때는 조금 기다렸다가 다시 해봐요.

 

5. 코드 파일 경로에요

https://github.com/YOOHYUNJUNE/selenium_scraping/blob/master/selenium_scraping.ipynb

 

selenium_scraping/selenium_scraping.ipynb at master · YOOHYUNJUNE/selenium_scraping

Contribute to YOOHYUNJUNE/selenium_scraping development by creating an account on GitHub.

github.com

 

'데이터' 카테고리의 다른 글

파이썬에서 스파크로 타이타닉 데이터 다뤄보기  (2) 2024.04.03