크롤링 두번째 예제입니다. 멜론 차트에서 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&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])
'R 주제 > 크롤링' 카테고리의 다른 글
[R 크롤링] 6. 크롤링 예제3 (네이버 역대 영화 평점 순) (0) | 2020.07.31 |
---|---|
[R 크롤링] 5. html 추출 연속 적용하기 (0) | 2020.07.29 |
[R 크롤링] 3. 크롤링 예제1 (교보문고 주간 베스트셀러) (2) | 2020.07.27 |
[R 크롤링] 2. 웹페이지의 html 소스코드 보는 법 (0) | 2020.07.25 |
[R 크롤링] 1. R 크롤링을 어떻게 배울 것인가? (0) | 2020.07.25 |
댓글