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

[R 크롤링] 3. 크롤링 예제1 (교보문고 주간 베스트셀러)

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

이번시간에는 크롤링예제를 하나 수행해봅시다. 교보문고 홈페이지에서 종합베스트셀러 제목을 가져오는 것입니다. 

 

교보문고 종삽주간베스트 페이지의 URL은 아래와 같습니다. 종합주간베스트 페이지는 교보문고 메인페이지에서 '베스트' 버튼을 클릭하면 접근이 가능합니다. 

 

 http://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?orderClick=d79 

 

먼저 위 URL에 있는 html 코드를 가져와야합니다. html 코드를 읽을 때, R에서는 두가지 함수가 사용됩니다. 

 

1) GET 함수를 이용하여 교보문고 서버에 내용 요청

2) read_html 함수를 이용하여 html 코드 읽음

 

서버에 url 내용을 요청하는 대표적인 방법에는 GET 방식과 POST 방식이 있습니다. 둘의 차이는 기본적인 크롤링에 익숙해진 이후에 설명드리겠습니다. 지금은 교보문고 예제가 GET 방식이라는 것만 알고 넘어가시면 됩니다. 

 

R코딩을 해봅시다. GET 함수는 httr 패키지, read_html 은 rvest 패키지에 들어있는 함수입니다. 따라서 먼저 패키지를 설치해주셔야 합니다. 

 

#R 패키지 설치
install.packages("httr")
install.packages("rvest")

 

library 함수를 이용하여 패키지를 불러옵니다. 

 

library(httr)

library(rvest)

 

이제 GET함수를 이용하여 서버에 정보를 요청합시다. url이라는 변수에 url 주소를 문자열로 저장하였고, 이 변수에 GET 함수를 적용하였습니다. GET 함수에서 요청한 결과를 get_url 에 저장하였습니다. 

 

url = 'http://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?orderClick=d79' 

data = GET(url)

 

솔창에 data을 입력하면 아래와 같은 결과가 출력될 것입니다. 

 

