library(XML)
library(rvest)

Manipulating URLs to access multiple pages over the last 2 weeks

library(stringr)
baseurl <- "https://news.daum.net/ranking/popular?regDate="
dates <- seq(from=as.Date("2021-10-25"), to=as.Date("2021-11-07"), by= "day")
dates <- str_remove_all(dates, "-")
urls <- str_c(baseurl, dates)
urls
##  [1] "https://news.daum.net/ranking/popular?regDate=20211025"
##  [2] "https://news.daum.net/ranking/popular?regDate=20211026"
##  [3] "https://news.daum.net/ranking/popular?regDate=20211027"
##  [4] "https://news.daum.net/ranking/popular?regDate=20211028"
##  [5] "https://news.daum.net/ranking/popular?regDate=20211029"
##  [6] "https://news.daum.net/ranking/popular?regDate=20211030"
##  [7] "https://news.daum.net/ranking/popular?regDate=20211031"
##  [8] "https://news.daum.net/ranking/popular?regDate=20211101"
##  [9] "https://news.daum.net/ranking/popular?regDate=20211102"
## [10] "https://news.daum.net/ranking/popular?regDate=20211103"
## [11] "https://news.daum.net/ranking/popular?regDate=20211104"
## [12] "https://news.daum.net/ranking/popular?regDate=20211105"
## [13] "https://news.daum.net/ranking/popular?regDate=20211106"
## [14] "https://news.daum.net/ranking/popular?regDate=20211107"

What is a function? What is the function, lapply()?

Function

Function

urls
##  [1] "https://news.daum.net/ranking/popular?regDate=20211025"
##  [2] "https://news.daum.net/ranking/popular?regDate=20211026"
##  [3] "https://news.daum.net/ranking/popular?regDate=20211027"
##  [4] "https://news.daum.net/ranking/popular?regDate=20211028"
##  [5] "https://news.daum.net/ranking/popular?regDate=20211029"
##  [6] "https://news.daum.net/ranking/popular?regDate=20211030"
##  [7] "https://news.daum.net/ranking/popular?regDate=20211031"
##  [8] "https://news.daum.net/ranking/popular?regDate=20211101"
##  [9] "https://news.daum.net/ranking/popular?regDate=20211102"
## [10] "https://news.daum.net/ranking/popular?regDate=20211103"
## [11] "https://news.daum.net/ranking/popular?regDate=20211104"
## [12] "https://news.daum.net/ranking/popular?regDate=20211105"
## [13] "https://news.daum.net/ranking/popular?regDate=20211106"
## [14] "https://news.daum.net/ranking/popular?regDate=20211107"
remove_numbers <- function(x){
  library(stringr)
  y <- str_remove(x, "[[:digit:]]+")
  return(y)
}

?lapply
## starting httpd help server ... done
class(lapply(urls, remove_numbers))
## [1] "list"
lapply(urls, remove_numbers)
## [[1]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[2]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[3]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[4]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[5]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[6]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[7]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[8]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[9]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[10]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[11]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[12]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[13]]
## [1] "https://news.daum.net/ranking/popular?regDate="
## 
## [[14]]
## [1] "https://news.daum.net/ranking/popular?regDate="

R Basics for Web Scraping

Creating vectors

A sequence of numbers/integers, characters, or Booleans

c(1,3,5) # Join elements into a vector 
## [1] 1 3 5
1:5 # An integer sequence
## [1] 1 2 3 4 5
seq(1, 5, by=2) # A sequence of integers from 1 to 5, increasing by 2
## [1] 1 3 5
rep(1:5, times=3) # Repeat an integer sequence 1:5 three times
##  [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
rep(1:5, each=3) # Repeat each element of an integer sequence 1:5 three times
##  [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5

Vector functions

