Skip to contents

함수 소개

getComment

기사에는 사용자의 댓글들이 있습니다. N2H4 패키지는 셀리늄 등의 브라우저 자동화 도구를 사용하지 않고, 바로 댓글 데이터를 가져올 수 있어 빠르게 수집할 수 있습니다.

dat <- getComment("https://n.news.naver.com/article/374/0000300375")
str(dat)
#> tibble [10 × 90] (S3: tbl_df/tbl/data.frame)
#>  $ ticket              : chr [1:10] "news" "news" "news" "news" ...
#>  $ objectId            : chr [1:10] "news374,0000300375" "news374,0000300375" "news374,0000300375" "news374,0000300375" ...
#>  $ categoryId          : chr [1:10] "*" "*" "*" "*" ...
#>  $ templateId          : chr [1:10] "default_economy" "view_economy_m1" "default_economy" "default_economy" ...
#>  $ commentNo           : chr [1:10] "767808853126414854" "767694483818021138" "767691222578888739" "767687129877709044" ...
#>  $ parentCommentNo     : chr [1:10] "767808853126414854" "767694483818021138" "767691222578888739" "767687129877709044" ...
#>  $ replyLevel          : int [1:10] 1 1 1 1 1 1 1 1 1 1
#>  $ replyCount          : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ replyAllCount       : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ replyPreviewNo      : logi [1:10] NA NA NA NA NA NA ...
#>  $ replyList           : logi [1:10] NA NA NA NA NA NA ...
#>  $ imageCount          : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ imageList           : logi [1:10] NA NA NA NA NA NA ...
#>  $ imagePathList       : logi [1:10] NA NA NA NA NA NA ...
#>  $ imageWidthList      : logi [1:10] NA NA NA NA NA NA ...
#>  $ imageHeightList     : logi [1:10] NA NA NA NA NA NA ...
#>  $ commentType         : chr [1:10] "txt" "txt" "txt" "txt" ...
#>  $ stickerId           : chr [1:10] "" NA NA NA ...
#>  $ sticker             : logi [1:10] NA NA NA NA NA NA ...
#>  $ sortValue           : num [1:10] 1.66e+12 1.66e+12 1.66e+12 1.66e+12 1.66e+12 ...
#>  $ contents            : chr [1:10] "" "양아치 기업. 절대 투자하면 안되는 회사. 입점할때 주변가게들 등쳐먹으려고 쓰레기도 안치우고 주차문제 일으키고 무"| __truncated__ "올리브영서 써보고 괜찮으면 그브랜드 직영가서 사면 할인이벤트도 많고 가격도 저렴" "Ipo 빌드업 ㄷㄷ" ...
#>  $ userIdNo            : chr [1:10] NA "1YLQY" "md6z" "8pFyW" ...
#>  $ exposedUserIp       : logi [1:10] NA NA NA NA NA NA ...
#>  $ lang                : chr [1:10] "ko" "ko" "ko" "ko" ...
#>  $ country             : chr [1:10] "KR" "KR" "KR" "KR" ...
#>  $ idType              : chr [1:10] "naver" "naver" "naver" "naver" ...
#>  $ idProvider          : chr [1:10] "naver" "naver" "naver" "naver" ...
#>  $ userName            : chr [1:10] "jhjh****" "hanz****" "linu****" "jake****" ...
#>  $ userProfileImage    : chr [1:10] "" NA "https://phinf.pstatic.net/contact/profile/blog/86/48/linus_ai.jpg" "https://phinf.pstatic.net/contact/20191004_91/1570162662665jCkIX_PNG/profileImage.png" ...
#>  $ profileType         : chr [1:10] "naver" "naver" "naver" "naver" ...
#>  $ modTime             : chr [1:10] "2022-08-30T18:21:12+0900" "2022-08-28T12:06:43+0900" "2022-08-28T11:16:05+0900" "2022-08-28T10:12:34+0900" ...
#>  $ modTimeGmt          : chr [1:10] "2022-08-30T09:21:12+0000" "2022-08-28T03:06:43+0000" "2022-08-28T02:16:05+0000" "2022-08-28T01:12:34+0000" ...
#>  $ regTime             : chr [1:10] "2022-08-29T17:41:57+0900" "2022-08-28T12:06:43+0900" "2022-08-28T11:16:05+0900" "2022-08-28T10:12:34+0900" ...
#>  $ regTimeGmt          : chr [1:10] "2022-08-29T08:41:57+0000" "2022-08-28T03:06:43+0000" "2022-08-28T02:16:05+0000" "2022-08-28T01:12:34+0000" ...
#>  $ sympathyCount       : int [1:10] 0 1 0 1 0 0 2 0 1 2
#>  $ antipathyCount      : int [1:10] 0 0 0 0 0 0 0 0 3 0
#>  $ hideReplyButton     : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ status              : int [1:10] 1 0 0 0 0 0 0 0 0 0
#>  $ mine                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ best                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ mentions            : logi [1:10] NA NA NA NA NA NA ...
#>  $ toUser              : logi [1:10] NA NA NA NA NA NA ...
#>  $ userStatus          : int [1:10] NA 0 0 0 0 0 0 0 0 0
#>  $ categoryImage       : logi [1:10] NA NA NA NA NA NA ...
#>  $ open                : logi [1:10] FALSE FALSE FALSE FALSE FALSE TRUE ...
#>  $ levelCode           : logi [1:10] NA NA NA NA NA NA ...
#>  $ grades              : logi [1:10] NA NA NA NA NA NA ...
#>  $ sympathy            : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ antipathy           : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ metaInfo            : logi [1:10] NA NA NA NA NA NA ...
#>  $ extension           : logi [1:10] NA NA NA NA NA NA ...
#>  $ translation         : logi [1:10] NA NA NA NA NA NA ...
#>  $ report              : logi [1:10] NA NA NA NA NA NA ...
#>  $ middleBlindReport   : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ spamInfo            : logi [1:10] NA NA NA NA NA NA ...
#>  $ userHomepageUrl     : logi [1:10] NA NA NA NA NA NA ...
#>  $ defamation          : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ hiddenByCleanbot    : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ score               : num [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ ratings             : logi [1:10] NA NA NA NA NA NA ...
#>  $ following           : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ managerLike         : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ pick                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ attachmentList      :List of 10
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>  $ reference           : logi [1:10] NA NA NA NA NA NA ...
#>  $ inspectionId        : logi [1:10] NA NA NA NA NA NA ...
#>  $ userReplied         : logi [1:10] NA NA NA NA NA NA ...
#>  $ shareCommentLink    : logi [1:10] NA NA NA NA NA NA ...
#>  $ shareCommentUserName: chr [1:10] "jhjh****" "hanz****" "linu****" "jake****" ...
#>  $ visible             : logi [1:10] FALSE TRUE TRUE TRUE TRUE TRUE ...
#>  $ idNo                : chr [1:10] NA "1YLQY" "md6z" "8pFyW" ...
#>  $ manager             : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ deleted             : logi [1:10] TRUE FALSE FALSE FALSE FALSE FALSE ...
#>  $ blindReport         : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ expose              : logi [1:10] FALSE TRUE TRUE TRUE TRUE TRUE ...
#>  $ chattingBridge      : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ serviceId           : chr [1:10] "news" "news" "news" "news" ...
#>  $ maskedUserId        : chr [1:10] "jhjh****" "hanz****" "linu****" "jake****" ...
#>  $ maskedUserName      : chr [1:10] "jh****" "ha****" "li****" "ja****" ...
#>  $ userBlocked         : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ replyNotificationSet: chr [1:10] "OFF" "OFF" "OFF" "OFF" ...
#>  $ blind               : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ secret              : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ profileUserId       : logi [1:10] NA NA NA NA NA NA ...
#>  $ validateBanWords    : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ exposeByCountry     : logi [1:10] FALSE TRUE TRUE TRUE TRUE TRUE ...
#>  $ containText         : logi [1:10] TRUE TRUE TRUE TRUE TRUE TRUE ...
#>  $ virtual             : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ originalStatus      : int [1:10] 1 0 0 0 0 0 0 0 0 0
#>  $ anonymous           : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...