>>> data
  Response [ http://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?orderClick=d79] 
  Date: 2020-07-27 01:37
  Status: 200
  Content-Type: text/html; charset=EUC-KR
  Size: 301 kB

 

status 200이라는 것은 요청에 성공했다는 것입니다. 여기서는 EUC-KR 이라는 것을 보시면 됩니다. 한글 인코딩 방식 중 가장 대표적으로 사용되는 방식입니다. 인코딩은 문자를 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말합니다. EUC-KR 은 컴퓨터가 한글을 이용할 수 있도록 2진수로 표기하는 방식 중 하나입니다. 

 

read_html 함수를 이용하여 html 코드를 읽어봅시다. 아래와 같은 형식으로 입력합니다. 

my_html=read_html(data,encoding='EUC-KR')

 

결과는 아래와 같습니다. 일부만 출력되었습니다. 

 

> my_html
<html xmlns="http://www.w3.org/1999/xhtml" lang="ko" xml:lang="ko">

[1] <head>\n<title>교보문고 종합 주간 집계 | 국내도서 | 베스트셀러 - 교보문고</title>\n<!--MS의 최신 웹브라우저인 edge 브라우저 호환을 위해 넣어줌--><meta http-equiv="X-UA-Compatible"  ...

[2] <body>\n<iframe name="HiddenActionFrame" frameborder="0" width="0" height="0" style="display:none;" title="빈 프레임"></iframe>\r\n\r\n<scri ...

 

이제 우리가 원하는 정보인 '주간 베스트셀러 도서'를 가져와야하는데요. 위 URL에 접속해서 아래 그림과 같이 개발자도구를 이용하여 도서의 위치를 확인합니다. 

 

도서는 strong 태그로 감싸져 있습니다. 전략을 잘 짜야 하는데요. 일단은 strong 태그를 전부 가져와봅시다. html_nodes 함수를 사용합니다. 아래와 같은 형식으로 입력합니다. my_html 이라는 html 문서에서 strong 태그를 전부 가져오라는 의미입니다. 

 

pick1=html_nodes(my_html,'strong')

 

실행 결과는 아래와 같습니다. 

 

> pick1

 [1] <strong>바로콘으로 인터넷교보문고 소식 받기</strong>
 [2] <strong>서울</strong>
 [3] <strong>수도권</strong>
 [4] <strong>지방</strong>
 [5] <strong>자동로그인이 설정되어 있습니다.</strong>
 [6] <strong>분야 종합</strong>
 [7] <strong><a href="javascript:_go_targetPage('1')">1</a></strong>
 [8] <strong class="rank">1</strong>
 [9] <strong>김미경의 리부트</strong>
[10] <strong class="book_price">14,400원</strong>
...

 

책 제목 뿐만 아니라 너무 많은 것들이 불러와집니다. strong 테그를 a테그가 감싸고 있으므로, a테그 안에 있는 strong 테그를 불러와봅시다.

 

pick1=html_nodes(my_html,'a strong')

 

실행 결과는 아래와 같습니다. (업데이트 하는 시점에 베스트셀러가 바뀌어서 책이 달라졌는데 감안해주세요)

 

> pick1

 [1] <strong>분야 종합</strong>
 [2] <strong class="rank">1</strong>
 [3] <strong>트렌드 코리아 2021</strong>
 [4] <strong class="ebook_price">12,600원</strong>
 [5] <strong class="rank">2</strong>
 [6] <strong>달러구트 꿈 백화점</strong>
 [7] <strong class="ebook_price">9,100원</strong>
 [8] <strong class="rank">3</strong>
 [9] <strong>흔한남매. 6</strong>
[10] <strong class="rank">4</strong>
[11] <strong>설민석의 한국사 대모험. 15</strong>

 

여전히 다른것들이 많네요. 이번에는 한단계 더 확장합시다. class가 title 인 테그 안에 a테그 안에 strong 테그로 접근해봅시다. class에 접근할 때는 점(.) 을 앞에 붙여줘야 합니다. 

pick1=html_nodes(my_html,'.title a strong')

 

아래는 실행 결과입니다. 

 > pick1

 [1] <strong>트렌드 코리아 2021</strong>
 [2] <strong>달러구트 꿈 백화점</strong>
 [3] <strong>흔한남매. 6</strong>
 [4] <strong>설민석의 한국사 대모험. 15</strong>
 [5] <strong>나의 하루는 4시 30분에 시작된다</strong>
 [6] <strong>어떻게 말해줘야 할까</strong>
 [7] <strong>말장난</strong>
 [8] <strong>보건교사 안은영(특별판)(양장본 HardCover)</strong>
 [9] <strong>돈의 속성(100쇄 기념 에디션)(양장본 HardCover)</strong>
[10] <strong>하루만 네가 되고 싶어. 1</strong>

 

책 제목만 잘 불러졌습니다. 

 

마지막으로 테그를 제거하고 텍스트만 가져옵시다. html_text 를 사용합니다. 순위별로 20위까지 불러와진 것을 알 수 있습니다. 

> result=html_text(pick1)
> result
 [1] "트렌드 코리아 2021"                                         
 [2] "달러구트 꿈 백화점"                                         
 [3] "흔한남매. 6"                                                
 [4] "설민석의 한국사 대모험. 15"                                 
 [5] "나의 하루는 4시 30분에 시작된다"                            
 [6] "어떻게 말해줘야 할까"                                       
 [7] "말장난"                                                     
 [8] "보건교사 안은영(특별판)(양장본 HardCover)"                  
 [9] "돈의 속성(100쇄 기념 에디션)(양장본 HardCover)"             
[10] "하루만 네가 되고 싶어. 1"                                   
[11] "폴리매스"                                                   
[12] "마음챙김의 시"                                              
[13] "존리의 금융문맹 탈출"                                       
[14] "아몬드(양장본 HardCover)"                                   
[15] "그 환자"                                                    
[16] "매우 예민한 사람들을 위한 책"                               
[17] "규칙 없음"                                                  
[18] "주식투자 무작정 따라하기(2020)(개정판)"                     
[19] "원펀맨(One Punch Man). 22"                                  
[20] "이토록 공부가 재미있어지는 순간(10만 부 기념 스페셜 에디션)

 

오늘 사용한 전체 코드는 아래와 같습니다. 

 

#패키지 불러오기
library(httr)
library(rvest)

#GET 함수로 서버에 정보 요청하기
url = 'http://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?orderClick=d79' 
data= GET(url)



#read_html 함수로 html 코드 읽기
my_html=read_html(data,encoding='EUC-KR')



#title class 안의 a 테그 안의 strong 테그 추출하기
pick1=html_nodes(my_html,'.title a strong')

#9번째 strong 태그의 내용 가져오기
result=html_text(pick1)

 

 

 

반응형

댓글