Git Product home page Git Product logo

Comments (90)

ejhan12 avatar ejhan12 commented on May 30, 2024 6

N2H4 사용 잘 하고 있습니당!
만들어 주셔서 감사합니당:)
한 가지 부탁드릴 사항은,
특정 키워드를 포함하는 뉴스만
크롤링하는 기능을 추가가능하시다면 추가부탁드립니당 ㅠ_ㅠ

from n2h4.

coldskys avatar coldskys commented on May 30, 2024 2

아, 제가 에러나는 부분만 적다 보니;;;;;
여러모로 감사드립니다.^^

from n2h4.

coldskys avatar coldskys commented on May 30, 2024 1

감사합니다.

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024 1

편리한 코드 공유 정말 감사합니다!
덕분에 덜 헤매게 됐습니다.
DNH4 의 getComment 의 인증과정도 잘 풀리길 기원합니다ㅎㅎ

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024 1

@hellojanehi 안녕하세요! 코드를 보여주시면 도움을 드릴 수 있을 것 같습니다. 혹시 어떤 내용으로 하고 싶으신지도 설명해주시면 좋을 것 같아요. 공개된 곳이 어려우시면 [email protected]로 메일 주세요 감사합니다.

from n2h4.

coldskys avatar coldskys commented on May 30, 2024 1

@mrchypark 언제나 친절한 답변에 감사 드립니다.^^

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024 1

@coldskys 우선 이렇게 해보세요.

MaxpageNum <- function(turl = url) {
  r=GET(turl)
  h=read_html(r)
  totalnum<-html_nodes(h,'.result_num')  #<div class="result_header">  <h3>검색결과</h3> 이럴때
  # html_nodes(h,'.result_header h3') 이런식으로 쓰면"검색결과"라는 텍스트를 가져옴.
  nums=html_text(totalnum)
  nums <- gsub("\r", "", nums)
  for(h in 1:10){# 관련 뉴스가 10개 이하일 경우 1 ~ 1, 1 ~ 2, ...,1 ~ 10 모두 처리 가능하게 코딩.
    nums <- gsub(paste0("1 ~ ",h," / "),"",nums)
  }
  nums <- gsub("\t","",nums)
  nums <- gsub("\n","",nums)
  nums <- gsub("\\(","",nums)
  nums <- gsub("\\)","",nums)
  nums <- gsub("건","",nums)
  nums <- gsub(",","",nums)
  nums<-as.numeric(nums)
  result<-as.integer(nums/10 +1)
  if(identical(nums,numeric(0))){
    result<-0
  }else{
    if( nums%%10 == 0){
      result=result-1
    }
  }
  return(result)
} 

from n2h4.

coldskys avatar coldskys commented on May 30, 2024 1

@jongrom2 으학~~~ 무례한 부탁에 이렇게 친절하게 답해주셔서 감사합니다.^^
시험 잘 보시고, All A받고 장학금도 받으시길~ ^^

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024 1

@YoonHo9 안녕하세요, 아마 이렇게 하시면 될겁니다. https://github.com/forkonlp/N2H4/wiki/%EC%98%A4%ED%94%BC%EB%8B%88%EC%96%B8-%EC%A0%84%EC%B2%B4-%EC%88%98%EC%A7%91

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@ejhan12 안녕하세요 이렇게 관심가져주셔서 감사합니다! 키워드 검색 결과의 뉴스 크롤링 코드는 제가 아직 예시로 작성하지 못했습니다. ㅠ_ㅠ 업데이트 되면 꼭 알려드릴께요 감사합니다.

from n2h4.

smnoh avatar smnoh commented on May 30, 2024

안녕하세요. 코드 예시 올려주신거 잘 쓰고 있습니다. 질문이 하나 있는데 try-error 가 발생하여 뉴스를 가져오지 못하는데 이를 해결할 방법이 있을까요?
try again: 오류 url <- 여기서 오류 url을 직접 들어가보면 sport 뉴스가 나오더라구요..
감사합니다.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@smnoh 안녕하세요! sport 뉴스는 페이지 형식이 달라 수집할때 에러를 줍니다. 스포츠 뉴스 내용까지 필요하신 거라면 스포츠 뉴스용 getContent를 작성하셔야 합니다. 감사합니다.

from n2h4.

yoonjaej avatar yoonjaej commented on May 30, 2024

getComment는 https://apis.naver.com/commentBox/cbox/web_naver_list_jsonp.json로 이뤄진 비공개 네이버의 API를 사용하여 댓글들을 긁어오는 것 같은데, 저 API는 어떻게 찾으셨는지 궁금합니다!

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@pumpy7 크롬의 개발자 도구에서 network 부분을 보면 좀 도움이 됩니다. 브라우저가 서버에게 요청해서 받아오는 파일들이 어떤 시간순으로 들어오는지와 어떤 파일이 있는지를 볼 수 있는 곳이거든요. 개발자 도구를 잘 사용하는게 크롤링 코드를 잘 짜는데 도움이 되는거 같습니다.

from n2h4.

claudepark avatar claudepark commented on May 30, 2024

네이버 뉴스 크롤링 저작권 이슈는 없는건가요?

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@claudepark 제가 설명하는 것 보다는 http://blogchannel.tistory.com/attachment/[email protected] 여기를 참고하시면 좋을 것 같습니다. 저작권 관련 정보는 www.copyright.or.kr, 뉴스 저작권에 대해서 http://www.kpf.or.kr/site/kpf/copyrightmain.do 여기를 확인해 주세요.

from n2h4.

claudepark avatar claudepark commented on May 30, 2024

@mrchypark 감사합니다. 혹시 네이버 뉴스 크롤링 자체에 대해서는 문제가 될 여지는 없을까요?

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@claudepark 제가 전문가가 아니다 보니 대답이 조심스러워 지네요. 혹시 왜 궁금하신지 알 수 있을까요?

from n2h4.

claudepark avatar claudepark commented on May 30, 2024

@mrchypark 아 크롤링에 관심이 많은데 법적인 이슈에 대한 레퍼런스를 찾기가 어려워서.. @mrchypark 님이 혹시나 관련 정보 알고있나싶어서요.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@claudepark 그렇군요. 제가 알기로는 크롤링 행위 자체는 윤리적 문제(서버의 과다 사용)를 제외하면 법적인 문제는 없는 것으로 알고 있습니다. 저는 그렇게 알고 있는데 실제로 그런지는 아마 변호사 분들에게 확인해봐야 할 것 같아요. 물론 크롤링을 한 이후에 그것을 어떻게 사용하는지에 따라 문제가 되는데, 기사는 배포에 여러 조건에 따라 저작권 침해냐 아니냐가 달라집니다. 위에 링크를 보시면 자세한 설명이 되어 있습니다. 기사 이외의 것들에 대해서도 데이터베이스권 등 해당되는 범위에 따라 적용되는 방식이 약간씩 다른 것으로 알고 있습니다. 도움이 되셨는지 모르겠네요.

from n2h4.

parkseungri avatar parkseungri commented on May 30, 2024

코드 잘 쓰고 있습니다. 어떤 분도 말씀하셨지만 특정 키워드 를 포함하는 뉴스만 크롤링 하는 기능도 알려주신다면 더 좋을것 같아요 ㅠ_ㅠ

from n2h4.

yoonjaej avatar yoonjaej commented on May 30, 2024

@mrchypark @parkseungri 사실 제가 mrchypark님의 코드를 사용하여 특정 키워드를 포함하는 뉴스 및 댓글 들 크롤링 코드를 요새 짜고있습니다.

@mrchypark 만 괜찮으시다면, 같이 작업을 해보고 싶습니다 !

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@pumpy7 안녕하세요! 코드 제안은 언제나 환영입니다. 작업물 공개해주시면 정말 감사하겠습니다.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@parkseungri 안녕하세요 맞습니다. 여러분들의 니즈가 그쪽에 맞춰져 있는 것 같습니다. 이게 사용하기 좋은 코드로 작성하는데 조금 어려움이 있다보니 고민에 시간이 더 많이 들어가서 아직 엄두를 못내고 있습니다. 위에 @pumpy7 님께서 작업하시는게 있다니 한번 준비해보겠습니다. 감사합니다!

from n2h4.

kumensa avatar kumensa commented on May 30, 2024

_### 제가 R 초보자라서 기초적인 질문을 드립니다.

  1. 아래 설명해주신 사항을 구체적으로 예시를 들어주실 수 있으신지요?
    가령 [getComment(url) 의 형태로 작성했으며 pageSize, page, sort를 설정] 을 어떻게 해야할까요?

  2. 실제 comment를 보니 첫 페이지의 댓글만 수집이 됩니다. 이 문제를 어떻게 해결할 수 있을까요?

고맙습니다. ^^

==============================
필요한 부분이 다를 것이라 생각해 그대로 두었습니다.
getComment(url) 의 형태로 작성했으며 pageSize, page, sort를 설정할 수 있습니다.
sort는 총 4가지로 "favorite","reply","old","new" 가 있으며
favorite 호감순, reply 답글순, old 과거순, new 최신순 입니다.

댓글 정보인 성별 비율, 연령대 비율 등 데이터도 확인 할 수 있어 유용해 보입니다.
쓸모 없는 데이터도 많아서 한번 정리해서 옵션화 해보겠습니다.
getComment(url)$result$commentList[[1]] 하시면 익숙한 data.frame 형태로 댓글 데이터를 보실 수 있습니다.
====================_

