본문 바로가기

개인프로젝트

[Python]멜론 노래 가사 추출하기(3)_셀레니움으로 노래가사 찾기 with 캐글

저번 시간에는 셀레니움이 어떻게 동작하는지에 관해 알아보았다.

 

이번 시간에는 저번시간의 내용들을 바탕으로 실제로 노래가사를 추출하는 작업을 해보도록 하겠다.

 

먼저 셀레니움은 사람이 직접 웹사이트에 들어가 동작하는 것과 비슷하게 동작한다고 보면된다.

 

우리가 멜론사이트에서 멜론차트에 있는 곡들의 가사를 보려면

멜론사이트접속->멜론차트->곡정보->가사보기 의 과정을 통해서 가사를 직접 봐야한다.

우리는 이 작업들을 셀레니움으로 구현해보려고 한다.

 

1.접속할 웹드라이버 만들기

웹드라이버를 만드는 작업은 다음 글에 자세하게 설명되어있으니 참고바란다.

https://all4null.tistory.com/22

 

[Python]멜론 노래 가사 추출하기(1)_크롤링준비하기 with 캐글

대부분의 스트리밍사이트에서는 노래가사가 복사가 되지 않는 문제가 있다. 노래가사들을 가지고 어떤 내용의 가사가 많은지 분석하고 싶어서 방법을 이리저리 찾아보던와중 크롤링이라는 좋

all4null.tistory.com

 

##콘솔에서 실행가능한 작업들
#최신화작업
!apt-get update

#크롬설치
%%bash
wget http://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_94.0.4606.71-1_amd64.deb
dpkg -i google-chrome-stable_94.0.4606.71-1_amd64.deb; apt-get -fy install

#크롬드라이버,셀레니움,웹드라이버매니저설치
!pip install chromedriver-py==94.0.4606.41
!pip install selenium
!pip install webdriver-manager


##파이썬 코드 상에서 실행 가능한 작업들

#크롤링을 해줄 크롤러 만들기
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--single-process")
chrome_options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)


#맞는 버전의 크롬과 크롬드라이버를 깔아주었기에 이렇게 실행해도 정상적으로 실행이 된다.
#driver = webdriver.Chrome(options=chrome_options)

2. 멜론사이트 접속하기

driver이란 이름을 가진 웹드라이버를 만들었으니 이제 이 웹드라이버를 이용해서 웹사이트에 접속 해야한다.

접속은 다음과 같은 코드로 가능하다.

 

driver.get("https://www.melon.com")

3. 멜론차트로 접속하기

멜론사이트에 접속을 했으니 이제 차트로 들어가야하는데, 차트의 경우 아래와 같은 메뉴를 클릭해야하므로

'멜론 차트' 에 해당하는 요소를 찾고 그 요소를 클릭해주는 작업을 해주면 된다.

 

이때, 주의해야할 점이 요소가 위 상황과 같이 복합 클래스 이름을 사용 중일 때 

CLASS_NAME 으로 요소를 찾으려고 CLASS 이름을 그대로 복사할 경우, 

제대로 동작하지 않는데, 이는 셀레니움의 By.CLASS_NAME은 복합 클래스 이름을 허용하지 않기 때문이다.

*(복합 클래스 이름은 위 상황처럼 클래스 2개 이상이 띄어쓰기로 나타내진 이름 형태를 의미)

 

제대로 동작하게 하려면 CSS_SELECTOR으로 찾거나(.a.b.c 형태로 a,b,c 클래스 모두를 가진 요소 찾기)

굳이 By.CLASS_NAME으로 찾고자하면 a.b.c 로 찾아주면 된다.

 

from selenium.webdriver.common.by import By

driver.find_element(By.CSS_SELECTOR, ".menu_bg.menu01").click()

#CLASS_NAME으로 찾을 수도 있다 다만, 다중클래스이므로 검색 값을 a.b 이런 식으로 해줘야한다.
#driver.find_element(By.CLASS_NAME, "menu_bg.menu01").click()

4. 멜론차트의 곡정보 누르기

멜론 차트에 접속을 했으니 이제 곡정보로 들어가야하는데, 곡정보의 경우 아래와 같은 곡정보 버튼을 클릭해야하므로

'곡정보 더보기 버튼' 에 해당하는 요소를 찾고 그 요소를 클릭해주는 작업을 해주면 된다.

 

 