데이터 설명

컬럼이 많고, 사용하지 않을 정보들이 많아서 주요 컬럼만 소개합니다.

objectId: 기사의 고유 아이디입니다. 앞의 3자리는 매체의, 뒤의 10자리는 기사 아이디인 것으로 파악하고 있습니다. 기사 url에 들어간 아이디와 같습니다. commentNo: 댓글의 고유 아이디입니다. parentCommentNo: 현재 댓글이 대댓글인 경우 앞의 댓글의 고유 아이디입니다. reply*: 대댓글에 대한 정보들입니다. image*: 댓글에 이미지가 포함되어 있는 경우 제공하는 정보들입니다. contents: 댓글 본문 텍스트입니다. userIdNo: 사용자 고유 아이디입니다. idNo와 같습니다. 내부적으로 전체 서비스내에서 사용하는 유일 아이디로 활용하는 것 같습니다. modTime: 수정 시간입니다. 현재 수정 기능이 막혀있어, 최근 댓글은 모두 입력 시간과 같습니다. regTime: 입력 시간입니다.

원시 데이터 제공

getComment() 함수는 네이버 뉴스 댓글의 원시 데이터를 제공하기 위해 list 자료형도 지원합니다.

dat <- getComment(
  "https://n.news.naver.com/article/374/0000300375", 
  type = "list"
  )