from n2h4.

sojohnny avatar sojohnny commented on May 30, 2024

devtools::install_github("forkonlp/N2H4") 명령어로 N2H4를 설치하려했는데

ERROR: dependencies 'bitops', 'xml2', 'rvest', 'lubridate', 'RCurl' are not available for package 'N2H4'

  • removing 'C:/Users/johns/OneDrive/문서/R/win-library/3.3/N2H4'
    Error: Command failed (1)

라는 메시지가 뜨면서 설치되지 않습니다.
혹시나 하여 구글링 후 bitops xml1 rvset lubridate RCurl 모두 패키치 설치하고 구동까지 한 상태에서
재시도해봤는데 계속 같은 에러 메시지가 뜨네요.
왜 이럴까요..?

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

아이구 질문이 밀렸군요.

@kumensa pageSize = 10 의 설정이 10이 기본으로 되어 있어서 최초 10개만 가져오는 겁니다. 최대 100개까지 가능한 것으로 알고 있습니다. 감사합니다.

@sojohnny 안녕하세요 혹시 devtools::install_github("forkonlp/N2H4") 부터 에러메세지까지 전체 내용을 보여주실 수 있으신가요? 그것과 sessionInfo() 실행후 결과 전부도 부탁드립니다. 감사합니다.

from n2h4.

Take22 avatar Take22 commented on May 30, 2024

getcomment 로 댓글을 긁어오니까 comment box 에 있는 내용을 전부 가져오는 거 같은데요 댓글만 가져오거나 하는 다른 방법이 있을까요? 아니면 받아온 결과를 제가 따로 파싱해서 써야할 까요 ?

그나저나 정말 잘 만드셨네요. 정말 유용하게 사용하고 있고요. 하던게 마무리 되면 결과도 공유하겠습니다. 감사합니다~

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@Take22 안녕하세요. 대상 뉴스 url을 url이라고 하면 getComment(url)$result$commentList[[1]] 이렇게 해보시면 필요한 내용만 있을 겁니다. getComment 함수로 받는 데이터가 json이라 결과가 list 자료형으로 나와서 그렇습니다. 위에 명령을 실행해 보시면 아마도 필요하신 내용이지 않을까 싶습니다.

from n2h4.

KyungbinChoi avatar KyungbinChoi commented on May 30, 2024

정말 감사합니다. 한가지 여쭤 볼게 있는데요.
제가 getUrlListByQuery 로 제목과 링크를 가져오는 과정에서 페이지에 따라 에러가 나는 경우도 있고 안나는 경우도 나타납니다 ㅜ
target url 은 네이버 뉴스 검색에서 특정 키워드를 포함하면서 특정 기간에 쓰여진 기사들을 검색한 페이지 입니다.
"http://news.naver.com/main/search/search.nhn?query=%C0%CE%B0%F8%C1%F6%B4%C9&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=all.basic&ic=all&so=rel.dsc&stDate=range:20160403:20160403&detail=0&pd=4&r_cluster2_start=11&r_cluster2_display=10&start=11&display=10&startDate=2016-04-03&endDate=2016-04-03&page=1"

image

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@KyungbinChoi 안녕하세요 링크도 함께 제공해 주셔서 감사합니다. 한번 확인해 보고 다시 댓글 달겠습니다. 감사합니다!

from n2h4.

yuri01 avatar yuri01 commented on May 30, 2024

유용한 코드 정말 감사합니다.
저도 @KyungbinChoi 님과 같은 에러가 나고 있는데요. new_title와 new_links 갯수가 불일치문제를 어떻게 해결할수 있을까요?

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@KyungbinChoi @yuri01 안녕하세요 문제를 다시 상기시켜 주셔서 감사합니다. 우선 news_title을 강제로 "dummy"로 바꿔서 갯수 불일치 문제가 나지 않도록 우회해놨습니다. getContent로 제목을 가져올 수 있으니 getUrlListByQuery 에서 제목을 안 가져오게 해둔 것인데, 링크와 제목까지만 필요한 경우도 있는거 같아 아직 고민중입니다. 개선하게 되면 버전업하면서 readme에 명시하겠습니다. 감사합니다.

from n2h4.

yuri01 avatar yuri01 commented on May 30, 2024

빠른 해결 정말 감사합니다! 큰 도움이 되었습니다^^

from n2h4.

KyungbinChoi avatar KyungbinChoi commented on May 30, 2024

와우 정말 감사합니다!!! ^^

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024

안녕하세요~! 위에 보면 1월달에 감사인사를 남겼던 대학생입니다.
다름이 아니라 제가 그때 졸업논문 때매 주요정치인의 이름이 포함된 기사들의 댓글 수집을 했었는데요.
여기서 특정키워드를 포함하는 뉴스 크롤링하는 코드 얘기가 나온 것을 보고 공유하려고 합니다.
댓글 크롤링하는 법은 기존과 동일해서 생략했습니다. ㅎㅎ
깃허브에 코드 올려본 적이 없는데... 여기다 이렇게 올려도 되나요...;;;

library(rvest)
library(N2H4)
library(httr)

#getMaxpageNum 함수 대신 새로 만듬. 같은 기능을 함.
MaxpageNum <- function(turl = url) {
  r=GET(turl)
  h=read_html(r)
  totalnum<-html_nodes(h,'.result_num')  #<div class="result_header">  <h3>검색결과</h3> 이럴때
  # html_nodes(h,'.result_header h3') 이런식으로 쓰면"검색결과"라는 텍스트를 가져옴.
  nums=html_text(totalnum)
  nums <- gsub("\r", "", nums)
  for(h in 1:10){# 관련 뉴스가 10개 이하일 경우 1 ~ 1, 1 ~ 2, ...,1 ~ 10 모두 처리 가능하게 코딩.
    nums <- gsub(paste0("1 ~ ",h," / "),"",nums)
  }
  nums <- gsub("\t","",nums)
  nums <- gsub("\n","",nums)
  nums <- gsub("\\(","",nums)
  nums <- gsub("\\)","",nums)
  nums <- gsub("건","",nums)
  nums <- gsub(",","",nums)
  nums<-as.numeric(nums)
  result<-as.integer(nums/10 +1)
  
  if( nums%%10 == 0){
    result=result-1
  }
  return(result)
} 

#getUrlListGetByCategory 함수 대신 새로 만듬. 카테고리의 구분이 없이 가져옴.
UrlListGet <- function(turl = url, col=c("titles","links")){
  r=GET(turl)
  h=read_html(r)
  tit<-html_nodes(h,'.ct .info .head_social a') %>% html_attr("data-title")  #<div class="result_header">  <h3>검색결과</h3> 이럴때
  # html_nodes(h,'.result_header h3') 이런식으로 쓰면"검색결과"라는 텍스트를 가져옴.
  title<-tit 
  lin<-html_nodes(h,'.ct .info a')
  link<-lin %>% html_attr("href")
  linkss<-link[-c(which(link=="#"))]  # 주소외에 #이 중간중간 들어가서 그것들을 제거.
  
  linklen=length(link)
  i=1
  
  if(linklen==1&&link[1]=="#"){
    link<-append(link,"#",after=i)
    linklen=linklen+1
    link[i]="##"
  }
  while(i <= linklen-1){
    
    if(link[i]=="#"){
      if(i==1){
        link<-append(link,"#",after=i)
        linklen=linklen+1
        link[i]="##"
      }
      else if(link[i+1]=="#"){  # 각 페이지의 첫 기사가 네이버뉴스화되어 있지 않으면 연속으로 ##이 생기지 않음.
        link<-append(link,"##",after=i)
        linklen=linklen+1
      }
    }
    i=i+1
  }
  
  
  for(i in 1:length(link)){
    if(link[i]=="##"){
      title[as.integer(i/2)+1]<-"#"
      
    }
  }
  
  if(length(title[title=="#"])>0){
    titless<-title[-c(which(title=="#"))]  # navernews주소가 없는 기사는 #처리해서 일괄적으로 제거.
  }
  else{
    titless<-title
  }
  newsList<- data.frame(titles = titless, links = linkss, stringsAsFactors = F)
  
  return(newsList[,col])
  
}




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

#제목에 검색어가 속한 뉴스만 검색
#최신순#http://news.naver.com/main/search/search.nhn?query=%B9%AE%C0%E7%C0%CE&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=title.basic&ic=all&so=datetime.dsc&stDate=range:20170101:20170101&detail=0&pd=4&start=1&display=10&startDate=2017-01-01&endDate=2017-01-01&page=1
#관련도#http://news.naver.com/main/search/search.nhn?query=%B9%AE%C0%E7%C0%CE&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=title.basic&ic=all&so=rel.dsc&stDate=range:20170101:20170101&detail=0&pd=4&r_cluster2_start=11&r_cluster2_display=10&start=11&display=10&startDate=2017-01-01&endDate=2017-01-01&page=1

#여기선 최신순으로 함
#최신순으로 해야 메인 기사에 딸린 기사가 없음.

# 목표 날짜를 지정합니다.
# month 바뀔 때마다 아래 if문 만들어서 직접 넘기기~!
strDate<-"20170215"
endDate<-"20170315"

