Skip to content

사용 예시 with setUrls

Chan-Yub Park edited this page Apr 28, 2017 · 3 revisions

여기에서 howdark님이 제안하신 setUrls 코드를 반영한 수집 코드 예시입니다. howdark님이 예시 코드도 제공해주셨고 아래와 같습니다. 감사합니다.

library(N2H4)
library(httr)
library(dplyr)

# 메인 카테고리 id 가져옵니다.
cate<-getMainCategory()
# 예시를 위해 하나만 선택합니다.
# 여기는 100(정치)를 선택했습니다.
tcate<-cate$sid1[1]
# 정치의 세부 카테고리를 가져옵니다.
subCate<-cbind(sid1=tcate,getSubCategory(sid1=tcate))
# 그중에 1번째, 2번째 세부 카테고리를 정했습니다.
tscate<-subCate$sid2[1:2]

# 목표 날짜를 지정합니다.
strDate<-"20160101"
endDate<-"20160101"

strTime<-Sys.time()
midTime<-Sys.time()

# 주어진 조건 값들의 모든 조합을 고려한 pageUrl을 생성합니다. (sid1 x sid2 x date)
urls <- setUrls(tcate, tscate, strDate, endDate)


# 라스트 페이지 탐색 및 페이지 수에 맞춰 pageUrl을 재생성하는 코드입니다.
sub_urls <- list()

for (url in urls){
  print(paste0(url$date," / ", url$sid1," / ", url$sid2 ," / start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
  midTime<-Sys.time()

  # 리스트 페이지의 마지막 페이지수를 가져옵니다.
  max<-getMaxPageNum(url$pageUrl)

  # 기존에 주어진 조건 값 + page번호의 모든 조합을 고려한 pageUrl을 생성합니다. (sid1 x sid2 x date x page)
  sub_urls <- c(sub_urls, setUrls(url$sid1, url$sid2, url$date, url$date, 1:max))
}


# 페이지 번호가 포함된 Url List에서 news data를 가져옵니다.
for (url in sub_urls){
  print(paste0(url$date," / ",url$sid1," / ",url$sid2," / ",url$pageNum, " / start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
  midTime<-Sys.time()

  # 뉴스 리스트 페이지 내의 개별 네이버 뉴스 url들을 가져옵니다.
  newsList<-getUrlListByCategory(url$pageUrl)
  newsData<-c()

  # 가져온 url들의 정보를 가져옵니다.
  newsData <- lapply(newsList$links, function(x){
    # 불러오기에 성공할 때 까지 반복합니다.
    tem<-try(getContent(x), silent = TRUE)
    while(class(tem)=="try-error"){
      tem<-try(getContent(x), silent = TRUE)
      print(paste0("try again: ",x))
    }
    if(class(tem$datetime)[1]=="POSIXct"){
      # newsData<-rbind(newsData,tem)
      return(tem)
    }
  })

  # dplyr 패키지의 bind_rows 함수로 리스트로 저장된 데이터 프레임을 rbind 합니다.
  newsData <- dplyr::bind_rows(newsData)


  dir.create("./data",showWarnings=F)
  # 가져온 뉴스들(보통 한 페이지에 20개의 뉴스가 있습니다.)을 csv 형태로 저장합니다.
  write.csv(newsData, file=paste0("./data/news",url$sid1,"_",url$sid2,"_",url$date,"_",url$pageNum,".csv"),row.names = F)
}