Git Product home page Git Product logo

n2h4's People

Contributors

allcontributors[bot] avatar howdark avatar leekwangho avatar mrchypark avatar olivroy avatar procommiter avatar seokho92 avatar yoonjaej avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

n2h4's Issues

안녕하세요 교수님

안녕하세요 교수님
교수님께서 올려주신 코드로 열심히 공부해보려고하는 학생입니다.
네이버 뉴스 기사 크롤링을 하려고 교수님의 패키지로 구동해보았는데 잘 안돼서 질문을 남겨봅니다.

뉴스 리스트 페이지 내의 개별 네이버 뉴스 url들을 가져오는데까지는 되는데
가져온 url들의 정보를 가져오는데에서 newsData가 빈 리스트들로만 이루어집니다.
교수님께서 올리신 함수들은 고치지 않았는데 무엇이 문제일까요??
제가 보고 있는 코드는 다음과 같습니다.

`library(N2H4)
library(httr)

메인 카테고리 id 가져옵니다.

cate<-getMainCategory()

예시를 위해 하나만 선택합니다.

여기는 101(경제)를 선택했습니다.

tcate<-cate$sid1[2]

경제의 세부 카테고리를 가져옵니다.

subCate<-cbind(sid1=tcate,getSubCategory(sid1=tcate))

그중에 1번째, 2번째 세부 카테고리를 정했습니다.

tscate<-subCate$sid2[1:2]

목표 날짜를 지정합니다.

strDate<-"20180705"
endDate<-"20180705"

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

##파일 이름을 지정하면 한 파일에 이어 붙이고 ""로 놔두면 각 뉴스마다 파일을 따로 저장ㅎ
save_path <- ""

Main카테고리벡터, 세부카테고리벡터, 시작날짜, 종료날짜, 페이지벡터로 URL 생성하는 함수입니다.

setUrls <- function(sid1_vec, sid2_vec, strDate, endDate, page_vec=NA){
url_list <- expand.grid(sid1_vec, sid2_vec, strDate:endDate, page_vec, stringsAsFactors=FALSE)
colnames(url_list) <- c("sid1", "sid2", "date", "pageNum")
url_list <- apply(url_list, 1, as.list)
url_list <- lapply(url_list, function(x){
pageUrl <- parse_url("http://news.naver.com/main/list.nhn")
if(is.na(x$page)){
pageUrl$query <- list(sid1=x$sid1, sid2=x$sid2, mid="shm", mode="LS2D", date=x$date)
} else {
pageUrl$query <- list(sid1=x$sid1, sid2=x$sid2, mid="shm", mode="LS2D", date=x$date, page=x$pageNum)
}
x$pageUrl <- build_url(pageUrl)
return(x)
})
return(url_list)
}

주어진 조건 값들의 모든 조합을 고려한 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)

##파일 이름을 지정하면 한 파일에 이어 붙이고 ""로 놔두면 각 뉴스마다 파일을 따로 저장
if(save_path==""){
# 가져온 뉴스들(보통 한 페이지에 20개의 뉴스가 있습니다.)을 csv 형태로 저장합니다.
write.csv(newsData, file=paste0("./data/news",url$sid1,"",url$sid2,"",url$date,"_",url$pageNum,".csv"),row.names = F)
} else {
if (!file.exists(save_path)){
write.csv(newsData, file=save_path, row.names = F)
}
write.table(newsData, file=save_path, append=T, row.names = F, col.names = F, sep=",")
}

}`

크롤링 도중 멈추는 현상

안녕하세요! 만들어주신 라이브러리 잘 활용하고 있습니다. 감사합니다

다름이 아니라 현재 카테고리별 크롤링을 활용하고 있는데 크롤링 하는 도중에 멈추는 현상이 발생합니다.

제가 짠 소스코드가 문제인지 해결할 방법이 보이지 않네요 ㅜㅜ 도와주시면 감사하겠습니다.

소스코드는 위키 내에 있는 예시를 활용하였습니다.