keyList<-c("박근혜","문재인","안희정","안철수",
           "이재명","홍준표","손학규","유승민")
flag=0
date=strDate
for(j in 1:length(keyList)){#박근혜부터 시작 
  flag=0
  date=strDate
  while(as.numeric(date)<=as.numeric(endDate)){
    
    print(date)
    urlbeforeKeyword="http://news.naver.com/main/search/search.nhn?query="
    urlkeyword=URLencode(keyList[j])  #검색어 입력
    urlafterkeyword=paste0("&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=title.basic&ic=all&so=datetime.dsc&stDate=range:",date,":",date,"&detail=0&pd=4&start=1&display=10&startDate=",substr(date,1,4),"-",substr(date,5,6),"-",substr(date,7,8),"&endDate=",substr(date,1,4),"-",substr(date,5,6),"-",substr(date,7,8))
    
    print(paste0(" start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
    midTime<-Sys.time()
    pageUrl=paste0(urlbeforeKeyword, urlkeyword, urlafterkeyword)
    # 리스트 페이지의 마지막 페이지수를 가져옵니다.
    #max<-getMaxPageNum(pageUrl)
    max<-MaxpageNum(pageUrl)
    SumData<-c()
    for (pageNum in 1:max){
      print(paste0(pageNum, " start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
      midTime<-Sys.time()
      # 페이지넘버를 포함한 뉴스 리스트 페이지의 url을 생성합니다.
      
      pageUrl1=paste0(pageUrl,"&page=",pageNum)
      # 뉴스 리스트 페이지 내의 개별 네이버 뉴스 url들을 가져옵니다.
      #newsList<-getUrlListByCategory(pageUrl)
      #newsData<-c()
      
      newsList<-UrlListGet(pageUrl1)
      newsData<-c()
      flag2=0
      # 가져온 url들의 정보를 가져옵니다.
      for (newslink in newsList$links){
        ## 불러오기에 성공할 때 까지 반복합니다.
        # 성공할때 까지 반복하면 못나오는 문제가 있어서 5회로 제한합니다.
        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(tryi==5){
            flag2=1
          }
        }
        if(flag2==1){#datetime가져오는데 실패한 것들은 저장안하고 next로 넘김.
          flag2=0
          next
        }
        if(class(tem$datetime)[1]=="POSIXct"){
          newsData<-rbind(newsData,tem)
        }
      }
      dir.create("./data",showWarnings=F)#폴더 만들기 
      
      SumData<-rbind(SumData,newsData)
    }
    write.csv(SumData, file=paste0("./data/news",URLdecode(urlkeyword),date,".csv"),row.names = F)
    SumData<-c()
    
    if(as.numeric(date)==20170228){
      date="20170301"
    }
    else{
      date=as.character(as.numeric(date)+1)
    }
  }
}

다른 사람한테 공유할 줄은 몰랐어서;; 주석이 별로 없네요...ㅠㅜ

부족하지만 도움이 되었으면 좋겠습니다^^;

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@jongrom2 감사합니다! 저도 찬찬히 보고 wiki에 반영하도록 하겠습니다. ㅎㅎ 커스텀 하신 부분이 많아서 저도 공부가 많이 되겠네요. 다시 한번 감사합니다!!

from n2h4.

hellojanehi avatar hellojanehi commented on May 30, 2024

안녕하세요! 코드에 대해서 아예 모르는 상황이었는데 보면서 공부도 하고 열심히 적용해 보고 있습니다. 정말 감사드려요 :)
제가 getUrlListbyQuery를 사용 중에 검색창(base_url)의 페이지를 넘겨서 모두 뽑아내고 싶은데, for문 적용이 안됩니다ㅜㅜ 정말 수십번을 시도하다가 아예 base_url의 400페이지까지를 csv 파일로 만들었어요.
질문드리고 싶은 것은, for문을 아예 넣어서 검색창 1,....,400페이지를 넘기며 모든 UrlList를 뽑아내는 방법 혹은, csv파일을 넣었을 때 link의 모든 줄이 적용될 수 있는 방법 좀 알려주시면 감사하겠습니다ㅠ!!!

from n2h4.

coldskys avatar coldskys commented on May 30, 2024

jongrom2님께서 만들어 주신 소스를 테스트 해봤는데, 너무 훌륭해서 눈물이... ㅠㅠ

그런데 jongrom2님의 만들어 주신 소스에 리플을 가지고 오는 기능이 빠져서, 각 링크별로 리플을 가져오게 할려고,

replyData <- getComment(turl = newslink, pageSize = 30, page = 1, sort = c("favorite"))#댓글 sort "reply", "old", "new"

이 줄을

  # 가져온 url들의 정보를 가져옵니다.
  for (newslink in newsList$links){
    ## 불러오기에 성공할 때 까지 반복합니다.
    # 성공할때 까지 반복하면 못나오는 문제가 있어서 5회로 제한합니다.
    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(tryi==5){
        flag2=1
      }
    }
    if(flag2==1){#datetime가져오는데 실패한 것들은 저장안하고 next로 넘김.
      flag2=0
      next
    }
    if(class(tem$datetime)[1]=="POSIXct"){
      newsData<-rbind(newsData,tem)
    }
  }

이 뒤에 넣어보고, 또는

  for (newslink in newsList$links){
    ## 불러오기에 성공할 때 까지 반복합니다.
    # 성공할때 까지 반복하면 못나오는 문제가 있어서 5회로 제한합니다.
    tryi<-0
    tem_reply<-try(getComment(newslink), silent = TRUE)
    while(tryi<=5&&class(tem_reply)=="try-error"){
      tem_reply<-try(getComment(newslink), silent = TRUE)
      tryi<-tryi+1
      print(paste0("try again: ",newslink))
      if(tryi==5){
        flag2=1
      }
    }
    if(flag2==1){#datetime가져오는데 실패한 것들은 저장안하고 next로 넘김.
      flag2=0
      next
    }
    if(class(tem_reply$datetime)[1]=="POSIXct"){
      newsData<-rbind(newsData,tem_reply)
    }
  }

이렇게 소스도 바꿔봤는데, 계속 에러만 뜨고 멈추더라구요.
이게 뉴스 안에서도 리플들의 페이지수가 따로 있으니, 별도의 소스를 추가해줘야 할것 같은데... 제 일천한 실력으로는 소스를 명확히 해석하는 것도 어렵네요.

염치없지만, 혹시 도움을 주실 수 있을까요?

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@coldskys님 안녕하세요. getComment 함수는 data.frame 형태가 아니라 list형태로 출력하고, $datatime 컬럼을 가지고 있지 않습니다. 이부분을 수정하셔야 하지 않을까 싶습니다. 그리고 getComment 함수는 네이버 뉴스의 페이지 url을 인풋으로 받아서 리플 페이지를 추척해서 가져오는 형태로 되어 있습니다. 감사합니다.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@jongrom2 님 코드를 다른 분들께서 사용하셔서 겸사겸사 작성된 부분에 대해 미흡하지만 코멘트하려고 합니다. 기분 나쁘지 않으셨으면 좋겠습니다. maxPageNum의 원래 함수는 100페이지씩 확인하는 형태를 띄고 있습니다. 네이버뉴스 검색과 카테고리 페이지는 너 높은 페이지수를 줘도 가장 높은 페이지의 화면을 보여주는 구조로 설계되어 있어서 그렇게 작성했습니다. 검색 페이지의 첫 화면에 나오는 검색수는 네이버에서 결과량을 추청해서 보여줍니다. 그래서 마지막 페이지에 가까울 수록 숫자가 수정되는 부분이 있습니다. 최근 400페이지까지만 제공하는 제한을 걸어서 실제 검색량에 가깝게 하는 방법으로 날짜 구간을 줘서 페이지수가 많지 않게 검색하는 방법이 있을 것 같습니다. 그렇다면 보여주는 검색량이 신뢰성 있는 데이터이기 때문에 위에 수정 작성해주신 MaxpageNum 함수가 의미가 있을 듯 합니다.

그리고 작성해주신 UrlListGet 의 경우 getUrlListByQuery와 같은 기능이지 않나 조심스럽게 의견드립니다.

사용해주시는 모든 분들께 감사드리며 검색어 기반 크롤링 코드에 대해서 설명드릴 부분이 있습니다.
네이버 뉴스 검색 페이지는 생각보다 꽤 복잡하게 구성되어 있습니다.
우선 비슷한 뉴스를 묶어서 보여주고, 네이버뉴스에 올라가 있지 않은 내용도 검색에 포함됩니다.
지금 크롤러는 네이버에 올라가 있지 않으면 가져올 수 없는 구조로 되어 있습니다.

이런 점 때문에 검색어 기반 기능이 아직은 취약한 실정이고 @jongrom2 님께서 작성해주신 덕분에 조금 정리해볼 기회가 생겼습니다. @jongrom2 님께서 코드를 공개해 주신만큼 정리해서 참고해서 볼 수 있도록 진행해 보겠습니다.
@coldskys 님께서 댓글 수집부분을 같이 이야기하셔서 첨언 드리면 각 뉴스 마다 댓글이 없을수도, 매우 많을 수도 있습니다. 그러다 보니 뉴스 수집과 같은 형태로 코드를 작성하시면 문제가 있을 수 있습니다. 조만간 댓글 수집에 대한 코드도 작성해보도록 하겠습니다. 감사합니다.

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024

@coldskys url수집과 댓글수집을 동시에 하려고 하지말고 따로따로 시도해보세요! 그렇게 하면 어디서 고장났는지 알기도 쉬워서 고치기도 쉽고 독립적으로 다른 곳에도 적용할 수 있어서 좋아요~~!
댓글수집하는 코드도 올려드릴 수 있습니다. 버그는 댓글 100만개 넘게 수집할 동안 한 번도 없었습니다. (버그가 생긴다면 아마... 2/28에서 3/1 되듯 달이 넘어갈 때 날짜변경을 적절히 안해주시면 200% 버그생깁니다ㅎㅎ)

@mrchypark UrlListGet의 경우 getUrlListByQuery와 같은 기능인 것 같습니다! 그때 당시에는 이미 있는 줄 몰랐습니다.ㅠㅜ 그리고 maxPageNum의 원래 함수가 제가 할 때 가끔 오류가 떠서 100페이지씩 확인할 필요없이 한 번에 Maxpage를 알수있도록 만들었던 것 같습니다! 검색수를 네이버에서 결과량을 @추정해서 보여주는 지는 몰랐습니다. 확실한 숫자라고 생각했어요.

그리고 검색어 기반 크롤링 코드에 대해 설명해주신 부분에 대해서 말씀드릴게있습니다.
일단 비슷한 뉴스를 묶어서 보여주는 것은 url의 성격을 관련도순이 아니라 최신순으로 하시면 비슷한 뉴스가 묶여서 보이지 않습니다.
관련도순 url =http://news.naver.com/main/search/search.nhn?query=%B9%AE%C0%E7%C0%CE&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=all.basic&ic=all&so=rel.dsc&stDate=range:20170607:20170608&detail=0&pd=4&start=1&display=10&startDate=2017-06-07&endDate=2017-06-08&dnaSo=rel.dsc

최신순 url = http://news.naver.com/main/search/search.nhn?query=%B9%AE%C0%E7%C0%CE&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=all.basic&ic=all&so=datetime.dsc&stDate=range:20170607:20170608&detail=0&pd=4&r_cluster2_start=1&r_cluster2_display=10&start=1&display=10&startDate=2017-06-07&endDate=2017-06-08&dnaSo=rel.dsc

잘 보시면 so=datetime.dsc가 최신순, so=rel.dsc 는 관련도순입니다.

네이버 뉴스에 올라가 있지 않은 내용은 가져올 수 없는 구조이길래 제가 만든 UrlListGet함수에서는 네이버 뉴스에 올라가 있지 않은 뉴스를 제외하고 가져옵니다. 주석에 네이버 뉴스가 아닌 것들은 일괄적으로 제거해버린다고 써놓았습니다.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@jongrom2 오 최신순이라는 방법이 있는지는 몰랐네요 좋은 정보 감사드립니다! 혹시 페이지에 네이버뉴스가 없는 경우는 그냥 넘어가는 구조인지 궁금합니다. 제가 시도 할때는 이게 문제가 되서 중간에 에러나는데 우회할 마땅한 방법이 생각이 안나더라구요.ㅎㅎ;;

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024

@mrchypark 페이지에 네이버 뉴스가 없는 경우 일단 받았다가 네이버 뉴스화 안되어있는 것은 일괄삭제하기 때문에 저장을 하는 행위를 해도 아무것도 저장이 안되고 넘어갈 것입니다. 그것과 관련된 에러가 발생한 적이 없어서 아마도 알아서 잘 넘어가는 것 같습니다.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@jongrom2 감사합니다. 코드를 찬찬히 다시 한번 보겠습니다.

from n2h4.

coldskys avatar coldskys commented on May 30, 2024

@jongrom2 아, 제가 버그가 있다고 한건 제가 코드를 잘못 짜서 그런것입니다.^^
저도 덕분에 잘 쓰고 있습니다.

댓글 수집코드도 올려주실 수 있다고 하셨는데, 공유해주시면 백만의 감사를 드리겠습니다.^^

무리하고 무식한 글에 친절한 답변 감사드립니다.^^

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@coldskys @jongrom2 두분 모두 감사드립니다. ㅎㅎ 뭔가 텍스트로만 쓰니까 딱딱하게 대화하는 것 같기도 한데 그냥 제 감성이 메마른걸로 이해해 주세요ㅠ_ㅠ

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024

@coldskys 댓글 수집 코드입니다. 순전히 제 필요에 맞춘 코드입니다. 저는 개발할때는 두 개 따로 사용하다가 어느 정도 안정적으로 되면서부터는 URL수집하는 거 아래에 붙여서 사용했어요 ㅎㅎ 그 아래에 또 붙이고 또 붙이고 해서 ALLinONE파일로 수집,분석을 한 번에 하면 편합니다.
@mrchypark 아니에요~ㅎㅎ 많은 사람들의 질문이나 코드를 읽고 답변하고 질문받아주시는 것도 시간, 생각이 많이 소모되는 일일텐데 매번 정성껏 답변하시는 것 보고 많이 배웁니다.

제가 나중에 여기서 확장하려고 하는 부분이 있어서 의견을 듣고 싶습니다! 1 개월치 댓글을 크롤링하려면 몇 시간씩 걸려서 불편한데요. 멀티프로세싱(정확히는 멀티스레딩(multithreading)일지도...)을 이용하면 동시에 여러 URL에 요청을 보내고 동시에 받고 Sequence number 같은 걸로 순서만 정해주면 될 것 같은데 어떻게 생각하시나요?... 멀티프로세싱을 제대로 해본 적이 없어서...가능할까요?


library(N2H4)
library(iterators)
library(dplyr)#arrange 함수를 위해

sessionInfo()

#strDate<-"20170316"
#endDate<-"20170424"
strDate<-"20170425"
endDate<-"20170429"


keyList<-c("문재인","안철수","홍준표","심상정","유승민")
flag=0
date=strDate

for(j in 1:length(keyList)){#
  flag=0
  date=strDate
  while(as.numeric(date)<=as.numeric(endDate)){
    
    #if(j==2 && flag==0){
    #  flag=1
    #  date="20170428" #안철수는 20170425~20170427까지 이미 수집해서 20170428부터!
    #}
    print(date)
    Sumcomments<-c()
    url <- tryCatch(read.table(paste0("C:/Users/JKKIM/Documents/data/news",keyList[j],date,".csv"),header=TRUE,
                      sep=",", stringsAsFactors =  FALSE),
             error=function(e){return(NULL)},
             warning=function(e){return(NULL)})#tryCatch는 예외 처리용.
    if(is.null(url)){print("no such file");break}
    
    for(i in 1:length(url[["url"]])){
      #t<-Sys.time()
      #cat(t,"\n")
      #t<-strftime(t,"%Y-%m-%d %H:%M:%S")
      #starttime[i]<-t
      print(paste0(keyList[j],date,"의 ",i,"번째 url ",
                   as.integer((i/length(url[["url"]]))*100),"% 진행중"))
      
      comm<-getComment(turl = url[["url"]][i])
      comments<- comm$result$count$comment
      #각 기사의 1page에 있는 댓글들만 가져옴. 전체 페이지의 댓글들 가져오려면 따로 page+=1하면서 loop만들기
      comm<-getComment(turl = url[["url"]][i], pageSize = comments, page = 1)
      lst<- comm$result$commentList
      lstframe<-as.data.frame(lst)
      if(length(lstframe)!=0){
        #lsts<-lstframe[c("commentNo","userName","regTime","sympathyCount","antipathyCount","contents")]
        Sumcomments<-rbind(Sumcomments,lstframe[c("sympathyCount","antipathyCount","contents","objectId")])
      }
    }
    
    #댓글들을 좋아요, 싫어요의 합이 큰 순으로 정렬
    Sumcomments<-arrange(Sumcomments,desc(sympathyCount+antipathyCount))
    #모든 URL의 댓글들 한 곳에 저장하기
    write.csv(Sumcomments, paste("C:/Users/JKKIM/Documents/data/comm",keyList[j],date,".csv",sep=""))
    if(as.numeric(date)==20170228){
      date="20170301"
    }
    else if(as.numeric(date)==20170331){
      date="20170401"
    }
    else if(as.numeric(date)==20170430){
      date="20170501"
    }
    else{
      date=as.character(as.numeric(date)+1)
    }
  }
}

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@jongrom2 안녕하세요 네네 맞습니다. 지금 그래서 저도 curl 패키지의 multi_run 함수를 보고 있는 중입니다. 내용 수집에 대해서는 제한적이나마 코드를 작성해 봤는데 여기를 참고해보시면 좋을 것 같습니다. 아직 주석 처리를 못한 상황입니다만, 페이지별(20개였던가요?)로 동시에 요청해서 가져오는 방식이라 기존에 비해서는 충분히 빠른 것 같습니다. 참고가 되셨으면 합니다. 참고로 멀티 프로세싱은 프로세서를 여러개 동시에 켜는 방식이어서 매우 좋은 컴퓨터가 아닌 이상 큰 성능차이가 나지 않았던 것으로 기억합니다. 물론 지금 방식이 완전 순서대로 for 문으로 동작해서 더 많이 느리긴 합니다. 쨌든 curl 패키지를 좀 더 공부하면 속도면에서 이득을 얻을 수 있을 듯 합니다. 감사합니다.

from n2h4.

coldskys avatar coldskys commented on May 30, 2024

@jongrom2 이렇게 친절하게 소스까지 공유해 주셔서 감사합니다.^^
@mrchypark @jongrom2 두분 덕분에 많은 공부가 되고, 제 업무에도 많은 도움이 되고 있습니다.
감사합니다.^^

from n2h4.

coldskys avatar coldskys commented on May 30, 2024

@jongrom2 님.
버그가 하나 발견되서 알려드립니다.
주신소스로 댓글 테스트를 하다가 리스트를 먼저 뽑기 위해 뉴스 클리핑 소스를 돌렸습니다.

strDate<-"20170505"
endDate<-"20170605"

keyList<-c("강경화","청문회","김상조","김이수")

이렇게 검색을 하니,

[1] "20170505"
[1] " start Time: 2017-06-09 10:31:27 / spent Time: 0.531378984451294 / spent Time at first: 0.538383960723877"
Error in if (nums%%10 == 0) { : argument is of length zero

이런 오류가 뜨네요.

혹시 제가 실수 한건가요?

같은 소스에서

strDate<-"20170605"
endDate<-"20170605"

keyList<-c("강경화","청문회","김상조","김이수")

이렇게 날짜만 수정하면 또 잘 작동합니다.

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024

@mrchypark 와 정말 감사합니다!!! 시험기간 끝나고 꼭 봐야겠어요!ㅎㅎ 제가 찾던 건데 이미 여기 또 있었군요! ^^
@coldskys 오~! 버그를 찾아내셨군요! 원인은 강경화라는 키워드로 검색했을 시 2017년5월5일에 관련 뉴스가 하나도 없으면 nums에 0이 들어가는 것이 아니라 아예 NULL이 들어가버려서 생기는 문제인 것 같아요! 저는 그 동안 대선후보 이름으로 작업했더니 그런 적이 한 번도 없어서 버그가 있는 지 몰랐네요. nums에 어떤 값이 들어가는 지 보고 따로 처리해주시면 될 것 같습니다~!

from n2h4.

coldskys avatar coldskys commented on May 30, 2024

@jongrom2 아, 넵 감사합니다.^^

from n2h4.

coldskys avatar coldskys commented on May 30, 2024

@jongrom2
흐윽 자꾸 번거롭게 해드려서 죄송합니다.

nums <- gsub("건","",nums)

이 부분에서 기사가 없을 경우 nums값이 character(0)로 나옵니다.

그래서 그 부분을

nums <- gsub(ifelse(character(0), 0, ""),nums)

이렇게 수정을 했는데,

이제는

Error in gsub(ifelse(character(0), 0, ""), nums) :
argument "x" is missing, with no default

이런 에러가 뜨네요....

예외처리하는 힌트를 주시면, 제가 좀더 열심히 파보도록 하겠습니다.

번거롭게 해드려서 죄송합니다. ㅠㅠ

from n2h4.

coldskys avatar coldskys commented on May 30, 2024

아... 이렇게 빠른 답변 감사합니다.^^
확인해 보니, 이건 숫자를 0으로 바꾼다고 해서 해결될 문제가 아니네요.
그럼 다음 프로세스에서 에러가 나기 때문에 character(0)일경우 다음 날짜로 이동하게 해야겠네요.^^

좀 더 파보고, 안되면 또... 여기서 도움을 요청 드리겠습니다.^^

@mrchypark 님 언제나 친절한 설명 감사드리며, 백만의 감사를 전합니다.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@coldskys 아닙니다 ㅎㅎ 근데 두번째 주신 코드에는 MaxpageNum을 안쓰세요. 그리고 위 내용에 대해서는 아마

if(is.null(url)){print("no such file");break}

이걸 참고하시면 좋을 것 같습니다.

from n2h4.

coldskys avatar coldskys commented on May 30, 2024

@jongrom2 님. 정말정말 죄송한데.... 제가 어제까지 삽질을 하다가 문제 해결을 못했거든요.
혹시 기사가 없을 때 예외처리하는 방법 좀 알려 주실 수 없을까요?

내일부터 해야 할 작업이 있는데, 너무 막막해서 이렇게 무례를 무릅쓰고, 뻔뻔한 부탁을 드려봅니다.

시험기간이라 바쁘실 터인데, 정말 죄송합니다.

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024

@coldskys 방금 봤네요;;코드수정했습니다~~ㅎㅎMaxpageNum함수랑 메인부분 조금씩 고쳤어요
기사가 없는 날은 csv파일이 만들어지긴 하는데 그 안에 아무 정보도 없습니다.
해보니까 "강경화"로 했을때는 5월20일정도까지는 기사가 하나도 없네요.

library(rvest)
library(N2H4)
library(httr)

MaxpageNum <- function(turl = url) {
  r=GET(turl)
  h=read_html(r)
  totalnum<-html_nodes(h,'.result_num')  #<div class="result_header">  <h3>검색결과</h3> 이럴때
  # html_nodes(h,'.result_header h3') 이런식으로 쓰면"검색결과"라는 텍스트를 가져옴.
  nums=html_text(totalnum)
  nums <- gsub("\r", "", nums)
  for(h in 1:10){# 관련 뉴스가 10개 이하일 경우 1 ~ 1, 1 ~ 2, ...,1 ~ 10 모두 처리 가능하게 코딩.
    nums <- gsub(paste0("1 ~ ",h," / "),"",nums)
  }
  nums <- gsub("\t","",nums)
  nums <- gsub("\n","",nums)
  nums <- gsub("\\(","",nums)
  nums <- gsub("\\)","",nums)
  nums <- gsub("건","",nums)
  nums <- gsub(",","",nums)
  nums<-as.numeric(nums)
  result<-as.integer(nums/10 +1)
  
  if(length(nums)==0){
    result=0
  }
  else if( nums%%10 == 0){
    result=result-1
  }
  return(result)
} 

UrlListGet <- function(turl = url, col=c("titles","links")){
  r=GET(turl)
  h=read_html(r)
  tit<-html_nodes(h,'.ct .info .head_social a') %>% html_attr("data-title")  #<div class="result_header">  <h3>검색결과</h3> 이럴때
  # html_nodes(h,'.result_header h3') 이런식으로 쓰면"검색결과"라는 텍스트를 가져옴.
  title<-tit 
  lin<-html_nodes(h,'.ct .info a')
  link<-lin %>% html_attr("href")
  linkss<-link[-c(which(link=="#"))]  # 주소외에 #이 중간중간 들어가서 그것들을 제거.
  
  linklen=length(link)
  i=1
  
  if(linklen==1&&link[1]=="#"){
    link<-append(link,"#",after=i)
    linklen=linklen+1
    link[i]="##"
  }
  while(i <= linklen-1){
    
    if(link[i]=="#"){
      if(i==1){
        link<-append(link,"#",after=i)
        linklen=linklen+1
        link[i]="##"
      }
      else if(link[i+1]=="#"){  # 각 페이지의 첫 기사가 네이버뉴스화되어 있지 않으면 연속으로 ##이 생기지 않음.
        link<-append(link,"##",after=i)
        linklen=linklen+1
      }
    }
    i=i+1
  }
  
  
  for(i in 1:length(link)){
    if(link[i]=="##"){
      title[as.integer(i/2)+1]<-"#"
      
    }
  }
  
  if(length(title[title=="#"])>0){
    titless<-title[-c(which(title=="#"))]  # navernews주소가 없는 기사는 #처리해서 일괄적으로 제거.
  }
  else{
    titless<-title
  }
  newsList<- data.frame(titles = titless, links = linkss, stringsAsFactors = F)
  
  return(newsList[,col])
  
}




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

#제목에 검색어가 속한 뉴스만 검색
#최신순#http://news.naver.com/main/search/search.nhn?query=%B9%AE%C0%E7%C0%CE&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=title.basic&ic=all&so=datetime.dsc&stDate=range:20170101:20170101&detail=0&pd=4&start=1&display=10&startDate=2017-01-01&endDate=2017-01-01&page=1
#관련도#http://news.naver.com/main/search/search.nhn?query=%B9%AE%C0%E7%C0%CE&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=title.basic&ic=all&so=rel.dsc&stDate=range:20170101:20170101&detail=0&pd=4&r_cluster2_start=11&r_cluster2_display=10&start=11&display=10&startDate=2017-01-01&endDate=2017-01-01&page=1

#여기선 최신순으로 함. 개수는 똑같이 나옴.

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

keyList<-c("강경화","청문회","김상조","김이수")
flag=0
date=strDate
for(j in 1:length(keyList)){#박근혜부터 시작 
  flag=0
  date=strDate
  while(as.numeric(date)<=as.numeric(endDate)){
    #if(j!=1 && flag==0){#박근혜빼고 다른 후보들은 20170311부터 수집하면됨.
    #   flag=1
    #   date="20170311" #안희정은 20170215~20170216까지 이미 수집해서 20170217부터!
    #}
    print(date)
    urlbeforeKeyword="http://news.naver.com/main/search/search.nhn?query="
    urlkeyword=URLencode(keyList[j])  #검색어 입력
    urlafterkeyword=paste0("&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=title.basic&ic=all&so=datetime.dsc&stDate=range:",date,":",date,"&detail=0&pd=4&start=1&display=10&startDate=",substr(date,1,4),"-",substr(date,5,6),"-",substr(date,7,8),"&endDate=",substr(date,1,4),"-",substr(date,5,6),"-",substr(date,7,8))
    
    print(paste0(" start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
    midTime<-Sys.time()
    pageUrl=paste0(urlbeforeKeyword, urlkeyword, urlafterkeyword)
    # 리스트 페이지의 마지막 페이지수를 가져옵니다.
    #max<-getMaxPageNum(pageUrl)
    max<-MaxpageNum(pageUrl)
    SumData<-c()
    if(max!=0){
    for (pageNum in 1:max){
      print(paste0(pageNum, " start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
      midTime<-Sys.time()
      # 페이지넘버를 포함한 뉴스 리스트 페이지의 url을 생성합니다.
      
      pageUrl1=paste0(pageUrl,"&page=",pageNum)
      # 뉴스 리스트 페이지 내의 개별 네이버 뉴스 url들을 가져옵니다.
      #newsList<-getUrlListByCategory(pageUrl)
      #newsData<-c()
      
      newsList<-UrlListGet(pageUrl1)
      newsData<-c()
      flag2=0
      # 가져온 url들의 정보를 가져옵니다.
      for (newslink in newsList$links){
        ## 불러오기에 성공할 때 까지 반복합니다.
        # 성공할때 까지 반복하면 못나오는 문제가 있어서 5회로 제한합니다.
        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(tryi==5){
            flag2=1
          }
        }
        if(flag2==1){#datetime가져오는데 실패한 것들은 저장안하고 next로 넘김.
          flag2=0
          next
        }
        if(class(tem$datetime)[1]=="POSIXct"){
          newsData<-rbind(newsData,tem)
        }
      }
      dir.create("./data",showWarnings=F)#폴더 만들기 
      
      SumData<-rbind(SumData,newsData)
    }
    }
    write.csv(SumData, file=paste0("./data/news",URLdecode(urlkeyword),date,".csv"),row.names = F)
    SumData<-c()
    
    if(as.numeric(date)==20170228){
      date="20170301"
    }
    else if(as.numeric(date)==20170331){
      date="20170401"
    }
    else if(as.numeric(date)==20170430){
      date="20170501"
    }
    else if(as.numeric(date)==20170531){
      date="20170601"
    }
    else if(as.numeric(date)==20170630){
      date="20170701"
    }
    else if(as.numeric(date)==20170731){
      date="20170801"
    }
    else{
      date=as.character(as.numeric(date)+1)
    }
  }
}

from n2h4.

smnoh avatar smnoh commented on May 30, 2024

안녕하세요. 코드를 실행하다보니까 아래의 오류가 발생하더라구요
확인해보니 getComment 에서 발생하는 것 같은데 정확한 원인을 모르겠네요
확인 부탁드립니다.
image

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@smnoh 안녕하세요, 다른 분도 에러 리포트를 해주셨었는데 확인해 봐야겠네요. 혹시 다시 에러 나시면, Show Traceback 부분을 열어서 보여주실 수 있으신지요? 우선 저 link로 제가 확인은 해보겠습니다만, 재현이 안되면 다시 찾아봐야 해서요. 다시 한번 감사드립니다.

from n2h4.

smnoh avatar smnoh commented on May 30, 2024

안녕하세요. 빠른 답변 감사합니다. 아래 사진에 show traceback 부분 첨부드립니다.
감사합니다.
image

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@smnoh 안녕하세요, 혹시 전체코드를 좀 볼 수 있을까요? 위에 스크린샷을 보면 http://news.naver.com/main/list.nhn?sid2=258&sid1=101&mid=LS2D&date=20170615&page=50 이 페이지에서 getComment를 한것 처럼 보여서요.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@ejhan12 너무 오래 걸렸습니다.

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

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024

@coldskys 오늘 시험은 잘보진 못했지만... 감사합니다~!ㅎㅎㅋㅋㅋ
@mrchypark 와 ... 위에 링크 들어가 봤는데 멋진 코드에 감탄하고 갑니다.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@jongrom2 아닙니다./ㅠ_ ㅎㅎ

from n2h4.

smnoh avatar smnoh commented on May 30, 2024

안녕하세요, 늦게 답변드려 죄송합니다ㅜㅜ
밑에 코드 첨부합니다 감사합니다.
`
beday <- Sys.Date()

strDate <- gsub("\-","",beday)
endDate <- strDate

#Sys.sleep(60*60)
if (!require('devtools')) install.packages('devtools')
devtools::install_github('forkonlp/N2H4')
library(N2H4)

cate<-getMainCategory()

for (tcate_i in 1:6){
tcate<-cate$sid1[tcate_i]
subCate<-cbind(sid1=tcate,getSubCategory(sid1=tcate))
subCate_max <- nrow(subCate)

for (subCate_i in 1:subCate_max){
tscate<-subCate$sid2[subCate_i]
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)
        print(pageUrl)
        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
          }
          if(class(tem) != "try-error"){
            if(class(tem$datetime)[1]=="POSIXct"){
              newsData<-rbind(newsData,tem)
            }
          }else{
            newsData <- NA
          }
        }
        url_max <- nrow(newsList)
        url_temp <- newsList$links
        DATA<-NULL
        if(!is.null(url_max)){
          for (i in 1:url_max){
            td_url <- url_temp[i]
            test <- getComment(url_temp[i])
            test2 <- test$result$commentList
            test3 <- data.frame(test2)
            testnum <- nrow(test3)
          }
        }
      }
    }
  }
}

}
}
`

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@smnoh 안녕하세요 코드 감사합니다. 실행하는 동안 같은 오류가 나타나지 않아서 제가 문제를 확인할 수가 없네요ㅠ_ 혹시 다른 분들이라도 비슷한 오류를 보시면 리포트해주시면 감사하겠습니다!

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024

@mrchypark @smnoh

  1. 가장 큰 가능성으로는 curl과 httr 을 install.packages 안 하신게 아닐까 싶습니다.
    install.packages(c("curl","httr")) 을 시도해보는 것을 추천드립니다.
  2. install.packages를 했었는데 그 package 폴더에 접근권한이 없는 경우 R-studio 실행시 오른쪽 마우스클릭 후 "관리자 권한으로 실행"으로 시도해보는 것이 좋을 것 같습니다.

from n2h4.

kij2648 avatar kij2648 commented on May 30, 2024

안녕하세요! 질문이 있습니다.
url2 <- 'http://sports.news.naver.com/amatch/news/read.nhn?oid=216&aid=0000089598'
reply2 <- getComment(url2)$result$commentList[[1]]

이렇게 해보려고 했는데 위에 잠깐 보니깐 naver sports의 경우 방식이 다르다고 하신 것 같은데
방법이 없을까요??

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@IkjunKim 안녕하세요! 댓글은 동작합니다! 뉴스를 가져오는게 아직 안되는 거에요.

from n2h4.

kij2648 avatar kij2648 commented on May 30, 2024

@mrchypark 아 그런가요?? 제가 질문에 올려드린대로 했는데 결과값이 제대로 나오지 않더라구요... 과제 중인데 혹시 확인 한번만 부탁드려도 될까요... 죄송합니다ㅠㅠ

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@IkjunKim 확인해보니 반응을 하길래 되는건줄 알았는데, 값이 없는거였군요ㅠ 확인해보니 요청 방식은 같은데 조금 다르게 생겼네요. 수정, 반영하게 되면 이곳에 답변 달겠습니다. 감사합니다.

from n2h4.

kij2648 avatar kij2648 commented on May 30, 2024

넵! 답변 기다리겠습니다~ 감사합니다ㅎㅎ

from n2h4.

jongrom2 avatar jongrom2 commented on May 30, 2024

@mrchypark 안녕하세요~! ㅎㅎ 오랜만에 댓글남깁니다.

getContent함수의 getContentBody를 이용해서 뉴스의 내용을 가져올 때 뉴스 기사를 쓴 뉴스 기자의 메일주소를 가져오려고 시도 했습니다.
그런데 뉴스 기자의 메일 주소를 "[임영택기자 [email protected]]"이나 "임영택기자 [email protected]" 이런 식으로 쓴 경우는 전부 가져오는데 "<임영택기자 [email protected]>" 이렇게 쓴 경우는 '<''>' 이 꺽새 표시를 html코드로 인식을 해서 그런지 못가지고 오는 버그가 생깁니다.

쉽게 고칠 수 있는 방법이 있을까해서 댓글 남깁니다.

from n2h4.

dashman0 avatar dashman0 commented on May 30, 2024

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

오늘 테스트로 이틀치 뉴스를 다운받아봤는데요.
경제뉴스는 다운받아지는데 파이넨스 뉴스는 날짜를 이리저리 변경해봐도 아래와 같이 나오면서 그냥 종료되네요.
제가 조작을 잘못한건지 아니면 일시적으로 못읽어와서 그런건지 잘 모르겠습니다.

제가 입력했던 것은 Choose mode 에서는 Fast, Safe 1, 2번 다 시도해봤고
시작날짜는 2017-07-06
종료날짜는 2017-07-07
그리고 경제뉴스만 한번 돌려보고, 파이넨스 뉴스만 여러번 시도해봤습니다.
정작 필요한건 파이넨스 뉴스 부분인데 이게 잘 안되서 소스를 열어봐도
아직은 까막눈이라 잘 모르겠네요.. ㅠㅠ
혹시 이유를 알수 있을까요?

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

[1] "Please wait. Results will save at C:/Users/Jay/Documents/R/Naver News Crollong/naverNewsParser-master"
[1] "Start step 1. Scraping URL."
[1] "We get 0 links!"
[1] "Get url list is Done! It is saved at C:/Users/Jay/Documents/R/Naver News Crollong/naverNewsParser-master named listURL.csv."
[1] "Start step 2. Crawling contents. This is last step."
[1] "No url collected."

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@dashman0 안녕하세요 이렇게 관심가져주셔서 감사합니다. 아직 연애, 스포츠, 파이넨스 뉴스는 구조가 달라서 수집되는 형태의 코드가 아닙니다. 태그 지정 부분을 수정해야 하는데, 아직 제가 파악을 다 못했네요. 구조 변경을 하면서 업데이트를 같이 할 계획이어서 수정되면 알려드리겠습니다. 감사합니다. 박찬엽 드림.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@jongrom2 안녕하세요! 제가 너무 늦게봤네요ㅠ_ 혹시 코드를 공유해주시면 한번 확인해 보겠습니다. 아래 코드를 보시면 아시겠지만, html 태그를 날리는 형태로 getContentBody를 작성하지 않았기 때문에 예상하시는 것이 아닌 다른 문제 때문이지 않을까 조심스레 예상해 봅니다. 감사합니다.

getContentBody<-function(html_obj, body_node_info="div#articleBodyContents", body_attr=""){
   if(body_attr!=""){body <- html_obj %>% html_nodes(body_node_info) %>% html_attr(body_attr)}else{
   body <- html_obj %>% html_nodes(body_node_info) %>% html_text()}
   Encoding(body) <- "UTF-8"
    
   body <- gsub("\r?\n|\r", " ", body)
   body <- gsub("// flash .* function _flash_removeCallback\\(\\) \\{\\} ","",body)
   body <- stri_trim_both(body)
    
   return(body)
 }

from n2h4.

dashman0 avatar dashman0 commented on May 30, 2024

아.. 제가 잘못해서 그런건 아니었군요.
빠른 답변 감사드립니다!! ^^*

from n2h4.

YoonHo9 avatar YoonHo9 commented on May 30, 2024

정말 정말 감사합니다. 컴퓨터 언어라곤 HTML밖에 배운적없는 저에겐 굉장히 어려운 R이 너무나도 쉽게 다가오게 됬네요^^!!! 하지만 문제점이 생겼습니다.. 제가 네이버 뉴스에서 오피니언 카테고리를 크롤링 하고 싶은데 오피니언 부분은 URL이 다른것 같더라구요.. ㅠㅠ 오피니언 카테고리를 볼 수 있는 방법이 없을까요??? ㅠㅠ

from n2h4.

dashman0 avatar dashman0 commented on May 30, 2024

안녕하세요. 파이넨스 뉴스 중 기업/종목분석 부분만 다운받아보려고 위 소스를 아래와 같이 수정해봤습니다.
그런데 아래와 같은 에러가 발생하는데 혹시 N2H4를 읽지 못해서 그런걸까요?
혹시 고칠수 있는 방법이 있을까 싶어서 문의드려봅니다.
감사합니다! ^^

Error in library(N2H4) : ‘N2H4’이라고 불리는 패키지가 없습니다

Error in 1:max : NA/NaN argument
In addition: Warning message:
In 1:max : NAs introduced by coercion

install.packages("selectr")

library(curl)
library(rvest)

devtools::install_github("forkonlp/N2H4")

library(N2H4)

options(stringsAsFactors = F)

success <- function(res){
cat("Request done! Status:", res$status, "\n")
res$content<-iconv(rawToChar(res$content),from="CP949",to="UTF-8")
data <<- c(data, list(res))
}
failure <- function(msg){
cat("Oh noes! Request failed!", msg, "\n")
}

strDate<-as.Date("2017-07-07")
endDate<-as.Date("2017-07-07")

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

for (date in strDate:endDate){
date<-gsub("-","",as.character(as.Date(date,origin = "1970-01-01")))
print(paste0(date," / start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
midTime<-Sys.time()

pageUrli<-paste0("http://finance.naver.com/news/news_list.nhn?mode=LSS3D&section_id=101&section_id2=258&section_id3=402&date=",date)
trym<-0
max<-try(getMaxPageNum(pageUrli, max=50), silent = T)
while(trym<=5&&class(max)=="try-error"){
max<-try(getMaxPageNum(pageUrli, , max=50), silent = T)
Sys.sleep(abs(rnorm(1)))
trym<-trym+1
print(paste0("try again max num: ",pageUrli))
}

for (pageNum in 1:max){
print(paste0(date," / ",pageNum, " / start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
midTime<-Sys.time()
pageUrl<-paste0(pageUrli,"&page=",pageNum)
tryp<-0
newsList<-try(getUrlListByCategory(pageUrl), silent = T)
while(tryp<=5&&class(newsList)=="try-error"){
newsList<-try(getUrlListByCategory(pageUrl), silent = T)
Sys.sleep(abs(rnorm(1)))
tryp<-tryp+1
print(paste0("try again max num: ",pageUrl))
}
pool <- new_pool()
data <- list()
sapply(newsList$links, function(x) curl_fetch_multi(x,success,failure))
res <- multi_run()

if( identical(data, list()) ){
  res <- multi_run()
}

loc<-sapply(data, function(x) grepl("^http://news.naver",x$url))
cont<-sapply(data, function(x) x$content)
cont<-cont[loc]

titles<-unlist(lapply(cont,function(x) getContentTitle(read_html(x))))
bodies<-unlist(lapply(cont,function(x) getContentBody(read_html(x))))
presses<-unlist(lapply(cont,function(x) getContentPress(read_html(x))))
data<-data.frame(title=titles,press=presses,body=bodies)

dir.create("./data",showWarnings=F)
write.csv(data, file=paste0("./data/news_",date,"_",pageNum,".csv"),row.names = F)

}
}

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@dashman0 안녕하세요 제가 너무 답장이 늦었네요ㅠ_ㅠ 오피니언은 페이지 구조가 다른 뉴스와 거의 같아 빠르게 고칠 수 있었습니다. 위 코드대로 진행하시면 아마 수집이 안될꺼에요. 그리고 입력과 출력을 섞여(?) 있는지 제가 이해하기 조금 어렵네요 ㅠ 감사합니다.

from n2h4.

janghg avatar janghg commented on May 30, 2024

먼저 이런 프로그램 만들어주셔서 감사합니다. 구글링 하며 뉴스 크롤링하는 것 중 기능적으로 최고라고 생각합니다!
프로젝트 진행 중에 질문이 있어서 댓글 남깁니다.
질문은 코드 밑에 작성하였습니다.
#install.packages("selectr")
#library(curl)
#library(rvest)
#install.packages("devtools")
#devtools::install_github("forkonlp/N2H4")
#library(N2H4)

options(stringsAsFactors = F)

success <- function(res){
cat("Request done! Status:", res$status, "\n")
#res$content<-iconv(rawToChar(res$content),from="CP949",to="UTF-8")
res$content<-rawToChar(res$content)
data <<- c(data, list(res))
}
failure <- function(msg){
cat("Oh noes! Request failed!", msg, "\n")
}

strDate<-as.Date("2017-08-01")
endDate<-as.Date("2017-08-02")

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

qlist<-c("경기도","범죄")
for (i in 1:length(qlist)){
dir.create("./data",showWarnings=F)
dir.create(paste0("./data/news_",qlist[i]),showWarnings=F)

for (date in strDate:endDate){
date<-as.character(as.Date(date,origin = "1970-01-01"))
dated<-gsub("-","",date)
print(paste0(date," / ",qlist[i], "/ start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
midTime<-Sys.time()
pageUrli<-paste0("http://news.naver.com/main/search/search.nhn?query=",URLencode(qlist[i]),"&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=all.basic&ic=all&so=datetime.dsc&stDate=range:",dated,":",dated,"&detail=1&pd=4&start=1&display=25&startDate=",date,"&endDate=",date)
trym<-0
max<-try(getMaxPageNum(pageUrli), silent = T)
while(trym<=5&&class(max)=="try-error"){
max<-try(getMaxPageNum(pageUrli), silent = T)
Sys.sleep(abs(rnorm(1)))
trym<-trym+1
print(paste0("try again max num: ",pageUrli))
}
if(max=="no result"){
print("no naver news links this time")
next
}
for (pageNum in 1:max){
print(paste0(date," / ",qlist[i], "/ start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
midTime<-Sys.time()
pageUrl<-paste0(pageUrli,"&page=",pageNum)
tryp<-0
newsList<-try(getUrlListByQuery(pageUrl), silent = T)
while(tryp<=5&&class(newsList)=="try-error"){
newsList<-try(getUrlListByCategory(pageUrl), silent = T)
Sys.sleep(abs(rnorm(1)))
tryp<-tryp+1
print(paste0("try again max num: ",pageUrl))
}
if(newsList$news_links[1]=="no naver news"){
print("no naver news links this time")
next
}

  pool <- new_pool()
  data <- list()
  sapply(newsList$news_links, function(x) curl_fetch_multi(x,success,failure))
  res <- multi_run()
  
  if( identical(data, list()) ){
    pool <- new_pool()
    data <- list()
    sapply(newsList$news_links, function(x) curl_fetch_multi(x,success,failure))
    res <- multi_run()
  }
  
  closeAllConnections()
  
  loc<-sapply(data, function(x) grepl("^http://news.naver",x$url))
  cont<-sapply(data, function(x) x$content)
  cont<-cont[loc]
  
  if(identical(cont,character(0))){ 
    print("no naver news links this time")
    next
  }
  
  titles<-unlist(lapply(cont,function(x) getContentTitle(read_html(x))))
  bodies<-unlist(lapply(cont,function(x) getContentBody(read_html(x))))
  presses<-unlist(lapply(cont,function(x) getContentPress(read_html(x))))
  datetime<-lapply(cont,function(x) getContentDatetime(read_html(x))[1])
  datetime<-sapply(datetime, function(x) (as.character(x)[1]))
  edittime<-lapply(cont,function(x) getContentDatetime(read_html(x))[2])
  edittime<-sapply(edittime, function(x) (as.character(x)[1]))
  
  urls<-sapply(data, function(x) x$url)
  urls<-urls[loc]
  
  datC<-data.frame(titles,urls,presses,datetime,edittime,bodies)
  
  write.csv(datC, file=paste0("./data/news_",qlist[i],"/news_",date,"_",pageNum,".csv"),row.names = F)
  
}

}
}

2008년 08월 01일~ 2008년 08월 31일에 "경기도 범죄"에 관련된 뉴스 기사를 수집하려고 합니다. 어디가 문제인지는 모르겠지만 자꾸 no naver news links this time이라고 나오는데 어디가 잘못된건지 모르겠습니다........... 답변 좀 주시면 정말 감사하겠습니다.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@janghg 안녕하세요. 사용해주셔서 감사합니다. 코드 살펴보고 실행해봤는데, 큰 문제 없이 동작합니다. 그리고 qlist는 말그대로 list라서 c("경기도","범죄")라고 하시면 경기도 검색으로 한번, 범죄 검색으로 한번 동작합니다. 아래 수정해두었습니다. 확인해주세요 감사합니다.

# install.packages("selectr")
# library(curl)
# library(rvest)
# install.packages("devtools")
# devtools::install_github("forkonlp/N2H4")
# library(N2H4)

options(stringsAsFactors = F)

success <- function(res){
  cat("Request done! Status:", res$status, "\n")
  #res$content<-iconv(rawToChar(res$content),from="CP949",to="UTF-8")
  res$content<-rawToChar(res$content)
  data <<- c(data, list(res))
}
failure <- function(msg){
  cat("Oh noes! Request failed!", msg, "\n")
}


strDate<-as.Date("2008-08-01")
endDate<-as.Date("2008-08-31")

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

qlist<-"경기도 범죄"
for (i in 1:length(qlist)){
  dir.create("./data",showWarnings=F)
  dir.create(paste0("./data/news_",qlist[i]),showWarnings=F)
  
  for (date in strDate:endDate){
    date<-as.character(as.Date(date,origin = "1970-01-01"))
    dated<-gsub("-","",date)
    print(paste0(date," / ",qlist[i], "/ start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
    midTime<-Sys.time()
    pageUrli<-paste0("http://news.naver.com/main/search/search.nhn?query=",URLencode(qlist[i]),"&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=all.basic&ic=all&so=datetime.dsc&stDate=range:",dated,":",dated,"&detail=1&pd=4&start=1&display=25&startDate=",date,"&endDate=",date)  
    trym<-0
    max<-try(getMaxPageNum(pageUrli), silent = T)
    while(trym<=5&&class(max)=="try-error"){
      max<-try(getMaxPageNum(pageUrli), silent = T)
      Sys.sleep(abs(rnorm(1)))
      trym<-trym+1
      print(paste0("try again max num: ",pageUrli))
    }
    if(max=="no result"){
      print("no naver news links this time")
      next
    }
    for (pageNum in 1:max){
      print(paste0(date," / ",qlist[i], "/ start Time: ", strTime," / spent Time: ", Sys.time()-midTime," / spent Time at first: ", Sys.time()-strTime))
      midTime<-Sys.time()
      pageUrl<-paste0(pageUrli,"&page=",pageNum)
      tryp<-0
      newsList<-try(getUrlListByQuery(pageUrl), silent = T)
      while(tryp<=5&&class(newsList)=="try-error"){
        newsList<-try(getUrlListByCategory(pageUrl), silent = T)
        Sys.sleep(abs(rnorm(1)))
        tryp<-tryp+1
        print(paste0("try again max num: ",pageUrl))
      }
      if(newsList$news_links[1]=="no naver news"){ 
        print("no naver news links this time")
        next
      }
      
      pool <- new_pool()
      data <- list()
      sapply(newsList$news_links, function(x) curl_fetch_multi(x,success,failure))
      res <- multi_run()
      
      if( identical(data, list()) ){
        pool <- new_pool()
        data <- list()
        sapply(newsList$news_links, function(x) curl_fetch_multi(x,success,failure))
        res <- multi_run()
      }
      
      closeAllConnections()
      
      loc<-sapply(data, function(x) grepl("^http://news.naver",x$url))
      cont<-sapply(data, function(x) x$content)
      cont<-cont[loc]
      
      if(identical(cont,character(0))){ 
        print("no naver news links this time")
        next
      }
      
      titles<-unlist(lapply(cont,function(x) getContentTitle(read_html(x))))
      bodies<-unlist(lapply(cont,function(x) getContentBody(read_html(x))))
      presses<-unlist(lapply(cont,function(x) getContentPress(read_html(x))))
      datetime<-lapply(cont,function(x) getContentDatetime(read_html(x))[1])
      datetime<-sapply(datetime, function(x) (as.character(x)[1]))
      edittime<-lapply(cont,function(x) getContentDatetime(read_html(x))[2])
      edittime<-sapply(edittime, function(x) (as.character(x)[1]))
      
      urls<-sapply(data, function(x) x$url)
      urls<-urls[loc]
      
      datC<-data.frame(titles,urls,presses,datetime,edittime,bodies)
      
      write.csv(datC, file=paste0("./data/news_",qlist[i],"/news_",date,"_",pageNum,".csv"),row.names = F)
      
    }
  }
}

from n2h4.

janghg avatar janghg commented on May 30, 2024

안녕하세요 저번에도 경기도 범죄로 질문 올렸던 사람입니다. mrchypark님께서 만드신 뉴스 크롤링을 사용하고 싶은데 저번과 똑같은 에러로 저장이 안되고 있는 상황입니다.. 컴파일 후 data폴더에 제가 검색한 키워드의 폴더가 생성은 되는데 안에 담겨져있는 것이 없습니다. no naver news link this time이라고 뜨는 것이 문제라고 생각합니다. 저번에 댓글 달아주셨을 때, 정상적으로 작동한다고 하셔서 저도 다시 한 번 해봤는데, 똑같은 문제로 안되고 있는 상황입니다. 어떻게 해결해야 할까요.. 답답하네요

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@janghg 안녕하세요, 연락을 따로 주시면 한번 봐드리겠습니다. 감사하빈다. [email protected]

from n2h4.

kimyoungjin06 avatar kimyoungjin06 commented on May 30, 2024

안녕하세요. 개발자님 코드 잘 보고 있습니다. 궁금한게 있어서 댓글 남깁니다.
getComment를 할 때 사용하는 api에서 제 개발자도구에서 보여주는 인자들하고 사용하시는 인자들이 다른 것 같아서요. 저부분을 어떻게 찾으셨는지 궁금하네요...!
저는 python 유저라서, python 비슷한 코드를 만들고 싶어서말이죠..!

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@kimyoungjin06 안녕하세요 개발자도구로 확인했는데, 어떻게 다른지 모르겠네요;; 개발자 도구를 사용하는 요령은 저도 독학한 셈이라 어떻게 전달드려야 할지 잘 모르겠네요;; 죄송합니다.;;;

from n2h4.

kimyoungjin06 avatar kimyoungjin06 commented on May 30, 2024

저도 크롬 개발자 도구로 확인했는데, 넘겨주는 파라미터들이 다른 것 같아서요...!
저는 인자가 다음처럼 보이거든요...!

https://apis.naver.com/commentBox/cbox/web_naver_list_jsonp.json?
ticket=news&
templateId=default_society&
pool=cbox5&
_callback=jQuery1705791529425242348_1503036410911&
lang=ko&
country=KR&
objectId=news032%2C0002793071&
categoryId=&
pageSize=20&
indexSize=10&
groupId=&
listType=OBJECT&
page=1&
sort=favorite&
includeAllStatus=false&
_=1503036445970

근데 이런 인자로 넘겨줘서 받아오면 댓글이 읽혀지지가 않더라구요..ㅠ

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

@kimyoungjin06 아마 해더 정보를 추가해야 했던 걸로 기억합니다.

from n2h4.

mrchypark avatar mrchypark commented on May 30, 2024

이슈가 너무 길어져서 질문용 이슈를 닫겠습니다. 감사합니다.

from n2h4.

Related Issues (20)

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.