driver.find_elements(By.CSS_SELECTOR,".btn.button_icons.type03.song_info")

5. 가사 펼치기

가사를 전부 보려면 아래의 펼치기 버튼을 눌러야하므로

셀레니움으로는 펼치기 버튼 요소를 찾고 클릭해주면 된다.

 

 

#가사 펼치기 버튼 클릭
driver.find_element(By.CSS_SELECTOR,".button_more.arrow_d").click()

6. 가사 가져오기

그럼 이제 가사를 볼 수 있다. 가사는 아래의 요소(div#d_video_summary.lyric.on)에 담겨져 있으므로 해당요소를 가져오면된다. 

 

 

lyric = driver.find_element(By.CSS_SELECTOR,"div#d_video_summary.lyric.on")

#ID는 고유한 값이므로 ID로도 요소를 찾을 수 있다.
#lyric = driver.find_element(By.ID,"d_video_summary")

#이런식으로 찾을 수 있기도 하지만 상위 선택자가 다른 경우 원치않는 값이 나올 수 있다.
#lyric = driver.find_element(By.CSS_SELECTOR,".lyric.on")
#lyric = driver.find_element(By.CLASS_NAME,"lyric.on")

print(lyric.text)

 

잘 실행됨을 확인할 수 있다.

7. 코드 정리하기

 

이때까지의 코드를 한번에 정리하면 이렇게 나타낼 수 있다.

 

##콘솔에서 실행가능한 작업들
#최신화작업
!apt-get update

#크롬설치
%%bash
wget http://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_94.0.4606.71-1_amd64.deb
dpkg -i google-chrome-stable_94.0.4606.71-1_amd64.deb; apt-get -fy install

#크롬드라이버,셀레니움,웹드라이버매니저설치
!pip install chromedriver-py==94.0.4606.41
!pip install selenium
!pip install webdriver-manager


##파이썬 코드 상에서 실행 가능한 작업들

#크롤링을 해줄 크롤러 만들기
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--single-process")
chrome_options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)


#맞는 버전의 크롬과 크롬드라이버를 깔아주었기에 이렇게 실행해도 정상적으로 실행이 된다.
#driver = webdriver.Chrome(options=chrome_options)

#1.멜론사이트 접속#
driver.get("https://www.melon.com")

#2.멜론 차트 들어가기#
from selenium.webdriver.common.by import By
driver.find_element(By.CSS_SELECTOR, ".menu_bg.menu01").click()
#CLASS_NAME으로 찾을 수도 있다 다만, 다중클래스이므로 검색 값을 a.b 이런 식으로 해줘야한다.
#driver.find_element(By.CLASS_NAME, "menu_bg.menu01").click()

#3.멜론 차트의 곡 정보 버튼 클릭하기#
driver.find_elements(By.CSS_SELECTOR,".btn.button_icons.type03.song_info")

#4.가사 펼치기 버튼 클릭#
driver.find_element(By.CSS_SELECTOR,".button_more.arrow_d").click()

#5.가사 가져오기#
lyric = driver.find_element(By.CSS_SELECTOR,"div#d_video_summary.lyric.on")

#ID는 고유한 값이므로 ID로도 요소를 찾을 수 있다.
#lyric = driver.find_element(By.ID,"d_video_summary")

#이런식으로 찾을 수 있기도 하지만 상위 선택자가 다른 경우 원치않는 값이 나올 수 있다.
#lyric = driver.find_element(By.CSS_SELECTOR,".lyric.on")
#lyric = driver.find_element(By.CLASS_NAME,"lyric.on")

print(lyric.text)

 

참조

https://padahkim.tistory.com/34

 

CSS 다중선택자와 클래스이름여러개

1. 여러 요소를 동시에 선택하여 적용. .a, .b, .c{} 이런 식으로 쉼표가 있을 때는 각각의 항목을 or로 적용한다. 즉 나열한 모든 클래스 혹은 id, 태그에 적용되고, 각 클래스는 따로 사용이 가능하

padahkim.tistory.com

 

https://devqa.io/selenium-css-selectors/

 

Selenium CSS Selectors Examples

Locating elements by CSS selectors is the preferred way as it is faster and more readable than XPath.This tutorial provides examples of how to loca...

devqa.io