`

library(RMySQL)
library(N2H4)
conn<-dbConnect(MySQL(),user="",password="",dbname="",host="",port=)
cate<-getMainCategory()
for(loop in 2:6) // 카테고리 별 크롤링 하기 위해 반복
{
tcate<-cate$sid1[loop]

subCate<-cbind(sid1=tcate,getSubCategory(sid1=tcate))
tscate<-subCate$sid2

strDate<-"20171101"
endDate<-"20171108"

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

for(date in strDate:endDate)
{

for(sid1 in tcate)
  {
    for(sid2 in tscate)
    {
    print(paste0(date," / ",sid1," / ",sid2 ," / start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
    midTime<-Sys.time()
    pageUrl<-paste0("http://news.naver.com/main/list.nhn?sid2=",sid2,"&sid1=",sid1,"&mid=shm&mode=LS2D&date=",date)
    max<-getMaxPageNum(pageUrl)
    
  
    for(pageNum in 1:max)
    {
      print(paste0(date," / ",sid1," / ",sid2," / ",pageNum, " / start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
      midTime<-Sys.time()
      pageUrl<-paste0("http://news.naver.com/main/list.nhn?sid2=",sid2,"&sid1=",sid1,"&mid=shm&mode=LS2D&date=",date,"&page=",pageNum)
      newsList<-getUrlListByCategory(pageUrl)
      newsData<-c()
      for(newslink in newsList$links)
      {
        tryi<-0
        tem<-try(getContent(newslink),silent = TRUE)
        while(tryi<=5 && class(tem) == "try-error")
        {
          tem<-try(getContent(newslink),silent = TRUE)
          tryi<-tryi+1
          print(paste0("try again",newslink))
        }
        if(class(tem$datetime)[1] == "POSIXct")
        {
          newsData<-rbind(newsData,tem)
        }
        
      }
      for(i in 1:20)
      {
        try({
        dbGetQuery(conn,paste("insert into naver_news(url,datetime,press,title,body) values('",newsData$url[i],"','",newsData$datetime[i],"','",newsData$press[i],"','",gsub("'","",newsData$title[i]),"','",gsub("'","",newsData$body[i]),"')"))
          })
      }
    }
  }
}

}
}
dbDisconnect(conn)

`

'검색어 기반 뉴스 수집' 질문 드립니다.

안녕하세요. 크롤링을 막 배우기 시작한 학생입니다.
'검색어 기반 뉴스 수집' 스크립트를 그대로 복사 붙여넣기 해서 돌리면
계속 다음과 같이 오류가 떠서 이것을 어떻게 해결하면 좋을 지 몰라서 질문드립니다.
참고로 R 버전은 3.4.2이고 R studio는 1.1.383으로 최신입니다.