# R is an object-oriented programming language; everything can be assigned to an object

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)
headlines
##  [1] "\"지난달 샀으면 멘붕\"..지방도 집값 거품 빠지나"                                               
##  [2] "'대통령딸 관저 거주' 논란에 유영민 \"아빠찬스? 동의하기 어렵다\""                              
##  [3] "이재명 \"尹 '본·부·장' 비리를 왜 대장동과 동시특검..수사권 쇼핑 꼼수\""                      
##  [4] "[뉴시스Pic] \"윤석열 보호 울타리 치워라\" 5·18 국립묘지 앞에서 충돌한 경찰과 시민들"          
##  [5] "\"좁은 집서 애 둘 낳고 19년 살라고?\"..외면 받는 신혼희망타운"                                 
##  [6] "주차장 컨테이너 살던 노인, 건물주에 강남 2000억대 땅부자였다"                                  
##  [7] "\"건강에 좋다 해서 먹었는데\"..새싹보리 등 분말서 기준 최대 22배 쇳가루"                       
##  [8] "'尹 우세' 의식했나.. 김어준, 심상정 측에 \"완주\" 3번 물었다"                                  
##  [9] "[양담소] \"친자식처럼 키운 아들이 가족관계증명서상 제 자녀가 아니었어요.\""                    
## [10] "대리 기사·캐디·간병인, 이달부터 소득 자료 매월 제출해야"                                     
## [11] "한국 국방부가 맞았다..日, 北 미사일 '2발 아닌 1발' 정정(상보)"                                 
## [12] "열달 품어 낳았는데 남의 아이였다..두 부부 울린 기막힌 사연"                                    
## [13] "與 \"이재명 부인 낙상사고 가짜뉴스에 강력 대응\""                                              
## [14] "[현장영상] 조성은 \"현직검사의 선거 개입 신고한 것..김웅, 모든 순간 거짓말\""                  
## [15] "특검 논란에 정면돌파 시도하는 이재명"                                                          
## [16] "'통행 항의' 노인 치어 사망..덤프트럭 기사 혐의 인정"                                           
## [17] "윤석열 둘러싼 또하나의 아킬레스건 '윤우진'..검찰 투트랙 수사"                                  
## [18] "이준석 \"요소수 문제 국정원이 해외정보 파악 못 해 발생\""                                      
## [19] "이재명, 김혜경 안부묻자 \"사람 혼절 처음 봐..지금은 괜찮아\""                                  
## [20] "트럼프 측근 공화당 의원이 올린 '동영상'에 美정가 '발칵'"                                       
## [21] "딸 위해 산 시베리안 허스키, 알고보니 가축 잡아먹는 여우였다"                                   
## [22] "\"일어나지 마, 전화만 받아\""                                                                  
## [23] "\"권순일 재판거래 사실이면 사퇴할거냐\"..이재명 \"질문 아닌 공격\""                            
## [24] "광주 찾는 윤석열에게 5·18단체가 제시한 두 가지 '사과의 조건'"                                 
## [25] "\"윤석열, 홍남순 변호사 생가 방문은 후안무치\""                                                
## [26] "與, 윤석열 아내 김건희에 \"영부인 자격 없어\""                                                 
## [27] "[단독]'컨테이너 할아버지' 반전..강남 2000억대 땅부자였다"                                      
## [28] "이재명, 尹과 동시특검 주장에 \"내가 뭘 잘못했느냐\""                                           
## [29] "노량진 수산시장 한 상인의 부고"                                                                
## [30] "이재명 \"한미일 군사동맹 반대..日이 완전한 우방인가\""                                         
## [31] "목과 겨드랑이에 생긴 까만 때, 의외의 원인은?"                                                  
## [32] "\"이제 재택근무도 못하는데..\" 위드 코로나로 오히려 커진 '돌봄 공백' 위험"                     
## [33] "'모더나가 했다' vs '국립보건원 함께'..백신 특허 누구 것?"                                      
## [34] "\"인도, 중국산 요소 80% 쓸어담아\" 요소 싹쓸이에 한국 요소수 대란"                             
## [35] "\"고2 남자인데요..\" 2007년 지식인에 올라온 이 글, 14년 만에 화제된 까닭"                      
## [36] "\"20억년 동안 단 1초 오차\"..'K-광시계' 세계 표준된다"                                         
## [37] "[영상] 교통법규 위반 차량 노린 보험사기 일당 검거"                                             
## [38] "\"현직 공무원이 야근했다 속이고 공금 1천만원 횡령\""                                           
## [39] "중국서 요소 2만여t 들어온다..홍남기 \"어려움 해소될 것\""                                      
## [40] "새벽에 내린 서울 첫눈..\"지난해보다 한달 빨라\" [영상]"                                        
## [41] "\"우릴 인정 안하면 무너질 것\".. 中언론들, 요소수 대란에 중국 찬가"                            
## [42] "공시가 1억 아파트 '싹쓸이' 조사한다..법인·외지인 투기 정조준"                                 
## [43] "한명숙 이어 조국 사건까지 '닮은꼴'.. '진정서 제출→감찰'로 수사 흠집내나"                      
## [44] "[단독]'미스터 쓴소리' 조응천, 민주당 선대위 '레드팀' 맡는다"                                   
## [45] "[함양] 백운산, 첫눈 내려 하얀 풍경 연출"                                                       
## [46] "이재명 \"아내, 혼절하는 모습 처음봐..지금은 괜찮아보여\""                                      
## [47] "수정란 바뀌어 남의 아이 출산..낳고 키운 딸아이 어쩌나"                                         
## [48] "수십만 은둔형 외톨이, 통계도 안전망도 없다 [숨어버린 사람들 1 통계조차 못내는 '은둔형 외톨이']"
## [49] "\"중학생이 무릎으로 얼굴 가격\"..경기도 학폭 피해 청와대 청원"                                 
## [50] "광주행 윤석열, '전두환 옹호' 사과로 호남 민심 달래기(종합)"
companies <- xpathSApply(page_parsed, company_xpath, xmlValue)
companies
##  [1] "아시아경제"   "뉴스1"        "뉴스1"        "뉴시스"       "한국경제"    
##  [6] "머니투데이"   "뉴스1"        "이데일리"     "YTN"          "뉴시스"      
## [11] "뉴스1"        "중앙일보"     "뉴스1"        "YTN"          "시사저널"    
## [16] "연합뉴스"     "한겨레"       "연합뉴스"     "머니투데이"   "프레시안"    
## [21] "뉴스1"        "오마이뉴스"   "머니투데이"   "한국일보"     "뉴시스"      
## [26] "이데일리"     "중앙일보"     "연합뉴스"     "오마이뉴스"   "뉴시스"      
## [31] "하이닥"       "경향신문"     "한겨레"       "아시아경제"   "중앙일보"    
## [36] "헤럴드경제"   "서울신문"     "뉴스1"        "이데일리"     "국민일보"    
## [41] "조선일보"     "머니투데이"   "문화일보"     "국민일보"     "오마이뉴스"  
## [46] "이데일리"     "연합뉴스"     "파이낸셜뉴스" "매일경제"     "뉴시스"
headlines
##  [1] "\"지난달 샀으면 멘붕\"..지방도 집값 거품 빠지나"                                               
##  [2] "'대통령딸 관저 거주' 논란에 유영민 \"아빠찬스? 동의하기 어렵다\""                              
##  [3] "이재명 \"尹 '본·부·장' 비리를 왜 대장동과 동시특검..수사권 쇼핑 꼼수\""                      
##  [4] "[뉴시스Pic] \"윤석열 보호 울타리 치워라\" 5·18 국립묘지 앞에서 충돌한 경찰과 시민들"          
##  [5] "\"좁은 집서 애 둘 낳고 19년 살라고?\"..외면 받는 신혼희망타운"                                 
##  [6] "주차장 컨테이너 살던 노인, 건물주에 강남 2000억대 땅부자였다"                                  
##  [7] "\"건강에 좋다 해서 먹었는데\"..새싹보리 등 분말서 기준 최대 22배 쇳가루"                       
##  [8] "'尹 우세' 의식했나.. 김어준, 심상정 측에 \"완주\" 3번 물었다"                                  
##  [9] "[양담소] \"친자식처럼 키운 아들이 가족관계증명서상 제 자녀가 아니었어요.\""                    
## [10] "대리 기사·캐디·간병인, 이달부터 소득 자료 매월 제출해야"                                     
## [11] "한국 국방부가 맞았다..日, 北 미사일 '2발 아닌 1발' 정정(상보)"                                 
## [12] "열달 품어 낳았는데 남의 아이였다..두 부부 울린 기막힌 사연"                                    
## [13] "與 \"이재명 부인 낙상사고 가짜뉴스에 강력 대응\""                                              
## [14] "[현장영상] 조성은 \"현직검사의 선거 개입 신고한 것..김웅, 모든 순간 거짓말\""                  
## [15] "특검 논란에 정면돌파 시도하는 이재명"                                                          
## [16] "'통행 항의' 노인 치어 사망..덤프트럭 기사 혐의 인정"                                           
## [17] "윤석열 둘러싼 또하나의 아킬레스건 '윤우진'..검찰 투트랙 수사"                                  
## [18] "이준석 \"요소수 문제 국정원이 해외정보 파악 못 해 발생\""                                      
## [19] "이재명, 김혜경 안부묻자 \"사람 혼절 처음 봐..지금은 괜찮아\""                                  
## [20] "트럼프 측근 공화당 의원이 올린 '동영상'에 美정가 '발칵'"                                       
## [21] "딸 위해 산 시베리안 허스키, 알고보니 가축 잡아먹는 여우였다"                                   
## [22] "\"일어나지 마, 전화만 받아\""                                                                  
## [23] "\"권순일 재판거래 사실이면 사퇴할거냐\"..이재명 \"질문 아닌 공격\""                            
## [24] "광주 찾는 윤석열에게 5·18단체가 제시한 두 가지 '사과의 조건'"                                 
## [25] "\"윤석열, 홍남순 변호사 생가 방문은 후안무치\""                                                
## [26] "與, 윤석열 아내 김건희에 \"영부인 자격 없어\""                                                 
## [27] "[단독]'컨테이너 할아버지' 반전..강남 2000억대 땅부자였다"                                      
## [28] "이재명, 尹과 동시특검 주장에 \"내가 뭘 잘못했느냐\""                                           
## [29] "노량진 수산시장 한 상인의 부고"                                                                
## [30] "이재명 \"한미일 군사동맹 반대..日이 완전한 우방인가\""                                         
## [31] "목과 겨드랑이에 생긴 까만 때, 의외의 원인은?"                                                  
## [32] "\"이제 재택근무도 못하는데..\" 위드 코로나로 오히려 커진 '돌봄 공백' 위험"                     
## [33] "'모더나가 했다' vs '국립보건원 함께'..백신 특허 누구 것?"                                      
## [34] "\"인도, 중국산 요소 80% 쓸어담아\" 요소 싹쓸이에 한국 요소수 대란"                             
## [35] "\"고2 남자인데요..\" 2007년 지식인에 올라온 이 글, 14년 만에 화제된 까닭"                      
## [36] "\"20억년 동안 단 1초 오차\"..'K-광시계' 세계 표준된다"                                         
## [37] "[영상] 교통법규 위반 차량 노린 보험사기 일당 검거"                                             
## [38] "\"현직 공무원이 야근했다 속이고 공금 1천만원 횡령\""                                           
## [39] "중국서 요소 2만여t 들어온다..홍남기 \"어려움 해소될 것\""                                      
## [40] "새벽에 내린 서울 첫눈..\"지난해보다 한달 빨라\" [영상]"                                        
## [41] "\"우릴 인정 안하면 무너질 것\".. 中언론들, 요소수 대란에 중국 찬가"                            
## [42] "공시가 1억 아파트 '싹쓸이' 조사한다..법인·외지인 투기 정조준"                                 
## [43] "한명숙 이어 조국 사건까지 '닮은꼴'.. '진정서 제출→감찰'로 수사 흠집내나"                      
## [44] "[단독]'미스터 쓴소리' 조응천, 민주당 선대위 '레드팀' 맡는다"                                   
## [45] "[함양] 백운산, 첫눈 내려 하얀 풍경 연출"                                                       
## [46] "이재명 \"아내, 혼절하는 모습 처음봐..지금은 괜찮아보여\""                                      
## [47] "수정란 바뀌어 남의 아이 출산..낳고 키운 딸아이 어쩌나"                                         
## [48] "수십만 은둔형 외톨이, 통계도 안전망도 없다 [숨어버린 사람들 1 통계조차 못내는 '은둔형 외톨이']"
## [49] "\"중학생이 무릎으로 얼굴 가격\"..경기도 학폭 피해 청와대 청원"                                 
## [50] "광주행 윤석열, '전두환 옹호' 사과로 호남 민심 달래기(종합)"
h_vector <- headlines[1:5]
h_vector
## [1] "\"지난달 샀으면 멘붕\"..지방도 집값 거품 빠지나"                                     
## [2] "'대통령딸 관저 거주' 논란에 유영민 \"아빠찬스? 동의하기 어렵다\""                    
## [3] "이재명 \"尹 '본·부·장' 비리를 왜 대장동과 동시특검..수사권 쇼핑 꼼수\""            
## [4] "[뉴시스Pic] \"윤석열 보호 울타리 치워라\" 5·18 국립묘지 앞에서 충돌한 경찰과 시민들"
## [5] "\"좁은 집서 애 둘 낳고 19년 살라고?\"..외면 받는 신혼희망타운"
companies
##  [1] "아시아경제"   "뉴스1"        "뉴스1"        "뉴시스"       "한국경제"    
##  [6] "머니투데이"   "뉴스1"        "이데일리"     "YTN"          "뉴시스"      
## [11] "뉴스1"        "중앙일보"     "뉴스1"        "YTN"          "시사저널"    
## [16] "연합뉴스"     "한겨레"       "연합뉴스"     "머니투데이"   "프레시안"    
## [21] "뉴스1"        "오마이뉴스"   "머니투데이"   "한국일보"     "뉴시스"      
## [26] "이데일리"     "중앙일보"     "연합뉴스"     "오마이뉴스"   "뉴시스"      
## [31] "하이닥"       "경향신문"     "한겨레"       "아시아경제"   "중앙일보"    
## [36] "헤럴드경제"   "서울신문"     "뉴스1"        "이데일리"     "국민일보"    
## [41] "조선일보"     "머니투데이"   "문화일보"     "국민일보"     "오마이뉴스"  
## [46] "이데일리"     "연합뉴스"     "파이낸셜뉴스" "매일경제"     "뉴시스"
c_vector <- companies[1:5]
c_vector
## [1] "아시아경제" "뉴스1"      "뉴스1"      "뉴시스"     "한국경제"
dates
##  [1] "20211025" "20211026" "20211027" "20211028" "20211029" "20211030"
##  [7] "20211031" "20211101" "20211102" "20211103" "20211104" "20211105"
## [13] "20211106" "20211107"
d_vector <- c(rep(dates[1],3),rep(dates[2],2))
d_vector
## [1] "20211025" "20211025" "20211025" "20211026" "20211026"