str(dat)
#> List of 7
#>  $ success: logi TRUE
#>  $ code   : chr "1000"
#>  $ message: chr "요청을 성공적으로 처리하였습니다."
#>  $ lang   : chr "ko"
#>  $ country: chr "KR"
#>  $ result :'data.frame': 1 obs. of  8 variables:
#>   ..$ commentList   :List of 1
#>   .. ..$ :'data.frame':  10 obs. of  90 variables:
#>   .. .. ..$ ticket              : chr [1:10] "news" "news" "news" "news" ...
#>   .. .. ..$ objectId            : chr [1:10] "news374,0000300375" "news374,0000300375" "news374,0000300375" "news374,0000300375" ...
#>   .. .. ..$ categoryId          : chr [1:10] "*" "*" "*" "*" ...
#>   .. .. ..$ templateId          : chr [1:10] "default_economy" "view_economy_m1" "default_economy" "default_economy" ...
#>   .. .. ..$ commentNo           : chr [1:10] "767808853126414854" "767694483818021138" "767691222578888739" "767687129877709044" ...
#>   .. .. ..$ parentCommentNo     : chr [1:10] "767808853126414854" "767694483818021138" "767691222578888739" "767687129877709044" ...
#>   .. .. ..$ replyLevel          : int [1:10] 1 1 1 1 1 1 1 1 1 1
#>   .. .. ..$ replyCount          : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>   .. .. ..$ replyAllCount       : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>   .. .. ..$ replyPreviewNo      : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ replyList           : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ imageCount          : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>   .. .. ..$ imageList           : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ imagePathList       : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ imageWidthList      : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ imageHeightList     : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ commentType         : chr [1:10] "txt" "txt" "txt" "txt" ...
#>   .. .. ..$ stickerId           : chr [1:10] "" NA NA NA ...
#>   .. .. ..$ sticker             : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ sortValue           : num [1:10] 1.66e+12 1.66e+12 1.66e+12 1.66e+12 1.66e+12 ...
#>   .. .. ..$ contents            : chr [1:10] "" "양아치 기업. 절대 투자하면 안되는 회사. 입점할때 주변가게들 등쳐먹으려고 쓰레기도 안치우고 주차문제 일으키고 무"| __truncated__ "올리브영서 써보고 괜찮으면 그브랜드 직영가서 사면 할인이벤트도 많고 가격도 저렴" "Ipo 빌드업 ㄷㄷ" ...
#>   .. .. ..$ userIdNo            : chr [1:10] NA "1YLQY" "md6z" "8pFyW" ...
#>   .. .. ..$ exposedUserIp       : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ lang                : chr [1:10] "ko" "ko" "ko" "ko" ...
#>   .. .. ..$ country             : chr [1:10] "KR" "KR" "KR" "KR" ...
#>   .. .. ..$ idType              : chr [1:10] "naver" "naver" "naver" "naver" ...
#>   .. .. ..$ idProvider          : chr [1:10] "naver" "naver" "naver" "naver" ...
#>   .. .. ..$ userName            : chr [1:10] "jhjh****" "hanz****" "linu****" "jake****" ...
#>   .. .. ..$ userProfileImage    : chr [1:10] "" NA "https://phinf.pstatic.net/contact/profile/blog/86/48/linus_ai.jpg" "https://phinf.pstatic.net/contact/20191004_91/1570162662665jCkIX_PNG/profileImage.png" ...
#>   .. .. ..$ profileType         : chr [1:10] "naver" "naver" "naver" "naver" ...
#>   .. .. ..$ modTime             : chr [1:10] "2022-08-30T18:21:12+0900" "2022-08-28T12:06:43+0900" "2022-08-28T11:16:05+0900" "2022-08-28T10:12:34+0900" ...
#>   .. .. ..$ modTimeGmt          : chr [1:10] "2022-08-30T09:21:12+0000" "2022-08-28T03:06:43+0000" "2022-08-28T02:16:05+0000" "2022-08-28T01:12:34+0000" ...
#>   .. .. ..$ regTime             : chr [1:10] "2022-08-29T17:41:57+0900" "2022-08-28T12:06:43+0900" "2022-08-28T11:16:05+0900" "2022-08-28T10:12:34+0900" ...
#>   .. .. ..$ regTimeGmt          : chr [1:10] "2022-08-29T08:41:57+0000" "2022-08-28T03:06:43+0000" "2022-08-28T02:16:05+0000" "2022-08-28T01:12:34+0000" ...
#>   .. .. ..$ sympathyCount       : int [1:10] 0 1 0 1 0 0 2 0 1 2
#>   .. .. ..$ antipathyCount      : int [1:10] 0 0 0 0 0 0 0 0 3 0
#>   .. .. ..$ hideReplyButton     : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ status              : int [1:10] 1 0 0 0 0 0 0 0 0 0
#>   .. .. ..$ mine                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ best                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ mentions            : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ toUser              : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ userStatus          : int [1:10] NA 0 0 0 0 0 0 0 0 0
#>   .. .. ..$ categoryImage       : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ open                : logi [1:10] FALSE FALSE FALSE FALSE FALSE TRUE ...
#>   .. .. ..$ levelCode           : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ grades              : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ sympathy            : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ antipathy           : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ metaInfo            : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ extension           : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ translation         : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ report              : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ middleBlindReport   : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ spamInfo            : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ userHomepageUrl     : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ defamation          : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ hiddenByCleanbot    : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ score               : num [1:10] 0 0 0 0 0 0 0 0 0 0
#>   .. .. ..$ ratings             : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ following           : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ managerLike         : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ pick                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ attachmentList      :List of 10
#>   .. .. .. ..$ : list()
#>   .. .. .. ..$ : list()
#>   .. .. .. ..$ : list()
#>   .. .. .. ..$ : list()
#>   .. .. .. ..$ : list()
#>   .. .. .. ..$ : list()
#>   .. .. .. ..$ : list()
#>   .. .. .. ..$ : list()
#>   .. .. .. ..$ : list()
#>   .. .. .. ..$ : list()
#>   .. .. ..$ reference           : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ inspectionId        : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ userReplied         : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ shareCommentLink    : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ shareCommentUserName: chr [1:10] "jhjh****" "hanz****" "linu****" "jake****" ...
#>   .. .. ..$ visible             : logi [1:10] FALSE TRUE TRUE TRUE TRUE TRUE ...
#>   .. .. ..$ deleted             : logi [1:10] TRUE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ expose              : logi [1:10] FALSE TRUE TRUE TRUE TRUE TRUE ...
#>   .. .. ..$ idNo                : chr [1:10] NA "1YLQY" "md6z" "8pFyW" ...
#>   .. .. ..$ manager             : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ blindReport         : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ chattingBridge      : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ serviceId           : chr [1:10] "news" "news" "news" "news" ...
#>   .. .. ..$ maskedUserId        : chr [1:10] "jhjh****" "hanz****" "linu****" "jake****" ...
#>   .. .. ..$ maskedUserName      : chr [1:10] "jh****" "ha****" "li****" "ja****" ...
#>   .. .. ..$ userBlocked         : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ replyNotificationSet: chr [1:10] "OFF" "OFF" "OFF" "OFF" ...
#>   .. .. ..$ blind               : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ secret              : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ validateBanWords    : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ profileUserId       : logi [1:10] NA NA NA NA NA NA ...
#>   .. .. ..$ exposeByCountry     : logi [1:10] FALSE TRUE TRUE TRUE TRUE TRUE ...
#>   .. .. ..$ containText         : logi [1:10] TRUE TRUE TRUE TRUE TRUE TRUE ...
#>   .. .. ..$ virtual             : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   .. .. ..$ originalStatus      : int [1:10] 1 0 0 0 0 0 0 0 0 0
#>   .. .. ..$ anonymous           : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>   ..$ pageModel     :'data.frame':   1 obs. of  17 variables:
#>   .. ..$ page          : int 1
#>   .. ..$ pageSize      : int 10
#>   .. ..$ indexSize     : int 10
#>   .. ..$ startRow      : int 1
#>   .. ..$ endRow        : int 10
#>   .. ..$ totalRows     : int 20
#>   .. ..$ startIndex    : int 0
#>   .. ..$ totalPages    : int 2
#>   .. ..$ firstPage     : int 1
#>   .. ..$ prevPage      : int 0
#>   .. ..$ nextPage      : int 2
#>   .. ..$ lastPage      : int 2
#>   .. ..$ current       : logi NA
#>   .. ..$ threshold     : logi NA
#>   .. ..$ moveToLastPage: logi FALSE
#>   .. ..$ moveToComment : logi FALSE
#>   .. ..$ moveToLastPrev: logi FALSE
#>   ..$ morePage      :'data.frame':   1 obs. of  4 variables:
#>   .. ..$ prev : chr "05u05itoicn46"
#>   .. ..$ next : chr "05tybxto5pvdy"
#>   .. ..$ start: chr "05u05itoicn46"
#>   .. ..$ end  : chr "05ty4ck9xjzrp"
#>   ..$ exposureConfig:'data.frame':   1 obs. of  2 variables:
#>   .. ..$ reason: logi NA
#>   .. ..$ status: chr "COMMENT_ON"
#>   ..$ count         :'data.frame':   1 obs. of  8 variables:
#>   .. ..$ comment           : int 20
#>   .. ..$ reply             : int 5
#>   .. ..$ exposeCount       : int 16
#>   .. ..$ delCommentByUser  : int 4
#>   .. ..$ delCommentByMon   : int 0
#>   .. ..$ blindCommentByUser: int 0
#>   .. ..$ blindReplyByUser  : int 0
#>   .. ..$ total             : int 25
#>   ..$ listStatus    : chr "all"
#>   ..$ sort          : chr "NEW"
#>   ..$ bestList      :List of 1
#>   .. ..$ : list()
#>  $ date   : chr "2024-02-25T16:12:06+0000"
#>  - attr(*, "row.names")= int 1

