본문 바로가기
R 주제/크롤링

[R 크롤링] 7. 멜론차트에서 가수 이름도 출력

by 만다린망고 2021. 3. 24.
반응형

 

 

4강에서 멜론 차트의 순위권에 있는 노래 제목을 크롤링해봤습니다. 오늘은 가수 이름도 함께 출력하는 방법을 알아봅시다. 4강에서 사용한 코드는 아래와 같습니다.

 

#라이브러리 불러오기
library(httr)
library(rvest)

#GET 함수로 서버에 정보 요청하기
url = 'https://www.melon.com/chart/'
get_url = GET(url)

#read_html 수로 html 코드 읽기
my_html=read_html(get_url,encoding='utf-8')

#ellipsis rank01 클래스만 추출
pick1=html_nodes(my_html,'.ellipsis.rank01')

#a 태그만 추출
pick2=html_nodes(pick1,'a')

#텍스트 추출
pick3=html_text(pick2,trim=TRUE)

#top10순위
print(pick3[1:10])

 

아래와 같이 변수 이름을 수정해줍시다.

 

#라이브러리 불러오기
library(httr)
library(rvest)

#GET 함수로 서버에 정보 요청하기
url = 'https://www.melon.com/chart/'
get_url = GET(url)

#read_html 수로 html 코드 읽기
my_html=read_html(get_url,encoding='utf-8')

#ellipsis rank01 클래스만 추출
song_name_p1=html_nodes(my_html,'.ellipsis.rank01')

#a 태그만 추출
song_name_p2=html_nodes(song_name_p1,'a')

#텍스트 추출
song_name_p3=html_text(song_name_p2,trim=TRUE)

#top10순위
print(song_name_p3[1:10])

 

 

아래는 출력결과입니다.

 

> print(pick3[1:10])
 [1] "바라만 본다"                           
 [2] "나를 아는 사람"                        
 [3] "Next Level"                            
 [4] "Butter"                                
 [5] "헤픈 우연"                             
 [6] "치맛바람 (Chi Mat Ba Ram)"             
 [7] "Dun Dun Dance"                         
 [8] "Peaches (Feat. Daniel Caesar & Giveon)"
 [9] "롤린 (Rollin')"                        
[10] "Alcohol-Free"      

 

멜론차트에서 검색도구로 가수 이름의 위치를 찾아보면 div태그로 둘러싸여있고, 클래스는 ellipsis rank02 입니다.  문제는 div 태그 안에 이름이 두번 나온다는 것입니다. 따라서 class 이름이 checkEllipsis인 span 태그를 이용하겠습니다. 

 

 

아래와 같이 코드를 추가해줍시다. "#####가수이름 추가" 이후를 보시면 됩니다.

 

#라이브러리 불러오기
library(httr)
library(rvest)

#GET 함수로 서버에 정보 요청하기
url = 'https://www.melon.com/chart/'
get_url = GET(url)

#read_html 수로 html 코드 읽기
my_html=read_html(get_url,encoding='utf-8')

#ellipsis rank01 클래스만 추출
song_name_p1=html_nodes(my_html,'.ellipsis.rank01')

#a 태그만 추출
song_name_p2=html_nodes(song_name_p1,'a')

#텍스트 추출
song_name_p3=html_text(song_name_p2,trim=TRUE)

#top10순위
print(song_name_p3[1:10])

#############가수이름 추가

#checkEllipsis 클래스만 추출
singer_p1=html_nodes(my_html,'.checkEllipsis')

#a태그만 추출
singer_p2=html_nodes(singer_p1,'a')

#텍스트 추출
singer_p3=html_text(singer_p2,trim=TRUE)

 

결과를 실행해보면 한가지 문제를 발견할 수 있습니다. 

 

> head(pick3)
[1] "브레이브걸스" "아이유"       "로제 (ROSÉ)"  "양요섭"       "정은지"       "방탄소년단"  

 

양요섭과 정은지가 같은 노래의 가수인데 따로 출력된 것입니다. 

 

 

a 태그가 따로 분리되어 있어서 그렇습니다. 

 

 

a태그 추출을 없애고 바로 텍스트추출을 해봅시다. 

 

#라이브러리 불러오기
library(httr)
library(rvest)

#GET 함수로 서버에 정보 요청하기
url = 'https://www.melon.com/chart/'
get_url = GET(url)

#read_html 수로 html 코드 읽기
my_html=read_html(get_url,encoding='utf-8')

#ellipsis rank01 클래스만 추출
song_name_p1=html_nodes(my_html,'.ellipsis.rank01')

#a 태그만 추출
song_name_p2=html_nodes(song_name_p1,'a')

#텍스트 추출
song_name_p3=html_text(song_name_p2,trim=TRUE)

#top10순위
print(song_name_p3[1:10])

#############가수이름 추가

#checkEllipsis 클래스만 추출
singer_p1=html_nodes(my_html,'.checkEllipsis')

#텍스트 추출
singer_p3=html_text(singer_p1,trim=TRUE)

 

두 가수가 하나의 문자열로 출력이 되는 것을 알 수 있습니다. 

 

> head(pick3)
[1] "브레이브걸스"   "아이유"         "로제 (ROSÉ)"    "양요섭, 정은지" "방탄소년단"     "경서"          

 

반응형

댓글