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

[R 크롤링] 4. 크롤링 예제2 (멜론 차트 순위)

by 만다린망고 2020. 7. 27.
반응형

 

 

크롤링 두번째 예제입니다. 멜론 차트에서 top 10 곡 리스트를 가져오겠습니다.

 

멜론 사이트에 들어가서, 메뉴에 '차트'를 클릭합니다. URL을 복사하여 가져옵니다. 

 

https://www.melon.com/chart/index.htm

 

R의 GET 함수를 이용하여 서버에 정보를 요청합니다. 

 

library(httr)

library(rvest)

 

url = 'https://www.melon.com/chart/'

get_url = GET(url)

 

> get_url

Response [https://www.melon.com/chart/]

  Date: 2020-07-27 05:06

  Status: 200

  Content-Type: text/html;charset=utf-8

  Size: 386 kB

<!DOCTYPE html>

<html lang="ko">

 

인코딩 방식이 utf-8 입니다. read_html 함수를 이용하여 html 코드를 읽습니다. 

 

my_html=read_html(get_url,encoding='utf-8')

 

개발자 도구를 이용하여 1위 제목에 접근합시다. 

 

 

 

html 구조를 살펴봅시다. 노래 제목이 a태그로 감싸져 있습니다. 일단 a태그를 전부 가져와봅시다. 

 

pick1=html_nodes(my_html,'a')

 

> pick1

 

 [1] <a href="#gnb_menu">메뉴</a>

 [2] <a href="#id_box">마이영역</a>

 [3] <a href="#conts_section">본문</a>

 [4] <a href="#footer">하단 정보</a>

 [5] <a href="https://ticket.melon.com/main/index.htm" title="멜론 티켓" class="menu01 mlog" data="LOG_PRT_CODE=1&amp;MENU_PRT_CODE=0 ...

 

너무 많은 정보들이 불러져서 노래 제목만 추리기가 쉽지 않습니다. 다른 전략이 필요합니다. 구조를 한번도 봅시다. 

 

a 태그는 span 태그 하위에 있고, span 태그는 다시 div 태그 하위에 있습니다. div 태그에는 ellipsis rank01 이라는 클래스가 부여되어 있습니다. 클래스 이름을 이용하면 될 것 같네요. 

 

전략은 이렇습니다. 이름이 ellipsis rank01 인 클래스를 가진 태그를 전부 가져온 뒤, 다시 하위에 있는 a 태그를 가져오는 것입니다. 

 

클래스 이름으로 태그를 가져오는 방법은 아래와 같습니다. 

 

pick1=html_nodes(my_html,'.ellipsis.rank01')

 

클래스 이름으로 가져올 때는 앞에 마침표를 붙여주어야 합니다. 또 클래스 이름에 띄어쓰기가 있는 경우, 띄어쓰기 대신 마침표를 입력합니다. 

 

이어서 a태그만 추출합시다. 

 

pick2=html_nodes(pick1,'a')

 

> pick2

 

 [1] <a href="javascript:melon.play.playSong('19030101',32790516);" title="다시 여기 바닷가 재생">다시 여기 바닷가</a>

 [2] <a href="javascript:melon.play.playSong('19030101',32725013);" title="마리아 (Maria) 재생">마리아 (Maria)</a>

 [3] <a href="javascript:melon.play.playSong('19030101',32720013);" title="How You Like That 재생">How You Like That</a>

 [4] <a href="javascript:melon.play.playSong('19030101',32814383);" title="그 여름을 틀어줘 재생">그 여름을 틀어줘</a>

 [5] <a href="javascript:melon.play.playSong('19030101',32734372);" title="Summer Hate (Feat. 비) 재생">Summer Hate (Feat. 비)</a>

 [6] <a href="javascript:melon.play.playSong('19030101',32768945);" title="여름 안에서 by 싹쓰리 (Feat. 황광희) 재생">여름 안에서 by 싹쓰리 (Feat. 황광희 ...

 

 

곡 제목이 들어있는 a태그만 잘 추출되었습니다. 이제 a테그의 내용만 추출합시다. 

 

pick3=html_text(pick2)

 

> pick3

  [1] "\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t다시 여기 바닷가\n\t\t\t\t\t\t\t\t"                                    

  [2] "\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t마리아 (Maria)\n\t\t\t\t\t\t\t\t"             

 

결과가 지저분합니다. trim 옵션을 TRUE로 해주면 사라집니다.

 

pick3=html_text(pick2,trim=TRUE)

 

 

 

 

top10 순위는 인덱싱으로 가져오면됩니다. 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 클래스만 추출
pick1=html_nodes(my_html,'.ellipsis.rank01')

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

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

#top10순위

print(pick3[1:10])
반응형

댓글