getAllComment

getComment() 함수는 최대 100개의 댓글을 가져올 수 있습니다. 그래서 모든 데이터를 가져오기 위해서는 여러번 요청해야 합니다. N2H4 패키지는 편의함수인 getAllComment()을 제공합니다.

dat <- getComment("https://n.news.naver.com/mnews/article/088/0000772480?sid=100")
nrow(dat)
#> [1] 10
dat <- getComment(
  "https://n.news.naver.com/mnews/article/088/0000772480?sid=100",
  count = 100
  )
nrow(dat)
#> [1] 100
dat <- getAllComment("https://n.news.naver.com/mnews/article/088/0000772480?sid=100")
nrow(dat)
#> [1] 199

getCommentHistory

댓글 사용자의 다른 댓글들을 수집하는 함수입니다. 우선 getComment() 함수를 이용해 추가로 수집하고자 하는 사용자의 기사내 댓글아이디(commentNo)를 확보합니다.

turl <- "https://n.news.naver.com/mnews/article/088/0000772480?sid=100"
dat <- getComment(turl)
nrow(dat)
#> [1] 10
str(dat[1,c("commentNo", "idNo", "userName", "contents")])
#> tibble [1 × 4] (S3: tbl_df/tbl/data.frame)
#>  $ commentNo: chr "767687080955347249"
#>  $ idNo     : chr "aPD2N"
#>  $ userName : chr "rn65****"
#>  $ contents : chr "국힘과 보수  꼭 보시길    동영상  뻐꾸기 탁란   잔혹한 본성을 보시길"

