forkonlp / n2h4 Goto Github PK
View Code? Open in Web Editor NEW네이버 뉴스 수집을 위한 도구
Home Page: https://forkonlp.github.io/N2H4/
License: Other
네이버 뉴스 수집을 위한 도구
Home Page: https://forkonlp.github.io/N2H4/
License: Other
안녕하세요 교수님
교수님께서 올려주신 코드로 열심히 공부해보려고하는 학생입니다.
네이버 뉴스 기사 크롤링을 하려고 교수님의 패키지로 구동해보았는데 잘 안돼서 질문을 남겨봅니다.
뉴스 리스트 페이지 내의 개별 네이버 뉴스 url들을 가져오는데까지는 되는데
가져온 url들의 정보를 가져오는데에서 newsData가 빈 리스트들로만 이루어집니다.
교수님께서 올리신 함수들은 고치지 않았는데 무엇이 문제일까요??
제가 보고 있는 코드는 다음과 같습니다.
`library(N2H4)
library(httr)
cate<-getMainCategory()
tcate<-cate$sid1[2]
subCate<-cbind(sid1=tcate,getSubCategory(sid1=tcate))
tscate<-subCate$sid2[1:2]
strDate<-"20180705"
endDate<-"20180705"
strTime<-Sys.time()
midTime<-Sys.time()
##파일 이름을 지정하면 한 파일에 이어 붙이고 ""로 놔두면 각 뉴스마다 파일을 따로 저장ㅎ
save_path <- ""
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)
}
urls <- setUrls(tcate, tscate, strDate, endDate)
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)
sub_urls <- c(sub_urls, setUrls(url$sid1, url$sid2, url$date, url$date, 1:max))
}
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()
newsList<-getUrlListByCategory(url$pageUrl)
newsData<-c()
///////////////////////////////////////문제라고 생각되는 부분입니다.///////////////////////////////////////
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)
}
})
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
newsData <- dplyr::bind_rows(newsData)
dir.create("./data",showWarnings=F)
#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=",")
}
}`
네이버의 연예뉴스에서 댓글을 가져오려는데 어떻게 하면 되나요?
snsList 컬럼이 list로 생성
제거함.
안녕하세요! 만들어주신 라이브러리 잘 활용하고 있습니다. 감사합니다
다름이 아니라 현재 카테고리별 크롤링을 활용하고 있는데 크롤링 하는 도중에 멈추는 현상이 발생합니다.
제가 짠 소스코드가 문제인지 해결할 방법이 보이지 않네요 ㅜㅜ 도와주시면 감사하겠습니다.
소스코드는 위키 내에 있는 예시를 활용하였습니다.
`
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
안녕하세요. 올려주신 코드로 처음 댓글수집을 해보려는 사용자입니다.
적혀있는대로 네이버 기사 링크를 올려서 댓글을 수집하려고하는데.
링크를 바꿔도 계속 같은 댓글이 수집 되더라구요.
library(N2H4) comment<-N2H4::getComment(turl="https://n.news.naver.com/mnews/article/001/0013162749?sid=104", pageSize = 100) comment$contents[[1]]
이 코드로 프로그램을 돌렸고
"2015 댓글은 없구료..."라는 댓글이 계속 처음에 등장합니다.
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
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는 유효하지 않습니다
package N2H4가 현재 제가 사용하고 있는 R버젼에서 사용이 불가능 합니다.
혹시 버젼 업을 해야하나요? 아니면 버젼 다운을 해야하나요?
알려주세요 ㅜㅜ
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했습니다.
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)
}
안녕하세요 박찬엽 선생님
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)
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도 수집 코드를 추가하는 것 정도 떠오르는데 적절한 처리 방법에 대한 고민이 필요할 것 같습니다
감사합니다 :)
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언어에서 인코딩 관련하여 찾아봤지만 문제를 해결할 수 없어서.. 혹시 어느 부분을 수정하면 될지 알 수 있을까요?
안녕하세요? 얼마전에 네이버 스포츠 뉴스 크롤링 관련 질문했던 학생입니다. 결과부터 말하면 현재 스포츠 기사 추출에는 잘쓰고있어서, 감사하단 말씀 드립니다. 그런데 댓글수집은 아직까지 못하고있어 질문드립니다.
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랑 종류가 다른 것인가요? 만약 그렇다면 등록을 안해서 사용을 못하는 것인지 궁금합니다.
현재 getcomment를 사용할 경우 pagesize가 100개가 넘어가면 100개까지 긁어오더라구요 확인 부탁드립니다.
차라리 파일을 합치는 코드를 공유하는게 빠를듯
안녕하세요.
R을 접하고 하나하나 배우고 있는 와중에 엄청난 소스를 발견한 것 같습니다.
먼저 이렇게 멋진 툴을 만들어주셔서 감사합니다.
오늘 테스트로 이틀치 뉴스를 다운받아봤는데요.
CVS 파일을 열어보니 한글이 다 깨져있네요.
인코딩을 바꿔야되나 싶어서 이리저리 시도해봐도 에러만 나는데
어쩌면 엄청 기초적인 문제일수도 있지만 혹시 해결책이 있을까요?
다시한번 멋진 툴 감사합니다! ^^
테스트 케이스도 없지만 통과 자체가 안되는 문제 확인요.
문자열 쪽 문제가 발생함.
안녕하세요~
향후 잘 사용해보고자 열심히 연습해보고 있습니다.
몇가지 질문을 드릴려고 합니다.
먼저 아래의 예와 같이 입력하였습니다.
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)))
}
질문드릴려고 하는 것은 이렇게 실행했을 때 아래와 같은 에러가 떳습니다.
[1] "질병모델동물"
Error in strsplit(result$cnt, "/") : 문자형을 가지지 않는 인자입니다
어떻게 해결하면 좋을 런지요?
둘째는 이게 그려졌다고 할때 검색기간을 장기간으로 했을 경우 혹시
월단위로 cnt를 count해서 표로 쉽게 할 수 있는 방안은 없을까요?
감사합니다.
카테고리 리스트내 뉴스 수집시 페이지 넘버별로 각각이이 아닌 하나에 이어서 붙일수 없을까요?
안녕하세요. R을 이용해 네이버 댓글 크롤링 하는 법을 배우던 중 좋은 패키지를 알게되었습니다. 편하게 사용할 수 있게 제공해 주셔서 감사합니다.
한가지 여쭤보고 싶은게 있습니다.
저는 rvest 패키지를 사용해 우선적으로 제가 댓글을 모으고 싶은 기사 url, 날짜, 기사제목, 언론사, 본문내용 등을 직접 수집하는데 까지는 성공했으나 댓글부분을 긁어오는게 rvest로 하면 자료가 넘어오질 않더라구요. (그래서 다른 방법을 찾아보다 보니 N2H4 패키지를 알게 되어 댓글을 수집 할 수 있었습니다.)
제가 추가로 얻고 싶은 데이터는 기사 본문 이후에 나오는 감정 클릭 수 (좋아요,훈훈해요,슬퍼요,화나요,후속기사 원해요)인데 이 부분 역시 해당 부분을 긁어오면 모두 '0' 으로 표시되는 문제가 있었습니다. 분명 웹에서 F12눌러 html상으로 확인해보면 클릭 숫자가 적혀있는데도요. 혹시 N2H4 패키지로 해당 기사의 좋아요 카운트를 긁어올 수 있는 방법이 있을까요? 아니면 혹시 다른 방법으로 좋아요 부분 카운트를 긁어오는 방법이 있을까요?
testthat을 사용하면 좋을 것 같아요
제가 https://github.com/forkonlp/N2H4/wiki/%EA%B2%80%EC%83%89%EC%96%B4-%EA%B8%B0%EB%B0%98-%EB%89%B4%EC%8A%A4-%EC%88%98%EC%A7%91
여기 있는 코드를 써서 크롤링을 하는데 진행시에 csv 파일이 생성되는데
생성될때마다 같은 내용밖에 없어서 질문드립니다...
뭐가 잘못 된걸까요??
여러 링크에서 본문을 받던 중 getContent 함수가 에러가 나는 네이버 링크를 발견 했습니다.
getContent("https://n.news.naver.com/mnews/article/277/0003204982?sid=106")
UseMethod("xml_find_all")에서 다음과 같은 에러가 발생했습니다:
클래스 "list"의 객체에 적용된 'xml_find_all'에 사용할수 있는 메소드가 없습니다
아마도 웹페이지의 형식이 네이버 "연애" 홈이라서 그런 것 같은데 한번 확인 부탁드리겠습니다.
<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>" 이런식으로 유니코드로나와서 쓸수가없는데 작성하신함수보니까 따로인코딩 주는곳은없어보이는데 어떻게해야 한글문서를 읽어들였을떄 온전히받을수잇나요?
코드상으로는 없는것 같지만 댓글정보 중 그 댓글의 성별을 나타낼 수 있는 속성도 같이 있는지 궁금합니다. 현재 코드에 없다면, 아예 방법이 없을지요?
안녕하세요, 패키지 공유해주셔서 항상 감사드립니다.
기사들을 섹션 별로 분류가 필요하게 되어 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 사용시에 주소형식에 따라 저장이 안되는 문제가 있어서 문의드리고자 합니다.
똑같은 링크로 가는 두개의 주소입니다. 그러나 위의 링크는 아무 댓글도 받아지지 않고 아래의 경우에는 댓글이 잘 받아집니다.
어떤 이유인지 확인해주실 수 있을까요? 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.
Useforce = 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=""))
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번의 에러가 나오네요 ㅠㅠ 저 딴에는 이것저것 시도해 보았지만 너무 초보자라 역부족입니다.
잘 만들어 주셔서 잘 쓰고 싶은데 잘 안되네요
바쁘시겠지만 이럴땐 어떻게 해야 하는지 알려주시면 감사하겠습니다~
덧붙여 다른 코멘트를 보니 아직 예시를 안만드셨다고 하셨는데 그럼 지금 패키지로 특정 키워드 크롤링도 가능한 건가요?
잘 쓰고 싶어서 열심히 매달려봅니다. 부탁드립니다.
N2H4 유튜브 보고 설치를 하고 나니 아무생각이 없네요...
감사합니다.
Error in open.connection(x, "rb") :
Server returned nothing (no headers, no data)
in windows 10
i doubt something like below link.
https://curl.haxx.se/mail/lib-2008-01/0194.html
현재 커버리지가 42%여서 확대의 필요성 증대.
0.4.8의 리펙토링에서 효용성 확인함.
안녕하세요! 저번에 크롤링 도중 R이 멈추는 현상에 대해서 질문한 사람입니다.
정말 라이브러리 잘 활용하고 있습니다. 감사합니다
다름이 아니라 크롤링 도중 멈추는 현상을 해결하고자 이리저리 굴러봤습니다만 아직 해결을 못하고 있습니다.
의심가는 부분이 getContent에서 Sys.sleep() 을 할때 일어나는 현상인거 같습니다.
그래서 sleep_time 의 default 값을 변경하여 실행을 해보려고 하였으나 현재 코드에서는 Sys.sleep(abs(sleep_time)) 이 아닌 Sys.sleep(abs(rnorm(1))) 으로 되어있어 sleep_time을 변경하여도 변경이 되지 않습니다.
혹시 한번 확인 부탁드려도 될까요?
문제가 발생해서 cran에서 내려가 있음.
우선 readme에 개발버전 설치 방법을 공유해 두었음.
다시 등록해야 함.
안녕하세요! 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은 처음이라 혹시 다음부분에 예외처리를 통해 크롤링이 중단되지 않은채 다음 기사로 넘어갈 수 있는지, 행여나 다른 문제라면 해결 방법을 알려주시면 감사하겠습니다!!ㅎㅎ~
그리고 혹시 다음과 같이 크롤러가 중간에 멈춘 후 진행되지 않는 문제 또한 종종 발생합니다.
혹시 이문제에 대해서도 해결 방안이 있다면 답변 부탁드리겠습니다.
감사합니다^^~
안녕하십니까, 선생님.
크롤링 소스코드를 감사하게 사용하고 있는 학생입니다.
사용 용도상 현재까지는 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으로 번거롭게 해 드려 죄송합니다.
혹시 가능하시다면 살펴봐주시길 부탁드리겠습니다. 감사합니다.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.