list( )

What is a vector object? A collection of ordered elements in the same nature.

Ex) a vector of headlines; a vector of company names; a vector of dates …

What is a list object?

A vector with possible heterogeneous elements. That is, a list is collection of elements which can be of different contents or types.

The elements of a list can include character vectors and numeric vectors at once.

Let say we want to generate a list object that contains the above three vector objects all together.

We can use a function list( ) here.

List1 <- list(headline=h_vector, company=c_vector, date=d_vector) # Generate a list object, List1, to contain all the elements that are named "headline", "company", and "date"
List1
## $headline
## [1] "\"지난달 샀으면 멘붕\"..지방도 집값 거품 빠지나"                                     
## [2] "'대통령딸 관저 거주' 논란에 유영민 \"아빠찬스? 동의하기 어렵다\""                    
## [3] "이재명 \"尹 '본·부·장' 비리를 왜 대장동과 동시특검..수사권 쇼핑 꼼수\""            
## [4] "[뉴시스Pic] \"윤석열 보호 울타리 치워라\" 5·18 국립묘지 앞에서 충돌한 경찰과 시민들"
## [5] "\"좁은 집서 애 둘 낳고 19년 살라고?\"..외면 받는 신혼희망타운"                       
## 
## $company
## [1] "아시아경제" "뉴스1"      "뉴스1"      "뉴시스"     "한국경제"  
## 
## $date
## [1] "20211025" "20211025" "20211025" "20211026" "20211026"
length(List1) # The function, length, calculates how many elements are in any R object (vectors, lists, & factors).
## [1] 3
class(List1) # R is an object-oriented style of programming. The function, class, allows us to know what type an object belongs to. It can be numeric, character, logical, list, and so on...
## [1] "list"
names(List1) # To get or set the names of an object; Here, elements' names are "headline", "company", and "date"
## [1] "headline" "company"  "date"
List1[1:2] # returns a new list object that contains the first and the second elements. What is length(List1[1:2])?
## $headline
## [1] "\"지난달 샀으면 멘붕\"..지방도 집값 거품 빠지나"                                     
## [2] "'대통령딸 관저 거주' 논란에 유영민 \"아빠찬스? 동의하기 어렵다\""                    
## [3] "이재명 \"尹 '본·부·장' 비리를 왜 대장동과 동시특검..수사권 쇼핑 꼼수\""            
## [4] "[뉴시스Pic] \"윤석열 보호 울타리 치워라\" 5·18 국립묘지 앞에서 충돌한 경찰과 시민들"
## [5] "\"좁은 집서 애 둘 낳고 19년 살라고?\"..외면 받는 신혼희망타운"                       
## 
## $company
## [1] "아시아경제" "뉴스1"      "뉴스1"      "뉴시스"     "한국경제"
List1[2] # returns a new list object that contains the second element only. What is length(List1[2])?
## $company
## [1] "아시아경제" "뉴스1"      "뉴스1"      "뉴시스"     "한국경제"
length(List1[2])
## [1] 1
List1[[2]] # returns a vector object that contains five elements of company names in the second element of List1. What is length(List1[[2]])? 
## [1] "아시아경제" "뉴스1"      "뉴스1"      "뉴시스"     "한국경제"
length(List1[[2]])
## [1] 5
List1['headline'] # returns a new list with the element named 'headline' only
## $headline
## [1] "\"지난달 샀으면 멘붕\"..지방도 집값 거품 빠지나"                                     
## [2] "'대통령딸 관저 거주' 논란에 유영민 \"아빠찬스? 동의하기 어렵다\""                    
## [3] "이재명 \"尹 '본·부·장' 비리를 왜 대장동과 동시특검..수사권 쇼핑 꼼수\""            
## [4] "[뉴시스Pic] \"윤석열 보호 울타리 치워라\" 5·18 국립묘지 앞에서 충돌한 경찰과 시민들"
## [5] "\"좁은 집서 애 둘 낳고 19년 살라고?\"..외면 받는 신혼희망타운"
List1[['headline']] # returns a vector with the elements of the list element named 'headline'
## [1] "\"지난달 샀으면 멘붕\"..지방도 집값 거품 빠지나"                                     
## [2] "'대통령딸 관저 거주' 논란에 유영민 \"아빠찬스? 동의하기 어렵다\""                    
## [3] "이재명 \"尹 '본·부·장' 비리를 왜 대장동과 동시특검..수사권 쇼핑 꼼수\""            
## [4] "[뉴시스Pic] \"윤석열 보호 울타리 치워라\" 5·18 국립묘지 앞에서 충돌한 경찰과 시민들"
## [5] "\"좁은 집서 애 둘 낳고 19년 살라고?\"..외면 받는 신혼희망타운"

