본문 바로가기
R

[R.아르] 웹페이지에서 원하는 요소 가져오기(크롤링)

by LightBlogger 2018. 3. 13.

다음과 같은 페이지에서 1-10위까지 목록을 추출하는 방법을 알아보자.



R사의 베스트셀러 페이지이며, 주소는 다음과 같다.


https://ridibooks.com/bestsellers/general?order=monthly



일단, 웹페이지를 가져오려면 httr 패키지가 필요하다.


library(httr)


처음 보는 패키지라면 다음과 같이 설치해 주자.


install.packages('httr')


패키지를 불러왔다면 GET 함수 안에 위 주소를 넣고 웹페이지를 불러온다.


web=GET('https://ridibooks.com/bestsellers/general?order=monthly')


다음과 같이 <!DOCTYPE html> 로 시작하는 202 kB 의 문서가 잘 들어온 것을 확인할 수 있다.



이제 이 HTML 문서 어딘가에 있을 책의 제목, 저자, 출판사 등의 정보를 추출하면 되겠다.


일단 XML 패키지의 htmlParse 함수로 해당 html 을 변환해 두자. 이후 진행에 필요한 과정이다.


library(XML)

web=htmlParse(web)



제목을 특정하여 찾기 위해, 아까의 웹페이지로 돌아가 책 제목에 마우스를 대고 오른쪽 버튼 - [검사] 메뉴를 호출한다.



우리가 원하는 [무례한 사람에게 웃으며 대처하는 법] 이라는 제목은 <span class="title_text"> 와 </span> 이라는 태그에 둘러싸여 있다.


파랗게 선택된 영역에서 오른쪽버튼 - [copy] - [copy XPath]를 누르자.


XPath 는 해당 요소의 고유 주소라고 생각하면 되겠다.



복사된 XPath 는 다음과 같다.


//*[@id="page_best"]/div[2]/div[2]/div[2]/h3/a/span


시험 삼아 2위인 [혼자하는 공부의 정석]의 제목에 마우스를 두고 오른쪽버튼 - [검사]로 XPath 를 확인해 본다. 이번에는 다음과 같다.


//*[@id="page_best"]/div[2]/div[3]/div[2]/h3/a/span


대략 어떤 방식으로 움직이는지 알겠다. 이제 첫 번째 요소를 불러보자. xpathSApply라는 함수를 사용한다.


xpathSApply(저장된 html 문서, 원하는 요소의 XPath, xmlValue) 와 같이 적자.


xpathSApply(web, '//*[@id="page_best"]/div[2]/div[2]/div[2]/h3/a/span', xmlValue)



결과에 줄바꿈을 의미하는 \n과 공백이 있으므로 


2016/09/26 - [R] - [R.아르] 찾아바꾸기 gsub() 에 등장한 gsub 을 사용하여 없애 주자.


x = xpathSApply(web, '//*[@id="page_best"]/div[2]/div[2]/div[2]/h3/a/span', xmlValue)

x = gsub("\n", "", x)

x = gsub("  ", "", x)



제목만 추출해 내었다.


이제 반복문을 이용해 같은 작업을 반복하면서 하나의 문서에 이어 붙이면 되겠다.



일단 xpath 의 바꿔야 하는 부분을 기준으로 텍스트를 나누어 주자


//*[@id="page_best"]/div[2]/div[    2    ]/div[2]/h3/a/span


이렇게 두 부분이므로


xpath1 = '//*[@id="page_best"]/div[2]/div['

xpath2 = ']/div[2]/h3/a/span'


이렇게 나눈 후 다음과 같이 paste0를 활용해 for 문 안에서 다시 xpath를 만들도록 한다.


xpath = paste0(xpath1, i, xpath2)


(참고: 2016/09/22 - [R] - [R. 아르] 내용 합치기 paste())


이제 빈 벡터를 하나 만들고


title = c()


반복문은 다음과 같이 구성하면 되겠다.


for(i in 1:10){

xpath = paste0(xpath1, i+1, xpath2)

x = xpathSApply(web, xpath, xmlValue)

x = gsub("\n", "", x)

x = gsub("  ", "", x)

title[i] = x

}


바뀌는 숫자가 2부터 시작하므로 i+1 로 지정해 주었다.


여기까지를 모두 실행한 결과는 다음과 같다.



1위부터 10위까지 제목 추출이 완료되었다.





반응형

댓글