Error in if (max == "no result") { :
missing value where TRUE/FALSE needed

getComment 오류인것같아 리포트합니다.

안녕하세요. 올려주신 코드로 처음 댓글수집을 해보려는 사용자입니다.
적혀있는대로 네이버 기사 링크를 올려서 댓글을 수집하려고하는데.
링크를 바꿔도 계속 같은 댓글이 수집 되더라구요.

library(N2H4) comment<-N2H4::getComment(turl="https://n.news.naver.com/mnews/article/001/0013162749?sid=104", pageSize = 100) comment$contents[[1]]

이 코드로 프로그램을 돌렸고
"2015 댓글은 없구료..."라는 댓글이 계속 처음에 등장합니다.

혹시 getNewsTrend는 더이상 동작하지 않나요?

getNewsTrend('삼성', '2019-03-01', '2019-03-06', onlyPaper=FALSE)

R 초보라, 적혀있는 함수들을 하나하나 해보고 있는데 요거는 어째서인지 자꾸만 숫자가 0으로 떠서요...
위키에 있는 뉴스 트랜드로 그래프 그리는 코드를 그대로 가져와서 해봐도
수치가 0으로만 표기되어, 혹시 해당 함수가 더이상 지원되지 않는 것인지 궁금합니다~

<위에 적힌 코드를 실행 시 나타나는 내용>
date cnt
1 2019-03-01 0
2 2019-03-02 0
3 2019-03-03 0
4 2019-03-04 0
5 2019-03-05 0
6 2019-03-06 0

This crawler is not capable with Mac OSX environment

Please update this crawler~ someone who can use Mac OSX.
You can see error message below

--- error message in R console ---

에러: '' does not exist in current working directory ('/Users/VM Ware/R/cralwer'). 추가정보: 경고메시지(들):
1: In grep("class="m[3-8] nclick", tem) :
이 로케일에서는 입력문자열 17는 유효하지 않습니다
2: In grep("class="m[3-8] nclick", tem) :
이 로케일에서는 입력문자열 19는 유효하지 않습니다
3: In grep("class="m[3-8] nclick", tem) :
이 로케일에서는 입력문자열 21는 유효하지 않습니다
4: In grep("class="m[3-8] nclick", tem) :
이 로케일에서는 입력문자열 118는 유효하지 않습니다
5: In grep("class="m[3-8] nclick", tem) :
이 로케일에서는 입력문자열 119는 유효하지 않습니다

안녕하세요. 잘 되지 않아 여쭤봅니다.

안녕하세요. N2H4를 이용한 프로젝트를 만들고 있는 학생입니다.

다름이 아니라, 기능 중 getContent 가 잘 되지 않아 글을 쓰게 되었습니다.
1
개발자님께서 올려주신 WiKi의 기능 설명 중, url을 복사하여

2
위와 같이 하였지만 url을 제외한 나머지들은 모두 page is not news section 이라고 나옵니다.
다른 url로도 시도해보았지만 같은 결과가 나오는데
어떻게 해야할지 궁금합니다.

답 부탁드립니다. 감사합니다.

setUrls 함수 제안

Wiki에 보면 sid1, sid2, date, pageNum등을 가지고 url을 다시 build 해야 하는 상황이 많은데
아래와 같은 함수를 정의해 놓으면 사용자 입장에서 코드가 간결해 질 것 같습니다.

# Main카테고리벡터, 세부카테고리벡터, 시작날짜, 종료날짜, 페이지벡터로 URL 생성하는 함수입니다.
# httr, dplyr 패키지가 필요합니다.
setUrls <- function(sid1_vec, sid2_vec, strDate, endDate, page_vec=NA){
  url_list <- expand.grid(sid1_vec, sid2_vec, strDate:endDate, page_vec, stringsAsFactors=FALSE)
  colnames(url_list) <- c("sid1", "sid2", "date", "pageNum")
  url_list <- apply(url_list, 1, as.list)
  url_list <- lapply(url_list, function(x){
    pageUrl <- parse_url("http://news.naver.com/main/list.nhn")
    if(is.na(x$page)){
      pageUrl$query <- list(sid1=x$sid1, sid2=x$sid2, mid="shm", mode="LS2D", date=x$date)
    } else {
      pageUrl$query <- list(sid1=x$sid1, sid2=x$sid2, mid="shm", mode="LS2D", date=x$date, page=x$pageNum)
    }
    x$pageUrl <- build_url(pageUrl)
    return(x)
  })
  return(url_list)
}

Wiki 사용 예를 보면 sid1, sid2 등을 출력하는 상황이 많을 것 같아서 url build 시 사용된 데이터를 포함한 list를 return 값으로 받고 있습니다. 현재 다른 함수를 건드리지 않는다면 간결하게 pageUrl 항목만 return하는 방법도 있을 것 같고, 보기에 좋으려면 data.frame 형식으로 return해도 되겠지만, for문을 쓸 때도 list형식이 가져다 쓰기가 좋아서 list로 return했습니다.

Wiki 사용 예제 (List 방식)

library(N2H4)
library(httr)

# 메인 카테고리 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()

# Main카테고리벡터, 세부카테고리벡터, 시작날짜, 종료날짜, 페이지벡터로 URL 생성하는 함수입니다.
setUrls <- function(sid1_vec, sid2_vec, strDate, endDate, page_vec=NA){
  url_list <- expand.grid(sid1_vec, sid2_vec, strDate:endDate, page_vec, stringsAsFactors=FALSE)
  colnames(url_list) <- c("sid1", "sid2", "date", "pageNum")
  url_list <- apply(url_list, 1, as.list)
  url_list <- lapply(url_list, function(x){
    pageUrl <- parse_url("http://news.naver.com/main/list.nhn")
    if(is.na(x$page)){
      pageUrl$query <- list(sid1=x$sid1, sid2=x$sid2, mid="shm", mode="LS2D", date=x$date)
    } else {
      pageUrl$query <- list(sid1=x$sid1, sid2=x$sid2, mid="shm", mode="LS2D", date=x$date, page=x$pageNum)
    }
    x$pageUrl <- build_url(pageUrl)
    return(x)
  })
  return(url_list)
}


# 주어진 조건 값들의 모든 조합을 고려한 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)
}

MaxPage를 못찾네요

안녕하세요 박찬엽 선생님

N2H4 유용하게 사용하고 있습니다.
한두달 전 쯤에 사용하다가 기간을 변경하여야 할 필요성이 있어서 다시 해보니까
아래와 같이 MaxPage를 못찾는데요
혹시 devtool 버전에러나 뭐 그런걸까요?

귀찮게 해드려 죄송해요...

library(N2H4)
q<-"독성시험"
tar <- getQueryUrl(q, startDate=as.Date(Sys.time())-30, endDate=as.Date(Sys.time()))
maxPage <- getMaxPageNum(tar)
for (i in 1:maxPage){

  • tarp <- paste0(tar,"&page=",i)
    
  • newsList<-getUrlListByQuery(tarp)
    
  • newsData<-c()
    
  • for (newslink in newsList$news_links){
    
  •     tryi<-0
    
  •     tem<-try(getContent(newslink), silent = TRUE)
    
  •     while(tryi<=5&&class(tem)=="try-error"){
    
  •         tem<-try(getContent(newslink), silent = TRUE)
    
  •         tryi<-tryi+1
    
  •         print(paste0("try again: ",newslink))
    
  •     }
    
  •     if(class(tem$datetime)[1]=="POSIXct"){
    
  •         newsData<-rbind(newsData,tem)
    
  •     }
    
  • }
    
  • dir.create("./data",showWarnings=F)
    
  • write.csv(newsData, file=paste0("./data/news_",q,"_",i,".csv"),row.names = F)
    
  • }
    Error in 1:maxPage : NA/NaN argument

wiki update

wiki의 내용을 지금 버전 기반으로 업데이트 필요.

최소한 몇 버전때 동작하는 코드인지 명시하고, 코드 앞에 설치 코드를 제공.

혹은 사용자 들에게 자신들의 코드를 기여해주기를 부탁할 수도 있겠다.

예외 페이지 문제

안녕하세요

코드를 수정하여 테스트 하던 도중,

while(class(tem)=="try-error"){
            tem<-try(getContent(newslink), silent = TRUE)
            print(paste0("try again: ",newslink))
}

이 부분에서 걸려 계속 에러만 출력하는 상황이라 확인해보았더니 페이지 문제가 있는 것 같습니다.

http://news.naver.com/main/read.nhn?mode=LS2D&mid=shm&sid1=100&sid2=264&oid=003&aid=0007761134

에러를 출력하게 된 페이지의 URL은 위와 같습니다.
위 페이지로 접속하여 보면, 기존에 코드가 수집하는 뉴스 리스트 쪽이 아니라 스포츠 섹션 쪽이라 페이지 구성이 달라 id="articleBodyContents"를 가진 div가 없어서 수집에 실패하는 것으로 생각됩니다.

혹시, 이런 이슈를 경험한 적 있으신가요?
해결 방법으로는 while 문에서 불러오기 성공할 때까지 반복하는 것이 아니라, 횟수제한을 둔다거나
해당 페이지와 같은 case도 수집 코드를 추가하는 것 정도 떠오르는데 적절한 처리 방법에 대한 고민이 필요할 것 같습니다

감사합니다 :)

Failed for package 'N2H4'

Thank you very much for your work.
I'm having a problem from the start, because I cannot load your package.

When I load "pacman" package, it works until then, but when I type

pacman::p_load_gh("mrchypark/N2H4")

the following message appears and I cannot use/install your work.

pacman::p_load_gh("mrchypark/N2H4")

  • installing source package 'N2H4' ...
    ** R
    ** demo
    ** preparing package for lazy loading
    Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) :
    there is no package called 'bitops'
    ERROR: lazy loading failed for package 'N2H4'
  • removing 'C:/Users/myname/Documents/R/win-library/3.3/N2H4'
    Error : Command failed (1)
    Warning message:
    In pacman::p_load_gh("mrchypark/N2H4") :
    Failed to install/load:
    mrchypark/N2H4

Thank you so much!

네이버 스포츠 뉴스 수집관련(인코딩) 질문

안녕하세요? 스포츠 기사 관련 크롤링을 진행하고 있는 학생입니다.
기사중에 그냥 네이버뉴스도 있고 네이버 스포츠뉴스도 있는데, 일반 네이버 뉴스에서는 잘 작동하네요.

다만 스포츠 기사는 웹코드가 조금 달라서 약간 수정을 거치고 이용해봤는데, 결정적으로 인코딩에서 에러가 생깁니다. 현재 네이버뉴스는 charset="euc-kr", 스포츠뉴스는 charset="UTF-8" 으로 되어있네요

예를들어 getContentTitle 로 얻어온 title을 출력해 보면

[[1]]
[1] "[K뒪\u0080] 쐞湲곗쓽 異뺢뎄 \u0080몴\u0080 슦利덈쿋겕 엯꽦\u0080肄붿튂吏, 7떆媛 湲곕궡 넗쓽"

[[2]]
[1] "異뺢뎄\u0080몴\u0080 肄붿튂吏, 鍮꾪뻾湲 븞뿉꽌룄 諛ㅼ깦 遺꾩꽍 "諛섎뱶떆 듅由""

이런식으로 되고 본문 내용 추출로도 넘어가지 못하네요. R언어에서 인코딩 관련하여 찾아봤지만 문제를 해결할 수 없어서.. 혹시 어느 부분을 수정하면 될지 알 수 있을까요?

네이버 스포츠 뉴스 댓글수집

안녕하세요? 얼마전에 네이버 스포츠 뉴스 크롤링 관련 질문했던 학생입니다. 결과부터 말하면 현재 스포츠 기사 추출에는 잘쓰고있어서, 감사하단 말씀 드립니다. 그런데 댓글수집은 아직까지 못하고있어 질문드립니다.

  1. 찾아보니 네이버 open API를 이용하려면 등록과정을 거치고, 요청 헤더에 클라이언트 정보 등을 추가해야하는 거 같더군요.
    http://apis.naver.com/commentBox/cbox/web_naver_list_jsonp.json?ticket=sports&templateId=view&pool=cbox2&_callback=jQuery1113020049989799848422_1509795433279&lang=ko&country=KR&objectId=news025%2C0002750844&categoryId=&pageSize=20&indexSize=10&groupId=&listType=OBJECT&page=1&initialize=true&userType=&useAltSort=true&replyPageSize=20&moveTo=&sort=LIKE&_=1509795433280

다음이 스포츠 기사 api의 한 예인데, 네이버 뉴스 댓글수집api랑 종류가 다른 것인가요? 만약 그렇다면 등록을 안해서 사용을 못하는 것인지 궁금합니다.

  1. 세부정보만 다르고 같은 종류의 사용가능한 api라면, #62 여기 62번 이슈처럼 코드를 살짝 바꿔서 진행해봤는데 댓글 수집이 안되더군요. 무엇이 문제인지 알 수 있을까요?

getcomment 질문드립니다.

현재 getcomment를 사용할 경우 pagesize가 100개가 넘어가면 100개까지 긁어오더라구요 확인 부탁드립니다.

관련 뉴스 크롤링 제한

안녕하세요. 네이버 뉴스 크롤러에 대한 문의 드립니다.

특정 기간동안 검색어 쿼리를 통해 N2H4에서 가져오는 뉴스 기사 건수와
동일한 기간과 동일한 검색어 쿼리를 활용하여 네이버 뉴스 페이지에서 검색한 기사 건수가 다른 것 같습니다.

네이버 뉴스 페이지에 있는 언론 기사만 가져오는 건 알겠는데,
아래 그림처럼 관련 뉴스로 숨어 있는 기사는 가져오지 않는 듯 합니다.

20160902171146

관련 뉴스로 숨어 있는 기사까지 가져오려면 어떤 코드를 활용해야 하는지요?

한글깨짐현상

안녕하세요.
R을 접하고 하나하나 배우고 있는 와중에 엄청난 소스를 발견한 것 같습니다.
먼저 이렇게 멋진 툴을 만들어주셔서 감사합니다.

오늘 테스트로 이틀치 뉴스를 다운받아봤는데요.
CVS 파일을 열어보니 한글이 다 깨져있네요.
인코딩을 바꿔야되나 싶어서 이리저리 시도해봐도 에러만 나는데
어쩌면 엄청 기초적인 문제일수도 있지만 혹시 해결책이 있을까요?

다시한번 멋진 툴 감사합니다! ^^

Possible improvements for README.md

  • Fluent translations from KR to EN needed for more accessibility to foreign users
  • Further explanation towards the acronyms needed to minimize confusion

뉴스생산량 검색시의 에러관련

안녕하세요~
향후 잘 사용해보고자 열심히 연습해보고 있습니다.

몇가지 질문을 드릴려고 합니다.

먼저 아래의 예와 같이 입력하였습니다.
strDate<-"2016-11-01"
endDate<-"2016-12-30"
qs<-c("질병모델동물","질환모델동물","실험동물&바이오이미징")
dat<-c()
for(q in qs){
print(q)
tem <- getNewsTrend(q,strDate,endDate)
dat<-rbind(dat,cbind(data.frame(q=q,tem)))
}

참고로 예제에 dat<-rbind(dat,cbind(data.frame(q=q,tem))게 되어있어서 ")"한개 빠져 있더라구요

질문드릴려고 하는 것은 이렇게 실행했을 때 아래와 같은 에러가 떳습니다.
[1] "질병모델동물"
Error in strsplit(result$cnt, "/") : 문자형을 가지지 않는 인자입니다
어떻게 해결하면 좋을 런지요?

둘째는 이게 그려졌다고 할때 검색기간을 장기간으로 했을 경우 혹시
월단위로 cnt를 count해서 표로 쉽게 할 수 있는 방안은 없을까요?

감사합니다.

네이버 기사 좋아요 데이터

안녕하세요. R을 이용해 네이버 댓글 크롤링 하는 법을 배우던 중 좋은 패키지를 알게되었습니다. 편하게 사용할 수 있게 제공해 주셔서 감사합니다.

한가지 여쭤보고 싶은게 있습니다.

저는 rvest 패키지를 사용해 우선적으로 제가 댓글을 모으고 싶은 기사 url, 날짜, 기사제목, 언론사, 본문내용 등을 직접 수집하는데 까지는 성공했으나 댓글부분을 긁어오는게 rvest로 하면 자료가 넘어오질 않더라구요. (그래서 다른 방법을 찾아보다 보니 N2H4 패키지를 알게 되어 댓글을 수집 할 수 있었습니다.)

제가 추가로 얻고 싶은 데이터는 기사 본문 이후에 나오는 감정 클릭 수 (좋아요,훈훈해요,슬퍼요,화나요,후속기사 원해요)인데 이 부분 역시 해당 부분을 긁어오면 모두 '0' 으로 표시되는 문제가 있었습니다. 분명 웹에서 F12눌러 html상으로 확인해보면 클릭 숫자가 적혀있는데도요. 혹시 N2H4 패키지로 해당 기사의 좋아요 카운트를 긁어올 수 있는 방법이 있을까요? 아니면 혹시 다른 방법으로 좋아요 부분 카운트를 긁어오는 방법이 있을까요?

다시한번 좋은 패키지로 편안하게 사용할 수 있게 해주신점 감사드립니다.
likeit

특정 네이버 링크에서 getContent 함수 오류 관련

여러 링크에서 본문을 받던 중 getContent 함수가 에러가 나는 네이버 링크를 발견 했습니다.

getContent("https://n.news.naver.com/mnews/article/277/0003204982?sid=106")

UseMethod("xml_find_all")에서 다음과 같은 에러가 발생했습니다:
클래스 "list"의 객체에 적용된 'xml_find_all'에 사용할수 있는 메소드가 없습니다

아마도 웹페이지의 형식이 네이버 "연애" 홈이라서 그런 것 같은데 한번 확인 부탁드리겠습니다.

getUrlListByCategory() 함수 반환값

<U+C774><U+D6A8><U+C131> <U+C704><U+C6D0><U+C7A5>, KBS <U+CC3E><U+C544> <U+B178><U+B3D9><U+C2DC><U+AC04> <U+B2E8><U+CD95> <U+C548><U+CC29> <U+B2F9><U+BD80>" 이런식으로 유니코드로나와서 쓸수가없는데 작성하신함수보니까 따로인코딩 주는곳은없어보이는데 어떻게해야 한글문서를 읽어들였을떄 온전히받을수잇나요?

getComment로 가져올수 있는 정보 문의

코드상으로는 없는것 같지만 댓글정보 중 그 댓글의 성별을 나타낼 수 있는 속성도 같이 있는지 궁금합니다. 현재 코드에 없다면, 아예 방법이 없을지요?

위키 설명 함수를 getUrlListbyCategory -> getUrlList 이렇게 바꾸면 동작이 되네요:)

위키를 보며 잘 공부하였습니다! 꼼꼼하게 그리고 친절히 설명해주셔서 너무 감사드립니다 :)
한 가지 오류가 있어 수정하면 좋을 것 같아, 글을 남기게 되었습니다.
위키 카테고리를 통한 수집을 따라하던 중 아래 사진과 같은 오류가 났는데,
image

  1. 현재 네이버 url 구조 적용
  2. getUrlListbyCategory -> getUrlList 이렇게 바꾸면 동작이 잘 되네요:)
    훌륭한 페키지 만들어주심에 감사드립니다! 연구에 많은 도움이 됐습니다

getContent 함수에 섹션 추가 관련

안녕하세요, 패키지 공유해주셔서 항상 감사드립니다.
기사들을 섹션 별로 분류가 필요하게 되어 getContent함수에서 섹션을 추가할 수 있도록 수정하였습니다.
혹시 필요한 분이 계실까하여 공유드립니다.

getContent = function (turl, col = c("url", "datetime", "edittime", 
                               "press", "title", "body","section","value"), try_cnt = 3) 
{
  uat <- httr::user_agent("N2H4 by chanyub.park <[email protected]>")
  root <- httr::RETRY("GET", turl, uat, times = try_cnt)
  urlcheck <- root$url
  value <- T
  if (identical(grep("^https?://(news|finance).naver.com", 
                     urlcheck), integer(0)) & value) {
    title <- "page is not news section."
    datetime <- "page is not news section."
    edittime <- "page is not news section."
    press <- "page is not news section."
    body <- "page is not news section."
    section <- "page is not news section."
    value <- F
  }
  html_obj <- httr::content(root)
  chk <- rvest::html_nodes(html_obj, "div#main_content div div")
  chk <- rvest::html_attr(chk, "class")
  chk <- chk[1]
  if (is.na(chk)) {
    chk <- "not error"
  }
  if ("error_msg 404" == chk & value) {
    title <- "page is moved."
    datetime <- "page is moved."
    edittime <- "page is moved."
    press <- "page is moved."
    body <- "page is moved."
    section <- "page is moved."
    value <- F
  }
  if (value) {
    title <- getContentTitle(html_obj)
    datetime <- getContentDatetime(html_obj)[1]
    edittime <- getContentDatetime(html_obj)[2]
    press <- getContentPress(html_obj)
    body <- getContentBody(html_obj)
    section <- getsection(html_obj)
  }
  newsInfo <- tibble::tibble(url = turl, datetime = datetime, 
                             edittime = edittime, press = press, title = title, body = body,section = section,value = value)
  return(newsInfo[, col])
}
getsection = function (html_obj, body_node_info = "script", 
          body_attr = "") 
{
    body <- rvest::html_nodes(html_obj, body_node_info)
    body <- rvest::html_text(body)
  Encoding(body) <- "UTF-8"
  body = stringr::str_extract(na.exclude(stringr::str_extract(body,"_MAIN_NEWS_SECTION_ID=.+\\;")),"\\d.+\\d")
  return(body)
}

getComment 주소형식에 따라서 저장이 안되는 문제 문의 드립니다.

안녕하세요. 훌륭한 패키지 만들어 주셔서 감사합니다.
getComment 사용시에 주소형식에 따라 저장이 안되는 문제가 있어서 문의드리고자 합니다.

똑같은 링크로 가는 두개의 주소입니다. 그러나 위의 링크는 아무 댓글도 받아지지 않고 아래의 경우에는 댓글이 잘 받아집니다.
어떤 이유인지 확인해주실 수 있을까요? getContent의 경우에는 두개의 링크 모두 본문이 잘 받아집니다.

comment<-N2H4::getComment(turl="https://news.naver.com/main/read.naver?mode=LSD&mid=sec&sid1=101&oid=037&aid=0000030157", pageSize = 100)

comment<-N2H4::getComment(turl="https://n.news.naver.com/mnews/article/037/0000030157?sid=101", pageSize = 100)

안녕하세요 덕분에 요긴하게 잘 쓰고 있습니다.

비영리법인입니다. 급하게 프로젝트가 있어 댓글 기능도 쓸려고 합니다.
R 초보자라 많이 헤메고 있습니다.
어떻게 소스코드를 구해 그대로 집어 넣었더니
setwd("C:/news/naverNewsParser-master/naverNewsParser-master")

if (!require("devtools")) install.packages("devtools")
필요한 패키지를 로딩중입니다: devtools
devtools::install_github("forkonlp/N2H4")
Skipping install of 'N2H4' from a github remote, the SHA1 (eb56f2d) has not changed since last install.
Use force = TRUE to force installation
install.packages("iterators")
Installing package into ‘C:/Users/wongi/Documents/R/win-library/3.3’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/iterators_1.0.8.zip'
Content type 'application/zip' length 316188 bytes (308 KB)
downloaded 308 KB

package ‘iterators’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
C:\Users\wongi\AppData\Local\Temp\RtmpAdGq28\downloaded_packages

library(N2H4)
url <- readLines("url.csv")
for(i in 1:10){

  • t <- Sys.time()
    
  • cat(t,"\n")
    
  • t <- strftime(t,"%Y-%m-%d %H:%M:%S")
    
  • starttime[i] <- t
    
  • comm <- getComment(turl = url[i])
    
  • comments <- comm$result$count$comment
    
  • comm <- getComment(turl = url[i] , pageSize = comments, page = 1)
    
  • lst <- comm$result$commentList
    
  • lst <- as.data.frame(lst)
    
  • lst <- lst[,-46]
    
  • write.csv(lst, paste("commentscollect",i,".csv",sep=""))
    
  • }
    1484088578
    Error in starttime[i] <- t : object 'starttime' not found

filename <- vector()
for(i in 1:10){

  • filename[i] <- paste("commentscollect",i,".csv",sep="")
    
  • }

timelist <- cbind(filename,starttime)
Error in cbind(filename, starttime) : object 'starttime' not found
write.csv(timelist, "timelist.csv")
Error in is.data.frame(x) : object 'timelist' not found

이렇게 3번의 에러가 나오네요 ㅠㅠ 저 딴에는 이것저것 시도해 보았지만 너무 초보자라 역부족입니다.
잘 만들어 주셔서 잘 쓰고 싶은데 잘 안되네요
바쁘시겠지만 이럴땐 어떻게 해야 하는지 알려주시면 감사하겠습니다~
덧붙여 다른 코멘트를 보니 아직 예시를 안만드셨다고 하셨는데 그럼 지금 패키지로 특정 키워드 크롤링도 가능한 건가요?
잘 쓰고 싶어서 열심히 매달려봅니다. 부탁드립니다.

sleep_time 설정 문제

안녕하세요! 저번에 크롤링 도중 R이 멈추는 현상에 대해서 질문한 사람입니다.

정말 라이브러리 잘 활용하고 있습니다. 감사합니다

다름이 아니라 크롤링 도중 멈추는 현상을 해결하고자 이리저리 굴러봤습니다만 아직 해결을 못하고 있습니다.

의심가는 부분이 getContent에서 Sys.sleep() 을 할때 일어나는 현상인거 같습니다.

그래서 sleep_time 의 default 값을 변경하여 실행을 해보려고 하였으나 현재 코드에서는 Sys.sleep(abs(sleep_time)) 이 아닌 Sys.sleep(abs(rnorm(1))) 으로 되어있어 sleep_time을 변경하여도 변경이 되지 않습니다.

혹시 한번 확인 부탁드려도 될까요?

cran 등록

문제가 발생해서 cran에서 내려가 있음.

우선 readme에 개발버전 설치 방법을 공유해 두었음.
다시 등록해야 함.

in data.frame 에서 arguments imply differing number of rows: 2, 3 오류가 납니다.

안녕하세요! N2H4 툴을 사용하다 문제가 발생하여 글을 남깁니다!
먼저 다음과 같은 패키지를 만들어주셔서 감사합니다~
현재 올려주신 뉴스키워드를 이용한 기사 추출 예제를 그대로 사용하고 있으며, 키워드와 날짜만 변경한 상태입니다.

strDate<-as.Date("2016-01-04")
endDate<-as.Date("2017-11-06")
qlist<-c("장애인")

Error in data.frame(titles, urls, presses, datetime, edittime, bodies) :
arguments imply differing number of rows: 2, 3

크롤링이 잘 진행되다가 다음과 같은 오류가 발생합니다. rows에 해당하는 index는 기사에 따라 다르게 발생하구요~
제가 R은 처음이라 혹시 다음부분에 예외처리를 통해 크롤링이 중단되지 않은채 다음 기사로 넘어갈 수 있는지, 행여나 다른 문제라면 해결 방법을 알려주시면 감사하겠습니다!!ㅎㅎ~

capture1

그리고 혹시 다음과 같이 크롤러가 중간에 멈춘 후 진행되지 않는 문제 또한 종종 발생합니다.
혹시 이문제에 대해서도 해결 방안이 있다면 답변 부탁드리겠습니다.

감사합니다^^~

getAllComment function

안녕하십니까, 선생님.

크롤링 소스코드를 감사하게 사용하고 있는 학생입니다.

사용 용도상 현재까지는 getComment.R만 사용하고 있었는데요.
getAllComment function의 실행에 문제가 있어서 질문을 여쭙고자 글을 남깁니다.

올려주신 함수 정의 코드는


getComment <- function(turl = url, pageSize = 10, page = 1, sort = c("favorite", "reply", "old", "new")) {
    sort <- sort[1]
    tem <- stringr::str_split(turl, "[=&]")[[1]]
    oid <- tem[grep("oid", tem) + 1]
    aid <- tem[grep("aid", tem) + 1]
    url <- paste0("https://apis.naver.com/commentBox/cbox/web_naver_list_jsonp.json?ticket=news&templateId=view_politics&pool=cbox5&lang=ko&country=KR&objectId=news",
        oid, "%2C", aid, "&categoryId=&pageSize=", pageSize, "&indexSize=10&groupId=&page=", page, "&initialize=true&useAltSort=true&replyPageSize=30&moveTo=&sort=",
        sort)
    con <- httr::GET(url,
                     user_agent("N2H4 using r by chanyub.park [email protected]"),
                     httr::add_headers(Referer = turl))
    tt <- httr::content(con, "text")
    tt <- gsub("_callback", "", tt)
    tt <- gsub("\\(", "[", tt)
    tt <- gsub("\\)", "]", tt)
    tt <- gsub(";", "", tt)
    tt <- gsub("\n", "", tt)
    data <- jsonlite::fromJSON(tt)
    print(paste0("success : ", data$success))
    return(data)

}

그리고


getAllComment <- function(turl = url)
{
  temp=getComment(turl,pageSize=1,page=1,sort="favorite")
  numPage=ceiling(temp$pageModel$totalRows/100)
  comments=sapply(1:numPage,getComment,turl=url,pageSize=100,sort="favorite")
  commentList=comments[10,]
  commentList=do.call(rbind, lapply(commentList, data.frame, stringsAsFactors=FALSE))
  return(comments=commentList)
}

이 둘인데요. getComment function은 아무 문제 없이 잘 됩니다.
그런데 pagesize는 크롤링하는 댓글 갯수이던데 page는 정확히 어떤 의미인지 여쭤볼 수 있을까요?
이런저런 parameter를 변경해 봤을 때 크롤링 댓글 수 최대가 100개인 것 같은데 그것은 어떤 이슈에
따른 것인 지, pagesize 100 page 3 이런식으로 300개를 가져오는 등
그 이상이 불가능한 것인지도요..
크롤링 초보의 수준이라 사용은 하되 정확한 코드 내용을 파악하지 못하여 기초적인 질문 드림을 양해해 주시기 바랍니다.

그리고 getAllComment 함수가 돌아가지 않아 구성을 살펴보았는데요.
우선은 numPage=ceiling(temp$pageModel$totalRows/100)
이부분이 numPage=ceiling(temp$result$pageModel$totalRows/100)
같습니다. 댓글이 가령 294일때 100으로 나눠 2.94 를 반올림하여
3페이지를 크롤링한다는 의미라고 생각되는데 dataframe경로를 잘못 받은 듯 합니다.

그런데 이를 수정해도 돌아가지 않아서 오타줄 밑의 코드들도 살펴 보았는데요..
예를들면 sapply가 잘 적용된 것이 맞는지 등등을요..
잘못된 부분이 있다면 찾아내어 말씀드려 코드 기여를 해드리고 싶었지만
위에 말씀드린 바와 같이 개인적으로 getComment 자체도 전체 알고리즘을 이해하고 있지 못해
정확히 어떤 이유로 함수가 안돌아가는지 찾아낼 수가 없었습니다.

이에 getAllComment 함수에 대한 문의를 드리고자 이슈에 글을 남깁니다.

바쁘실 텐데 긴 interruption으로 번거롭게 해 드려 죄송합니다.
혹시 가능하시다면 살펴봐주시길 부탁드리겠습니다. 감사합니다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.