library(XML)
library(rvest)
library(stringr)
baseurl <- "https://news.daum.net/ranking/popular?regDate="
dates <- seq(from=20201025, to=20201031, by=1)
urls <- str_c(baseurl, dates)
urls
## [1] "https://news.daum.net/ranking/popular?regDate=20201025"
## [2] "https://news.daum.net/ranking/popular?regDate=20201026"
## [3] "https://news.daum.net/ranking/popular?regDate=20201027"
## [4] "https://news.daum.net/ranking/popular?regDate=20201028"
## [5] "https://news.daum.net/ranking/popular?regDate=20201029"
## [6] "https://news.daum.net/ranking/popular?regDate=20201030"
## [7] "https://news.daum.net/ranking/popular?regDate=20201031"
headline_extractor <- function(url) {
page <- readLines(url)
page_parsed <- htmlParse(page)
headline_xpath <- '//*[@id="mArticle"]/div[2]/ul[3]/li/div[2]/strong/a'
headlines <- xpathSApply(page_parsed, headline_xpath, xmlValue)
return(headlines)
}
urls
## [1] "https://news.daum.net/ranking/popular?regDate=20201025"
## [2] "https://news.daum.net/ranking/popular?regDate=20201026"
## [3] "https://news.daum.net/ranking/popular?regDate=20201027"
## [4] "https://news.daum.net/ranking/popular?regDate=20201028"
## [5] "https://news.daum.net/ranking/popular?regDate=20201029"
## [6] "https://news.daum.net/ranking/popular?regDate=20201030"
## [7] "https://news.daum.net/ranking/popular?regDate=20201031"
length(urls)
## [1] 7
headline_list <- lapply(urls, headline_extractor)
class(headline_list)
## [1] "list"
length(headline_list)
## [1] 7
urls[2]
## [1] "https://news.daum.net/ranking/popular?regDate=20201026"
headline_list[[2]]
## [1] "아내와 성관계 후 갑자기 폭행한 뒤 살해..英 갑부의 두 얼굴"
## [2] "살 뺀다고 탄수화물을 끊어? \"줄일 것은 따로 있어요\""
## [3] "어린이집서 친구와 부딪쳐 넘어진 5살..이틀만에 숨져(종합)"
## [4] "[단독] 나라에 낼 돈 130억인데, 조국 모친 \"전재산 9만원\""
## [5] "28년만에 나타나 딸 억대 유산 챙긴 친모..간병한 계모에 절도소송까지"
## [6] "\"물 찾다 실수로 소주 1병 마셔\".. 음주운전 경찰관의 황당 변명"
## [7] "제2의 '구하라 사건'..딸 숨지자 28년만에 나타난 생모"
## [8] "\"고소하니 합의하자고..\" 어느 날 사라진 유튜버, 망가진 그의 삶"
## [9] "한국은 되고 유럽은 안 되는 이유, '가디언'의 적나라한 지적 [임상훈의 글로벌리포트]"
## [10] "온천천에 나타난 진객 연어, \"하루 사이 무슨 일이.. \""
## [11] "\"EU 회원국, WTO 총장 선거서 나이지리아 후보 지지에 접근\""
## [12] "싱가포르, 한국 '독감백신 접종 후 사망'에 백신 2종 접종 중단"
## [13] "[주진우 라이브] 함세웅 신부 \"이건희의 '마누라와 자식 빼고 버려라?'..가족에 매몰된 한계가 삼성의 한계이자 우리 시대의 한계\""
## [14] "'전 남편 살해 무기징역' 고유정, 현 남편과 이혼소송서 패소"
## [15] "윤석열 화환 '나이트클럽' 조롱한 진혜원..야당 \"부하가 상급자 모욕, 징계감\""
## [16] "'#택배기사님감사합니다'..잇단 사망에 \"새벽배송 안 시킨다\""
## [17] "이건희 상속세 무려 11조..국가 세입예산마저 뒤흔들었다"
## [18] "한 달째 전남대 앞 쓰레기봉투 들고 나타난 20대들"
## [19] "\"질병청 믿고 백신 맞자\"..62~69세 반나절 만에 26만명 접종"
## [20] "가수 '상위 1%' 63명 연소득 34억원..1%가 전체소득 53% 차지"
## [21] "'공항 화장실에 버려진 아이' 카타르, 여성승객 강제 자궁 검사"
## [22] "부산에 있는 55년 '해운대암소갈비'가 서울에도..법원 \"불법행위\""
## [23] "\"윤석열 누구랑 밥먹으면 고발할 것..윤석열 정치 방지법 만들어야\""
## [24] "[단독] 첫날부터 오작동..2억 원 아끼려다 5명 목숨 잃었다"
## [25] "'6.25는 북침' 열 올리는 중국, 동조하는 아이돌..조용한 한국 정부"
## [26] "\"되찾을 수 없는 건 생명\"..이건희 '가짜 편지' 확산"
## [27] "\"40만원 과외, 버는건 8만원\" 요즘 대학생들에게 무슨 일이"
## [28] "[타봤습니다] 비행기는 탔지만 목적지는 없다..완판된 9만9000원 여행"
## [29] "미국서 '살인말벌' 제거 작전..완전무장에 진공청소기 동원"
## [30] "허수아비 후보로 세운 청소부, 진짜로 러 시장 되자 벌어진 일"
## [31] "어린이집에서 놀던 5살 남아 숨져..경찰 수사"
## [32] "[이건희 별세] 사인은 '신부전'..신장이 노폐물 걸러내지 못하는 병"
## [33] "강경화 \"'병역 면탈' 유승준 비자 발급, 허용하지 않기로\""
## [34] "바이든 아들은 노트북 수리를 맡겼다, 그것이 화근이었다"
## [35] "'마스크 쓴 뒤로 입냄새 심해졌어요, 왜 그런거죠?'"
## [36] "추미애, 野 사퇴요구에 \"뭐라 하겠나..장관 한번 해보세요\""
## [37] "다시 칼 빼든 추미애 \"윤석열 중앙지검장 때 옵티 무혐의, 감찰 예정\"(종합)"
## [38] "'시속 166km' 음주운전하다 2명 사망사고 낸 20대 징역 7년"
## [39] "조국에게 총애받던 박형철, 그가 입 열수록 조국은 다친다"
## [40] "'부하' 표현..조수진 \"우병우에 썼잖냐\" 秋 \"기억 없다\""
## [41] "1,500도 쇳물에 추락사..\"노후설비 바꿔달라 호소했지만\""
## [42] "검찰인사 문제삼는 野에 폭발..추미애 \"총장한테 물어봐라\""
## [43] "김홍희 해경청장 \"충동적 공황상태에서 자진 월북..증거 다수\"(종합)"
## [44] "\"못살겠다, 불안해서\"..대선 앞두고 총 사러가는 미국인"
## [45] "70대 몰던 어린이 통학버스 주유소 돌진..2명 부상"
## [46] "\"박원순 때와 왜 이리 달라\"..이낙연 '이건희 추모 페북'에 비판 댓글"
## [47] "나경원 \"이건희 별세 애도..상속세율 근본적으로 검토해야\""
## [48] "추미애 \"김봉현 술접대 검사 수사팀장 투입..사실로 확인\"(종합)"
## [49] "박정희 추도식 참석한 김종인..\"여기 왜 왔냐\" 현장 소란"
## [50] "종전선언 논의하러 美갔는데..北 \"외세 할아비처럼 섬기며 비굴하게 처신\""
page <- readLines("https://news.daum.net/ranking/popular")
page_parsed <- htmlParse(page)
headline_xpath <- '//*[@id="mArticle"]/div[2]/ul[3]/li/div[2]/strong/a'
company_xpath <- '//*[@id="mArticle"]/div[2]/ul[3]/li/div[2]/strong/span'
headlines <- xpathSApply(page_parsed, headline_xpath, xmlValue)
companies <- xpathSApply(page_parsed, company_xpath, xmlValue)
h_vector <- headlines[1:5]
c_vector <- companies[1:5]
d_vector <- c(rep(dates[1],3),rep(dates[2],2))
List1 <- list(headline=h_vector, company=c_vector, date=d_vector)
apply() and its derivative functions allow crossing the data in a number of ways and avoid explicit use of loop constructs. They act on an input list, matrix or array and apply a named function with one or several optional arguments.
lapply
: Loops over a list or a vector and evaluates a function on each elementsapply
: A more simplified version of the lapply()
functiontapply
: Evaluates a function over subsets of a vectorlapply( ) applies a specified function to each element of a list and returns a new list object of the same length as the input list object. Each element of which is the result of applying a function to the corresponding element of the input list.
l in lapply( ) stands for list
List2 <- list(1:3,4:6,7:9)
List2
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] 4 5 6
##
## [[3]]
## [1] 7 8 9
class(List2)
## [1] "list"
add_two <- function(x){
y <- x + 2
return(y)
}
lapply(List2, add_two) # returns a list object of results from applying a function "add_two" to each element of List2
## [[1]]
## [1] 3 4 5
##
## [[2]]
## [1] 6 7 8
##
## [[3]]
## [1] 9 10 11
lapply(List2, sum) # Built-in function
## [[1]]
## [1] 6
##
## [[2]]
## [1] 15
##
## [[3]]
## [1] 24
List2
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] 4 5 6
##
## [[3]]
## [1] 7 8 9
class(List2)
## [1] "list"
unlist(List2)
## [1] 1 2 3 4 5 6 7 8 9
int_vec <- unlist(List2)
int_vec
## [1] 1 2 3 4 5 6 7 8 9
class(int_vec)
## [1] "integer"
as.list(int_vec)
## [[1]]
## [1] 1
##
## [[2]]
## [1] 2
##
## [[3]]
## [1] 3
##
## [[4]]
## [1] 4
##
## [[5]]
## [1] 5
##
## [[6]]
## [1] 6
##
## [[7]]
## [1] 7
##
## [[8]]
## [1] 8
##
## [[9]]
## [1] 9
lapply(int_vec, add_two)
## [[1]]
## [1] 3
##
## [[2]]
## [1] 4
##
## [[3]]
## [1] 5
##
## [[4]]
## [1] 6
##
## [[5]]
## [1] 7
##
## [[6]]
## [1] 8
##
## [[7]]
## [1] 9
##
## [[8]]
## [1] 10
##
## [[9]]
## [1] 11
lapply(as.list(int_vec), add_two)
## [[1]]
## [1] 3
##
## [[2]]
## [1] 4
##
## [[3]]
## [1] 5
##
## [[4]]
## [1] 6
##
## [[5]]
## [1] 7
##
## [[6]]
## [1] 8
##
## [[7]]
## [1] 9
##
## [[8]]
## [1] 10
##
## [[9]]
## [1] 11
sapply( ) applies a specified function to each element of a list and returns a vector object when possible. It is the same as applying the function unlist( ) to the result of lapply( ).
List2
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] 4 5 6
##
## [[3]]
## [1] 7 8 9
lapply(List2, add_two)
## [[1]]
## [1] 3 4 5
##
## [[2]]
## [1] 6 7 8
##
## [[3]]
## [1] 9 10 11
sapply(List2, add_two) # applies a function "add_two" to elements as vectors in List2 as a list
## [,1] [,2] [,3]
## [1,] 3 6 9
## [2,] 4 7 10
## [3,] 5 8 11
lapply(int_vec, add_two)
## [[1]]
## [1] 3
##
## [[2]]
## [1] 4
##
## [[3]]
## [1] 5
##
## [[4]]
## [1] 6
##
## [[5]]
## [1] 7
##
## [[6]]
## [1] 8
##
## [[7]]
## [1] 9
##
## [[8]]
## [1] 10
##
## [[9]]
## [1] 11
sapply(int_vec, add_two)
## [1] 3 4 5 6 7 8 9 10 11
sapply( ) is also applicable to elements in different formats.
library(stringr)
List1
## $headline
## [1] "씨티은행, 7억 '파격 퇴직금'에 신청자 속출"
## [2] "구미 3세 여아 친모 \"출산한 적 없다..직장 동료 증인으로\""
## [3] "4m 악어에 물린 호주 60대男, 맥가이버칼로 혈투 끝 탈출"
## [4] "[노컷브이]장관이 반박하자..김정재 \"어디 끼어들어, 제정신이야\""
## [5] "檢수사 미진하면 특검 받겠다는 이재명..안철수 \"안받겠다는 말장난\""
##
## $company
## [1] "머니투데이" "연합뉴스" "뉴스1" "노컷뉴스" "조선비즈"
##
## $date
## [1] 20201025 20201025 20201025 20201026 20201026
sapply(List1, str_length)
## headline company date
## [1,] 25 5 8
## [2,] 34 4 8
## [3,] 33 3 8
## [4,] 36 4 8
## [5,] 37 4 8
tapply( ) is used for applying a specified function to each element of a vector, grouped by another vector.
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.4 v dplyr 1.0.7
## v tidyr 1.1.3 v forcats 0.5.1
## v readr 2.0.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x readr::guess_encoding() masks rvest::guess_encoding()
## x dplyr::lag() masks stats::lag()
mytable <- tibble(headline=h_vector, company=c_vector, date=d_vector) # Create a tibble object (data frame) with three variables
mytable # returns a table with the three vectors
## # A tibble: 5 x 3
## headline company date
## <chr> <chr> <dbl>
## 1 "씨티은행, 7억 '파격 퇴직금'에 신청자 속출" 머니투데이 2.02e7
## 2 "구미 3세 여아 친모 \"출산한 적 없다..직장 동료 증인으로\"" 연합뉴스 2.02e7
## 3 "4m 악어에 물린 호주 60대男, 맥가이버칼로 혈투 끝 탈출" 뉴스1 2.02e7
## 4 "[노컷브이]장관이 반박하자..김정재 \"어디 끼어들어, 제정신~ 노컷뉴스 2.02e7
## 5 "檢수사 미진하면 특검 받겠다는 이재명..안철수 \"안받겠다는~ 조선비즈 2.02e7
mytable$headline # $ sign selects a column of a data frame named "headline"
## [1] "씨티은행, 7억 '파격 퇴직금'에 신청자 속출"
## [2] "구미 3세 여아 친모 \"출산한 적 없다..직장 동료 증인으로\""
## [3] "4m 악어에 물린 호주 60대男, 맥가이버칼로 혈투 끝 탈출"
## [4] "[노컷브이]장관이 반박하자..김정재 \"어디 끼어들어, 제정신이야\""
## [5] "檢수사 미진하면 특검 받겠다는 이재명..안철수 \"안받겠다는 말장난\""
mytable$company
## [1] "머니투데이" "연합뉴스" "뉴스1" "노컷뉴스" "조선비즈"
mytable$date
## [1] 20201025 20201025 20201025 20201026 20201026
Say we want to count how many characters appear in headlines on 20201025 and in headlines on 20201026. Here each headline can be grouped by the variable date.
tapply(mytable$headline, mytable$date, str_length) # applies the function str_length to mytable$headline, grouped by mytable$date, and returns the result: the number of characters in each headline
## $`20201025`
## [1] 25 34 33
##
## $`20201026`
## [1] 36 37
tapply(x,y,str_length): Applies the function str_length() to x as a vector of character length in each headline, grouped by y as another vector of dates.
Let’s calculate how many headlines are in each company and how many characters are in the headlines, using the function tapply( ).
headlines
## [1] "씨티은행, 7억 '파격 퇴직금'에 신청자 속출"
## [2] "구미 3세 여아 친모 \"출산한 적 없다..직장 동료 증인으로\""
## [3] "4m 악어에 물린 호주 60대男, 맥가이버칼로 혈투 끝 탈출"
## [4] "[노컷브이]장관이 반박하자..김정재 \"어디 끼어들어, 제정신이야\""
## [5] "檢수사 미진하면 특검 받겠다는 이재명..안철수 \"안받겠다는 말장난\""
## [6] "'文대통령 딸 관저 거주'로 시끌.. 유영민 \"아빠찬스 아냐\""
## [7] "\"지난달 샀으면 멘붕\"..지방도 집값 거품 빠지나"
## [8] "\"5·18묘지에 발도 들이지 말라\"..광주 도심 뒤덮은 '윤석열 거부' 플래카드"
## [9] "흡연자가 넘어뜨린 오토바이.. \"수리비 400만원, 경찰은 수사 못한다더라\"[영상]"
## [10] "'尹 우세' 의식했나.. 김어준, 심상정 측에 \"완주\" 3번 물었다"
## [11] "[뉴시스Pic] \"윤석열 보호 울타리 치워라\" 5·18 국립묘지 앞에서 충돌한 경찰과 시민들"
## [12] "이재명에 심상치 않은 '호남 민심'..이번 대선 때도 '묻지마 몰표' 나올까"
## [13] "지지도 윤석열 46.3%vs이재명 32.3%..당선가능성 尹 48.6%vs李 39%"
## [14] "이재명, 김혜경 안부묻자 \"사람 혼절 처음 봐..지금은 괜찮아\""
## [15] "\"건강에 좋다 해서 먹었는데\"..새싹보리 등 분말서 기준 최대 22배 쇳가루"
## [16] "주차장 컨테이너 살던 노인, 건물주에 강남 2000억대 땅부자였다"
## [17] "노량진 수산시장 한 상인의 부고"
## [18] "진중권 \"尹캠프, 이준석·김종인 막으려해..잘들 해보셔\""
## [19] "'화이자 백신 임상 부실' 내부 폭로에.. 당국 \"지켜보고 있지만, 정보 제한적\""
## [20] "\"일어나지 마, 전화만 받아\""
## [21] "윤호중, 尹아내 김건희 허위이력 의혹에 \"이쯤 되면 영부인될 자격 없다\""
## [22] "이재명 \"음주운전보다 초보운전이 위험..도덕성 자신있다\""
## [23] "文 부정평가 60% 돌파..與 지지율·정권유지 여론 30%도 위태"
## [24] "[단독]\"尹비서실장 당초 장제원 거론..김종인 비토에 포기\""
## [25] "김오수, 12일까지 돌연 휴가..'無참관·無영장' 압수·포렌식에 '묵묵부답'"
## [26] "[뉴시스Pic] 윤석열, 5·18민주화운동 진상규명 앞장 선 故 홍남순 변호사 생가 방문"
## [27] "[현장영상] 윤석열, 광주 5·18 민주묘지 방문..'물러가라' 항의 구호"
## [28] "[함양] 백운산, 첫눈 내려 하얀 풍경 연출"
## [29] "[양담소] \"친자식처럼 키운 아들이 가족관계증명서상 제 자녀가 아니었어요.\""
## [30] "'독도 일본 땅 교육' 하야시, 日 신임 외상에.. \"한·일 관계, 큰 변화 없을 것\" [특파원+]"
## [31] "'비호감' 안철수 70.5% > 이재명 60.9% > 윤석열 52.8%"
## [32] "자동차 요소수 2.5개월치 확보..12일부터 시장 공급"
## [33] "\"요소수 대란은 정책 실패\" 中 수출 금지 3주 만에 첫 논의.. 골든타임 놓친 정부"
## [34] "\"울산 김기현 임야, 도로 통과하면 맹지가 기회의 땅으로\"(종합)"
## [35] "\"떨어트리면 주머니 털린다\" 150만원 아이폰 화면 수리비가 무려.."
## [36] "[뉴시스 앵글] 자연과 어우러진 '물고기 생명길' 어도"
## [37] "러, 한국에 스푸트니크 백신 신속 승인 요청..요소수 공급 협의도"
## [38] "[단독]'컨테이너 할아버지' 반전..강남 2000억대 땅부자였다"
## [39] "39명 태우고 제주 가던 대한항공, 이륙 25분에 급히 회항..무슨일이"
## [40] "\"윤석열 계속 지지\" 72.6%..\"이재명 계속 지지\" 66.8%"
## [41] "민주당 \"울산역 인근 김기현 대표 임야 도로 노선변경 의혹\""
## [42] "與 \"이재명 부인 낙상사고 가짜뉴스에 강력 대응\""
## [43] "'文대통령 딸, 관저 거주' 논란에.. 靑비서실장 \"아빠찬스 아냐\""
## [44] "이재명 \"고민 고민 끝에 여성가족부 폐지하자 했다, 왜냐면..\""
## [45] "[르포]\"尹 가짜 사과 필요없다\"..5·18묘지 막아선 민심"
## [46] "목과 겨드랑이에 생긴 까만 때, 의외의 원인은?"
## [47] "아이 오줌에 '혈뇨'가?..학교검진 소견 받고 깜짝 놀란 부모들"
## [48] "[속보]윤석열 \"사과로 끝이 아니라 이 마음 계속 가져갈 것\""
## [49] "[속보]<U+FEFF>윤석열 \"민주화·인권·5월정신 반드시 세우겠다\""
## [50] "\"윤석열, 홍남순 변호사 생가 방문은 후안무치\""
companies
## [1] "머니투데이" "연합뉴스" "뉴스1" "노컷뉴스" "조선비즈"
## [6] "이데일리" "아시아경제" "경향신문" "머니S" "이데일리"
## [11] "뉴시스" "경향신문" "뉴스1" "머니투데이" "뉴스1"
## [16] "머니투데이" "오마이뉴스" "이데일리" "세계일보" "오마이뉴스"
## [21] "세계일보" "뉴시스" "머니투데이" "중앙일보" "뉴스1"
## [26] "뉴시스" "YTN" "오마이뉴스" "YTN" "세계일보"
## [31] "머니투데이" "뉴스1" "조선비즈" "뉴스1" "헤럴드경제"
## [36] "뉴시스" "뉴시스" "중앙일보" "매일경제" "머니투데이"
## [41] "연합뉴스" "뉴스1" "이데일리" "오마이뉴스" "노컷뉴스"
## [46] "하이닥" "국민일보" "뉴시스" "동아일보" "뉴시스"
headline_df <- tibble(headlines, companies) # creates a data frame including two vectors as columns
headline_df
## # A tibble: 50 x 2
## headlines companies
## <chr> <chr>
## 1 "씨티은행, 7억 '파격 퇴직금'에 신청자 속출" 머니투데~
## 2 "구미 3세 여아 친모 \"출산한 적 없다..직장 동료 증인으로\"" 연합뉴스
## 3 "4m 악어에 물린 호주 60대男, 맥가이버칼로 혈투 끝 탈출" 뉴스1
## 4 "[노컷브이]장관이 반박하자..김정재 \"어디 끼어들어, 제정신이야\"" 노컷뉴스
## 5 "檢수사 미진하면 특검 받겠다는 이재명..안철수 \"안받겠다는 말장난\~ 조선비즈
## 6 "'文대통령 딸 관저 거주'로 시끌.. 유영민 \"아빠찬스 아냐\"" 이데일리
## 7 "\"지난달 샀으면 멘붕\"..지방도 집값 거품 빠지나" 아시아경~
## 8 "\"5·18묘지에 발도 들이지 말라\"..광주 도심 뒤덮은 '윤석열 거부' ~ 경향신문
## 9 "흡연자가 넘어뜨린 오토바이.. \"수리비 400만원, 경찰은 수사 못한다~ 머니S
## 10 "'尹 우세' 의식했나.. 김어준, 심상정 측에 \"완주\" 3번 물었다" 이데일리
## # ... with 40 more rows
# length() & str_length() apply to headline_df$headlines, grouped by headline_df$companies
tapply(headline_df$headlines, headline_df$companies, length) # returns a table
## YTN 경향신문 국민일보 노컷뉴스 뉴스1 뉴시스 동아일보
## 2 2 1 2 7 7 1
## 매일경제 머니S 머니투데이 세계일보 아시아경제 연합뉴스 오마이뉴스
## 1 1 6 3 1 2 4
## 이데일리 조선비즈 중앙일보 하이닥 헤럴드경제
## 4 2 2 1 1
tapply(headline_df$headlines, headline_df$companies, str_length)
## $YTN
## [1] 41 42
##
## $경향신문
## [1] 44 42
##
## $국민일보
## [1] 35
##
## $노컷뉴스
## [1] 36 33
##
## $뉴스1
## [1] 33 46 42 42 30 36 27
##
## $뉴시스
## [1] 51 31 49 30 36 34 26
##
## $동아일보
## [1] 31
##
## $매일경제
## [1] 39
##
## $머니S
## [1] 46
##
## $머니투데이
## [1] 25 35 36 36 39 36
##
## $세계일보
## [1] 45 40 55
##
## $아시아경제
## [1] 27
##
## $연합뉴스
## [1] 34 33
##
## $오마이뉴스
## [1] 17 16 24 35
##
## $이데일리
## [1] 34 37 31 37
##
## $조선비즈
## [1] 37 47
##
## $중앙일보
## [1] 33 35
##
## $하이닥
## [1] 26
##
## $헤럴드경제
## [1] 38
headline_characters <- tapply(headline_df$headlines, headline_df$companies, str_length)
headline_characters
## $YTN
## [1] 41 42
##
## $경향신문
## [1] 44 42
##
## $국민일보
## [1] 35
##
## $노컷뉴스
## [1] 36 33
##
## $뉴스1
## [1] 33 46 42 42 30 36 27
##
## $뉴시스
## [1] 51 31 49 30 36 34 26
##
## $동아일보
## [1] 31
##
## $매일경제
## [1] 39
##
## $머니S
## [1] 46
##
## $머니투데이
## [1] 25 35 36 36 39 36
##
## $세계일보
## [1] 45 40 55
##
## $아시아경제
## [1] 27
##
## $연합뉴스
## [1] 34 33
##
## $오마이뉴스
## [1] 17 16 24 35
##
## $이데일리
## [1] 34 37 31 37
##
## $조선비즈
## [1] 37 47
##
## $중앙일보
## [1] 33 35
##
## $하이닥
## [1] 26
##
## $헤럴드경제
## [1] 38
class(headline_characters)
## [1] "array"
lapply(headline_characters, mean)
## $YTN
## [1] 41.5
##
## $경향신문
## [1] 43
##
## $국민일보
## [1] 35
##
## $노컷뉴스
## [1] 34.5
##
## $뉴스1
## [1] 36.57143
##
## $뉴시스
## [1] 36.71429
##
## $동아일보
## [1] 31
##
## $매일경제
## [1] 39
##
## $머니S
## [1] 46
##
## $머니투데이
## [1] 34.5
##
## $세계일보
## [1] 46.66667
##
## $아시아경제
## [1] 27
##
## $연합뉴스
## [1] 33.5
##
## $오마이뉴스
## [1] 23
##
## $이데일리
## [1] 34.75
##
## $조선비즈
## [1] 42
##
## $중앙일보
## [1] 34
##
## $하이닥
## [1] 26
##
## $헤럴드경제
## [1] 38
urls
## [1] "https://news.daum.net/ranking/popular?regDate=20201025"
## [2] "https://news.daum.net/ranking/popular?regDate=20201026"
## [3] "https://news.daum.net/ranking/popular?regDate=20201027"
## [4] "https://news.daum.net/ranking/popular?regDate=20201028"
## [5] "https://news.daum.net/ranking/popular?regDate=20201029"
## [6] "https://news.daum.net/ranking/popular?regDate=20201030"
## [7] "https://news.daum.net/ranking/popular?regDate=20201031"
library(XML)
headline_extractor <- function(url) {
page <- readLines(url)
page_parsed <- htmlParse(page)
headlines <- xpathSApply(page_parsed, headline_xpath, xmlValue)
return(headlines)
}
headline_list <- lapply(as.list(urls), headline_extractor)
class(headline_list)
## [1] "list"
length(headline_list)
## [1] 7
urls[3]
## [1] "https://news.daum.net/ranking/popular?regDate=20201027"
headline_list[[3]]
## [1] "'백신 사망' 17세 고교생, 부검서 화학물질 검출..유족 \"억울하다\""
## [2] "[단독][취재파일] 잿더미 된 사찰, 알고 보니..부처님 앞 \"할렐루야!\" 외친 '그 여자'"
## [3] "'화학물질 검출' 고교생..경찰 \"직접 구매 확인\" 가족 \"극단선택 이유없다\""
## [4] "[AS뉴스]\"엽기폭행 양진호, 옥중 결혼..한해 수익 2백억\""
## [5] "성병 숨기고 7개월간 두명과 성관계..20대 집행유예"
## [6] "'붉은대게' 재고 산더미..공장 문 닫고 조업 포기"
## [7] "'갑질폭행' 양진호, 옥중결혼 이유..부인 통해 매년 200억 가져간다"
## [8] "7억짜리 용인 땅, 300억 됐다..이건희가 건설비 전액 댄 이곳"
## [9] "[단독] '조국 일가 명예훼손' 보수 블로거 \"조 선생님 선처를\""
## [10] "용인 골프모임 31명 집단확진..가족모임·어린이집서도 새 감염(종합)"
## [11] "자신과 아내 지키려 흉기든 이웃 제압해 숨지게 한 70대 '무죄'"
## [12] "'3000만원 현상금'에 놀라 롤렉스 반환한 범인 \"고가인줄 몰랐어요\"[사건TMI!]"
## [13] "유튜브 잠깐 출연했다 봉변.. 일상 덮친 이름 모를 '악플'"
## [14] "트럼프 개인 빚 1조2400억..재선 실패땐 파산 가능성"
## [15] "무면허로 전동킥보드 타다 택시 충돌한 고교생, 사흘만에 사망"
## [16] "시외버스서 승객 너머로 자위행위 촬영 20대 집행유예"
## [17] "[단독] \"실종 보고받고 지휘한 내용 밝혀라\"<U+22EF> 피격 공무원 형, 청와대에 정보공개 청구"
## [18] "세계최고 수준 천문학적 세금 '폭탄'..세금 때문에 기업 판다"
## [19] "인천 고교생 사망 원인 \"독감 백신 아닌 독극물\""
## [20] "트럼프 잔고 바닥났다, 바이든은 45억짜리 브래드 피트 광고"
## [21] "백*원의 원조쌈밥집 등 '자기 이름을 상표로'..성명상표 출원 활발"
## [22] "문대통령이 윤석열에 메신저 보내?..靑 \"정보 없어 확인 불가\""
## [23] "인천 마트 주차장 3층서 승용차 추락..70대 운전자 숨져"
## [24] "\"휠 고의 파손? 그런적 없다\" 타이어뱅크 점주 '사과문' 나흘만에 돌변"
## [25] "강경화 \"비자발급 안돼\"→유승준 또 호소문..\"국민이 거부\" 여론 싸늘"
## [26] "아프리카서 물개 7000마리 떼죽음 미스터리..대부분 태아 상태"
## [27] "파지수집 리어카 끌던 노인, 전복된 승용차에 치여 사망(종합)"
## [28] "트럼프 극찬한 항체 치료제 실제 써보니 '효과'"
## [29] "\"왜 더 큰 평수로 옮겨요? 이거 거래허가 못내줍니다\""
## [30] "쇠징 박힌 신발 신은 채 후배 얼굴 걷어찬 겁 없는 10대"
## [31] "1인용 킥보드에 남녀 두명이? 도로 위 '위험천만' 데이트"
## [32] "백악관 \"대유행 통제 않을 것\" 바이든 \"패배의 백기 흔들어\""
## [33] "[뉴스하이킥] \"원장 딸이 발로 밟고 아이 던져.. 반성하는 모습 전혀 없다\""
## [34] "EU 27개 '몰표' 나이지리아로..WTO 첫 한국인 수장 선출 경고등"
## [35] "'한동훈과 육탄전' 정진웅, 독직폭행 혐의로 기소(종합)"
## [36] "의협 다시 집단행동? \"28일까지 의사국시 해결책 내놓지 않으면..\""
## [37] "[주진우 라이브] 함세웅 신부 \"이건희의 '마누라와 자식 빼고 버려라?'..가족에 매몰된 한계가 삼성의 한계이자 우리 시대의 한계\""
## [38] "\"한국만 아니면 된다\"..고비 때마다 '발목' 잡는 일본"
## [39] "중국 공청단 \"한국전쟁 남침 아니다..한 국가 내전\" 궤변(종합)"
## [40] "이건희 회장 병상 6년간 일가 받은 배당금 2.8조"
## [41] "이탈리아 언론 또 한국 칭찬..\"첨단기술로 바이러스 잡았다\""
## [42] "AFP \"EU 회원국 대다수, WTO 총장 선거서 나이지리아 후보 지지\""
## [43] "[단독] 첫날부터 오작동..2억 원 아끼려다 5명 목숨 잃었다"
## [44] "[단독] \"말로만 죽는다네 ㅋㅋ\".. 동료 학생 죽음으로 몬 '에타' 악플"
## [45] "독감 백신 접종 뒤 숨진 인천 고교생 형 \"억울함 풀어달라\" 청원(종합)"
## [46] "[황보선의출발새아침] 박수영\"文 대통령, 둘 다 해임하든 한 사람 해임하든지 결단해야\""
## [47] "낙동강 하구 이어 도심하천인 부산 온천천에서도 연어 발견"
## [48] "중국 신장서 기침·발열없이 137명 집단감염..\"이전 코로나와 다르다\""
## [49] "1년 동안 명품 5억여원어치 빼돌린 백화점 판매원 징역 2년"
## [50] "[시선집중 ] '제2의 구하라사건' 유족 \"생모, 평생 죄책감갖고 떳떳하게는 못 살길\""
company_extractor <- function(url) {
page <- readLines(url)
page_parsed <- htmlParse(page)
companies <- xpathSApply(page_parsed, company_xpath, xmlValue)
return(companies)
}
company_list <- lapply(urls, company_extractor)
length(company_list)
## [1] 7
urls[7]
## [1] "https://news.daum.net/ranking/popular?regDate=20201031"
company_list[[7]]
## [1] "중앙일보" "머니투데이" "경향신문" "JTBC" "한국경제"
## [6] "연합뉴스" "연합뉴스" "머니투데이" "연합뉴스" "뉴스1"
## [11] "연합뉴스" "연합뉴스" "서울신문" "오마이뉴스" "뉴스1"
## [16] "뉴스1" "뉴스1" "미디어오늘" "뉴스1" "연합뉴스"
## [21] "연합뉴스" "연합뉴스" "조선일보" "중앙SUNDAY" "서울경제"
## [26] "뉴스1" "중앙SUNDAY" "이데일리" "머니투데이" "연합뉴스"
## [31] "서울신문" "뉴시스" "뉴스1" "오마이뉴스" "MBC"
## [36] "경향신문" "YTN" "뉴시스" "아시아경제" "뉴스1"
## [41] "중앙일보" "연합뉴스" "한국일보" "뉴스1" "서울신문"
## [46] "뉴스1" "뉴스1" "KBS" "MBC" "중앙일보"