Why is list( ) important in web scraping?

Web data are structured at multiple levels. The list( ) function is useful for dealing with hierarchical data.

Ex) DAUM Popular News > Top 50 List on Oct/25, Top 50 List on Oct/26, Top 50 List on Oct/27 …

Let say we have a list of ten URLs for popular news at DAUM on different dates

# Example
urls
##  [1] "https://news.daum.net/ranking/popular?regDate=20211025"
##  [2] "https://news.daum.net/ranking/popular?regDate=20211026"
##  [3] "https://news.daum.net/ranking/popular?regDate=20211027"
##  [4] "https://news.daum.net/ranking/popular?regDate=20211028"
##  [5] "https://news.daum.net/ranking/popular?regDate=20211029"
##  [6] "https://news.daum.net/ranking/popular?regDate=20211030"
##  [7] "https://news.daum.net/ranking/popular?regDate=20211031"
##  [8] "https://news.daum.net/ranking/popular?regDate=20211101"
##  [9] "https://news.daum.net/ranking/popular?regDate=20211102"
## [10] "https://news.daum.net/ranking/popular?regDate=20211103"
## [11] "https://news.daum.net/ranking/popular?regDate=20211104"
## [12] "https://news.daum.net/ranking/popular?regDate=20211105"
## [13] "https://news.daum.net/ranking/popular?regDate=20211106"
## [14] "https://news.daum.net/ranking/popular?regDate=20211107"
class(urls)
## [1] "character"
urls[1]
## [1] "https://news.daum.net/ranking/popular?regDate=20211025"
urls_list <- as.list(urls)
urls_list
## [[1]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211025"
## 
## [[2]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211026"
## 
## [[3]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211027"
## 
## [[4]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211028"
## 
## [[5]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211029"
## 
## [[6]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211030"
## 
## [[7]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211031"
## 
## [[8]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211101"
## 
## [[9]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211102"
## 
## [[10]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211103"
## 
## [[11]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211104"
## 
## [[12]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211105"
## 
## [[13]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211106"
## 
## [[14]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211107"
class(urls_list)
## [1] "list"
urls_list[[1]] # URL for popular news at DAUM on 10/25
## [1] "https://news.daum.net/ranking/popular?regDate=20211025"
urls_list[[2]] # URL for popular news at DAUM on 10/26
## [1] "https://news.daum.net/ranking/popular?regDate=20211026"

