웹 스크래핑과 웹 크롤링
1 웹 스크래핑(Web Scraping)
- 웹 사이트의 내용을 가져와 원하는 형태로 가공하는 것을 의미함.
- 어느 웹 사이트(주소)에서 어디의 정보를 가져올 것인 가를 먼저 정해야 함.
- 결국 해당 ‘웹 문서를 전체’를 가져온 후 ‘원하는 부분’만 고른 후 가공함.
2 웹 크롤링(Web Crawling)
- 자동화 봇(bot)인 웹 크롤러가 정해진 규칙에 따라 복수 개의 웹 페이지를 가져오는 하는 행위
실습
(1) 예제
- xpath finder를 이용한 스크래핑
library(XML)
library(plyr)## Warning: package 'plyr' was built under R version 3.5.1
URL <- 'https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC'
get0 <- httr::GET(URL)
html0 <- XML::htmlParse(get0,encoding='UTF-8')
xpath1 <- '/html/body/div[3]/div[3]/div[4]/div/p[2]'
xpathSApply(html0,xpath1,xmlValue)## [1] "위키백과의 운영은 비영리 단체인 위키미디어 재단이 맡고 있다.[4] 2020년 기준으로 영어판 600만여 개, 한국어판 479,402개를 비롯하여 300여 언어판을 합하면 4천만 개 이상의 글이 수록되어 꾸준히 성장하고 있으며 앞으로 더 성장할 예정이다.[5] 위키백과의 저작권은 크리에이티브 커먼즈 라이선스(CCL)와 GNU 자유 문서(GFDL)의 2중 라이선스를 따른다. 두 라이선스 모두 자유 콘텐츠를 위한 것으로 일정한 요건을 갖추면 사용에 제약을 받지 않는다.\n"
(2) 여러 개의 뉴스기사 크롤링
library(httr)
library(stringr)## Warning: package 'stringr' was built under R version 3.5.1
front <- 'https://news.joins.com/article/' # 중앙일보
startPoint <- 22248999
endPoint <- 22249100
times <- 0
fileDir <- 'D:\\r_crawl\\'
fileNumber <- 1
while(startPoint != endPoint){
tryCatch({
URL <- paste(front,as.character(startPoint),sep='')
get <- GET(URL)
html <- htmlParse(get, encoding= 'UTF-8')
head_xpath <- '//*[@id="article_title"]'
date_xpath <- '/html/body/div[2]/div[2]/div[11]/div[1]/div[2]/div[1]/em[2]'
body_xpath <- '//*[@id="article_body"]'
article_title <- trimws(gsub(',',' ',gsub('\n','',xpathSApply(html,head_xpath,xmlValue))))
article_date <- trimws(gsub(',',' ',xpathSApply(html,date_xpath,xmlValue)))
article_body <- trimws(gsub(',',' ',gsub('\n','',xpathSApply(html,body_xpath,xmlValue))))
}
,
error = function(e){
print('Not Found')
article_title <<- 'NULL_TITLE'
article_date <<- 'NULL_DATE'
article_body <<- 'NULL_BODY'
}
)
cat(startPoint,',',
article_title,",",
article_date,',',
article_body,'\n',
file=paste(fileDir,fileNumber,'.txt',sep=''),
append=T)
if(times %% 100 == 1){
Sys.sleep(10)
}
else{}
if(file.info(paste(fileDir,fileNumber,'.txt',sep=''))$size>1024000000){
fileNumber <- fileNumber + 1
}
else{}
startPoint <- startPoint +1
times <- times + 1
}