getCommentHistory() 함수는 댓글이 달린 본기사주소와 commentNo가 모두 필요합니다.

dat <- getCommentHistory(turl, dat$commentNo[1])
str(dat)
#> tibble [10 × 98] (S3: tbl_df/tbl/data.frame)
#>  $ ticket              : chr [1:10] "news" "news" "news" "news" ...
#>  $ objectId            : chr [1:10] "news127,0000034579" "news421,0006425048" "news021,0002538562" "news032,0003182769" ...
#>  $ categoryId          : chr [1:10] "*" "*" "*" "*" ...
#>  $ templateId          : chr [1:10] "view_society" "view_politics_m2" "view_politics_m2" "view_society" ...
#>  $ commentNo           : chr [1:10] "803156561043128494" "773549075625673110" "773548819622134194" "773532228314464415" ...
#>  $ parentCommentNo     : chr [1:10] "803156561043128494" "773549075625673110" "773548819622134194" "773531837237559435" ...
#>  $ replyLevel          : int [1:10] 1 1 1 2 1 1 2 1 1 1
#>  $ replyCount          : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ replyAllCount       : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ replyPreviewNo      : logi [1:10] NA NA NA NA NA NA ...
#>  $ replyList           : logi [1:10] NA NA NA NA NA NA ...
#>  $ imageCount          : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ imageList           : logi [1:10] NA NA NA NA NA NA ...
#>  $ imagePathList       : logi [1:10] NA NA NA NA NA NA ...
#>  $ imageWidthList      : logi [1:10] NA NA NA NA NA NA ...
#>  $ imageHeightList     : logi [1:10] NA NA NA NA NA NA ...
#>  $ objectUrl           : chr [1:10] "https://n.news.naver.com/mnews/article/127/0000034579?sid1=001" "https://n.news.naver.com/mnews/article/421/0006425048?sid1=001" "https://n.news.naver.com/mnews/article/021/0002538562?sid1=001" "https://n.news.naver.com/mnews/article/032/0003182769?sid1=001" ...
#>  $ commentType         : chr [1:10] "txt" "txt" "txt" "txt" ...
#>  $ stickerId           : logi [1:10] NA NA NA NA NA NA ...
#>  $ sticker             : logi [1:10] NA NA NA NA NA NA ...
#>  $ sortValue           : num [1:10] 1.69e+12 1.67e+12 1.67e+12 1.67e+12 1.67e+12 ...
#>  $ contents            : chr [1:10] "공산당 싫다하는것이  조상님에  효도" "공산당들은 애도하는 것 못 보았다  공산당답게 너내들 끼리 놀아라" "보이지 마라 감방 갈 놈이 나데지 마라" "위장 암살 자살자    공산당 길잡이" ...
#>  $ userIdNo            : chr [1:10] "aPD2N" "aPD2N" "aPD2N" "aPD2N" ...
#>  $ exposedUserIp       : logi [1:10] NA NA NA NA NA NA ...
#>  $ lang                : chr [1:10] "ko" "ko" "ko" "ko" ...
#>  $ country             : chr [1:10] "KR" "KR" "KR" "KR" ...
#>  $ idType              : chr [1:10] "naver" "naver" "naver" "naver" ...
#>  $ idProvider          : chr [1:10] "naver" "naver" "naver" "naver" ...
#>  $ userName            : chr [1:10] "사천왕" "사천왕" "사천왕" "사천왕" ...
#>  $ userProfileImage    : logi [1:10] NA NA NA NA NA NA ...
#>  $ profileType         : chr [1:10] "naver" "naver" "naver" "naver" ...
#>  $ modTime             : chr [1:10] "2023-09-14T18:10:36+0900" "2022-10-30T14:41:56+0900" "2022-10-30T14:37:58+0900" "2022-10-30T10:20:26+0900" ...
#>  $ modTimeGmt          : chr [1:10] "2023-09-14T09:10:36+0000" "2022-10-30T05:41:56+0000" "2022-10-30T05:37:58+0000" "2022-10-30T01:20:26+0000" ...
#>  $ regTime             : chr [1:10] "2023-09-14T18:10:36+0900" "2022-10-30T14:41:56+0900" "2022-10-30T14:37:58+0900" "2022-10-30T10:20:26+0900" ...
#>  $ regTimeGmt          : chr [1:10] "2023-09-14T09:10:36+0000" "2022-10-30T05:41:56+0000" "2022-10-30T05:37:58+0000" "2022-10-30T01:20:26+0000" ...
#>  $ sympathyCount       : int [1:10] 0 0 2 0 0 1 1 0 0 0
#>  $ antipathyCount      : int [1:10] 0 0 1 0 0 0 0 1 0 0
#>  $ hideReplyButton     : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ status              : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ mine                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ best                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ mentions            : logi [1:10] NA NA NA NA NA NA ...
#>  $ toUser              : logi [1:10] NA NA NA NA NA NA ...
#>  $ userStatus          : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ categoryImage       : logi [1:10] NA NA NA NA NA NA ...
#>  $ open                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ levelCode           : logi [1:10] NA NA NA NA NA NA ...
#>  $ grades              : logi [1:10] NA NA NA NA NA NA ...
#>  $ sympathy            : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ antipathy           : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ metaInfo            :'data.frame':    10 obs. of  15 variables:
#>   ..$ categoryName    : chr [1:10] "사회" "정치" "정치" "사회" ...
#>   ..$ publisherCode   : chr [1:10] "127" "421" "021" "032" ...
#>   ..$ publisherName   : chr [1:10] "기자협회보" "뉴스1" "문화일보" "경향신문" ...
#>   ..$ title           : chr [1:10] "김용진 대표 \"뉴스타파, 그렇게 만만한 조직 아니다\"" "민주당, '이태원 참사'에 오늘 긴급 최고위 소집…\"힘 모으겠다\"" "이재명, “민주당 함께 힘 모으겠다. 사고 수습에 총력”" "‘이태원 핼러윈’ 사고 149명 사망자, 서울 시내 36개 병원 이송…실종 신고 355건 접수" ...
#>   ..$ imageUrl        : chr [1:10] "https://imgnews.pstatic.net/image/origin/127/2023/09/14/34579.jpg" "https://imgnews.pstatic.net/image/origin/421/2022/10/30/6425048.jpg" "https://imgnews.pstatic.net/image/origin/021/2022/10/30/2538562.jpg" "https://imgnews.pstatic.net/image/origin/032/2022/10/30/3182769.jpg" ...
#>   ..$ source          : chr [1:10] "&lsquo김만배 음성 파일&rsquo 보도와 관련한 의혹을 수사 중인 검찰이 14일 뉴스타파와 JTBC에 대한 압수수색을 시도"| __truncated__ "이재명 더불어민주당 대표가 26일 서울 여의도 국회에서 열린 최고위원회의에서 모두 발언을 하고 있다. 2022.10.26/뉴"| __truncated__ "더불어민주당 이재명 대표가 26일 국회에서 열린 최고위원회의에서 발언하고 있다 국회사진기자단 이재명, 이태원 참사"| __truncated__ "30일 시민들이 서울 용산구 한남동 주민센터에서 이태원 핼러윈 인명사고 관련 실종자 접수를 하고 대기하고 있다. 권"| __truncated__ ...
#>   ..$ url             : chr [1:10] "https://n.news.naver.com/mnews/article/127/0000034579?sid1=001" "https://n.news.naver.com/mnews/article/421/0006425048?sid1=001" "https://n.news.naver.com/mnews/article/021/0002538562?sid1=001" "https://n.news.naver.com/mnews/article/032/0003182769?sid1=001" ...
#>   ..$ regDate         : num [1:10] 1.69e+12 1.67e+12 1.67e+12 1.67e+12 1.67e+12 ...
#>   ..$ ticket          : chr [1:10] "news" "news" "news" "news" ...
#>   ..$ statCategoryName: chr [1:10] "사회" "정치" "정치" "사회" ...
#>   ..$ commonStatsParam:'data.frame': 10 obs. of  0 variables
#>   ..$ commentCount    : int [1:10] 207 65 599 211 1288 1142 162 455 455 1264
#>   ..$ parentContentId : logi [1:10] NA NA NA NA NA NA ...
#>   ..$ parentTitle     : logi [1:10] NA NA NA NA NA NA ...
#>   ..$ escapedTitle    : chr [1:10] "김용진 대표 \"뉴스타파, 그렇게 만만한 조직 아니다\"" "민주당, '이태원 참사'에 오늘 긴급 최고위 소집…\"힘 모으겠다\"" "이재명, “민주당 함께 힘 모으겠다. 사고 수습에 총력”" "‘이태원 핼러윈’ 사고 149명 사망자, 서울 시내 36개 병원 이송…실종 신고 355건 접수" ...
#>  $ extension           : logi [1:10] NA NA NA NA NA NA ...
#>  $ translation         : logi [1:10] NA NA NA NA NA NA ...
#>  $ report              : logi [1:10] NA NA NA NA NA NA ...
#>  $ middleBlindReport   : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ spamInfo            : logi [1:10] NA NA NA NA NA NA ...
#>  $ userHomepageUrl     : logi [1:10] NA NA NA NA NA NA ...
#>  $ defamation          : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ hiddenByCleanbot    : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ score               : num [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ ratings             : logi [1:10] NA NA NA NA NA NA ...
#>  $ following           : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ managerLike         : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ pick                : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ attachmentList      :List of 10
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>   ..$ : list()
#>  $ reference           : logi [1:10] NA NA NA NA NA NA ...
#>  $ inspectionId        : logi [1:10] NA NA NA NA NA NA ...
#>  $ userReplied         : logi [1:10] NA NA NA NA NA NA ...
#>  $ shareCommentLink    : logi [1:10] NA NA NA NA NA NA ...
#>  $ shareCommentUserName: chr [1:10] "사천왕" "사천왕" "사천왕" "사천왕" ...
#>  $ objectTitle         : chr [1:10] "김용진 대표 \"뉴스타파, 그렇게 만만한 조직 아니다\"" "민주당, '이태원 참사'에 오늘 긴급 최고위 소집…\"힘 모으겠다\"" "이재명, “민주당 함께 힘 모으겠다. 사고 수습에 총력”" "‘이태원 핼러윈’ 사고 149명 사망자, 서울 시내 36개 병원 이송…실종 신고 355건 접수" ...
#>  $ objectImage         : chr [1:10] "https://imgnews.pstatic.net/image/origin/127/2023/09/14/34579.jpg" "https://imgnews.pstatic.net/image/origin/421/2022/10/30/6425048.jpg" "https://imgnews.pstatic.net/image/origin/021/2022/10/30/2538562.jpg" "https://imgnews.pstatic.net/image/origin/032/2022/10/30/3182769.jpg" ...
#>  $ objectSource        : chr [1:10] "&lsquo김만배 음성 파일&rsquo 보도와 관련한 의혹을 수사 중인 검찰이 14일 뉴스타파와 JTBC에 대한 압수수색을 시도"| __truncated__ "이재명 더불어민주당 대표가 26일 서울 여의도 국회에서 열린 최고위원회의에서 모두 발언을 하고 있다. 2022.10.26/뉴"| __truncated__ "더불어민주당 이재명 대표가 26일 국회에서 열린 최고위원회의에서 발언하고 있다 국회사진기자단 이재명, 이태원 참사"| __truncated__ "30일 시민들이 서울 용산구 한남동 주민센터에서 이태원 핼러윈 인명사고 관련 실종자 접수를 하고 대기하고 있다. 권"| __truncated__ ...
#>  $ objectCategoryName  : chr [1:10] "사회" "정치" "정치" "사회" ...
#>  $ objectPublisherName : chr [1:10] "기자협회보" "뉴스1" "문화일보" "경향신문" ...
#>  $ objectRegDate       : num [1:10] 1.69e+12 1.67e+12 1.67e+12 1.67e+12 1.67e+12 ...
#>  $ objectRegTime       : chr [1:10] "2023-09-14T13:20:01+0900" "2022-10-30T09:19:01+0900" "2022-10-30T09:31:15+0900" "2022-10-30T11:43:03+0900" ...
#>  $ visible             : logi [1:10] TRUE TRUE TRUE TRUE TRUE TRUE ...
#>  $ idNo                : chr [1:10] "aPD2N" "aPD2N" "aPD2N" "aPD2N" ...
#>  $ manager             : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ deleted             : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ blindReport         : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ expose              : logi [1:10] TRUE TRUE TRUE TRUE TRUE TRUE ...
#>  $ serviceId           : chr [1:10] "news" "news" "news" "news" ...
#>  $ chattingBridge      : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ maskedUserId        : chr [1:10] "rn65****" "rn65****" "rn65****" "rn65****" ...
#>  $ maskedUserName      : chr [1:10] "사천****" "사천****" "사천****" "사천****" ...
#>  $ userBlocked         : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ replyNotificationSet: chr [1:10] "OFF" "OFF" "OFF" "OFF" ...
#>  $ blind               : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ secret              : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ validateBanWords    : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ profileUserId       : logi [1:10] NA NA NA NA NA NA ...
#>  $ exposeByCountry     : logi [1:10] TRUE TRUE TRUE TRUE TRUE TRUE ...
#>  $ containText         : logi [1:10] TRUE TRUE TRUE TRUE TRUE TRUE ...
#>  $ virtual             : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ originalStatus      : int [1:10] 0 0 0 0 0 0 0 0 0 0
#>  $ anonymous           : logi [1:10] FALSE FALSE FALSE FALSE FALSE FALSE ...