How to turn a list into a vector

#unlist( ) is a function to turn a list object into a vector object
#be cautious about using the unlist function
class(urls_list)
## [1] "list"
unlist(urls_list) # turn a list object into a vector object
##  [1] "https://news.daum.net/ranking/popular?regDate=20211025"
##  [2] "https://news.daum.net/ranking/popular?regDate=20211026"
##  [3] "https://news.daum.net/ranking/popular?regDate=20211027"
##  [4] "https://news.daum.net/ranking/popular?regDate=20211028"
##  [5] "https://news.daum.net/ranking/popular?regDate=20211029"
##  [6] "https://news.daum.net/ranking/popular?regDate=20211030"
##  [7] "https://news.daum.net/ranking/popular?regDate=20211031"
##  [8] "https://news.daum.net/ranking/popular?regDate=20211101"
##  [9] "https://news.daum.net/ranking/popular?regDate=20211102"
## [10] "https://news.daum.net/ranking/popular?regDate=20211103"
## [11] "https://news.daum.net/ranking/popular?regDate=20211104"
## [12] "https://news.daum.net/ranking/popular?regDate=20211105"
## [13] "https://news.daum.net/ranking/popular?regDate=20211106"
## [14] "https://news.daum.net/ranking/popular?regDate=20211107"
class(unlist(urls_list))
## [1] "character"
urls_list[[2]]
## [1] "https://news.daum.net/ranking/popular?regDate=20211026"
unlist(urls_list)
##  [1] "https://news.daum.net/ranking/popular?regDate=20211025"
##  [2] "https://news.daum.net/ranking/popular?regDate=20211026"
##  [3] "https://news.daum.net/ranking/popular?regDate=20211027"
##  [4] "https://news.daum.net/ranking/popular?regDate=20211028"
##  [5] "https://news.daum.net/ranking/popular?regDate=20211029"
##  [6] "https://news.daum.net/ranking/popular?regDate=20211030"
##  [7] "https://news.daum.net/ranking/popular?regDate=20211031"
##  [8] "https://news.daum.net/ranking/popular?regDate=20211101"
##  [9] "https://news.daum.net/ranking/popular?regDate=20211102"
## [10] "https://news.daum.net/ranking/popular?regDate=20211103"
## [11] "https://news.daum.net/ranking/popular?regDate=20211104"
## [12] "https://news.daum.net/ranking/popular?regDate=20211105"
## [13] "https://news.daum.net/ranking/popular?regDate=20211106"
## [14] "https://news.daum.net/ranking/popular?regDate=20211107"

