웹 스크래핑과 웹 크롤링

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
}