unlist( ) allows us to combine a list object’s elements into a vector object

lapply( ): Applies a function to a vector/list and returns a list object

lapply( ) 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.

Let’s apply the function for extracting headlines and companies from the URLs

urls
##  [1] "https://news.daum.net/ranking/popular?regDate=20211025"
##  [2] "https://news.daum.net/ranking/popular?regDate=20211026"
##  [3] "https://news.daum.net/ranking/popular?regDate=20211027"
##  [4] "https://news.daum.net/ranking/popular?regDate=20211028"
##  [5] "https://news.daum.net/ranking/popular?regDate=20211029"
##  [6] "https://news.daum.net/ranking/popular?regDate=20211030"
##  [7] "https://news.daum.net/ranking/popular?regDate=20211031"
##  [8] "https://news.daum.net/ranking/popular?regDate=20211101"
##  [9] "https://news.daum.net/ranking/popular?regDate=20211102"
## [10] "https://news.daum.net/ranking/popular?regDate=20211103"
## [11] "https://news.daum.net/ranking/popular?regDate=20211104"
## [12] "https://news.daum.net/ranking/popular?regDate=20211105"
## [13] "https://news.daum.net/ranking/popular?regDate=20211106"
## [14] "https://news.daum.net/ranking/popular?regDate=20211107"
headline_extractor <- function(url) {
  page <- readLines(url)
  page_parsed <- htmlParse(page)
  headlines <- xpathSApply(page_parsed, headline_xpath, xmlValue)
  return(headlines)
}

headline_list <- lapply(urls, headline_extractor)
class(headline_list)
## [1] "list"
length(headline_list)
## [1] 14