나무위키 제21대 국회의원 선거/여론조사에서 특정 여론조사를 선정하여 이를 긁어내어 데이터프레임으로 만들어보자.
전체 제21대 국회의원 선거/여론조사에서 특정 선거구 “인천광역시 계양구 갑”을 선정하여 데이터를 스크랩핑하여 데이터프레임으로 변환시킨다.
library(tidyverse)
library(rvest)
Sys.setlocale("LC_ALL", "C")
namu_html <- read_html("https://namu.wiki/w/제21대 국회의원 선거/여론조사")
namu_txt <- namu_html %>%
html_nodes('div.wiki-table-wrap') %>%
.[300] %>%
html_nodes('div.wiki-paragraph') %>%
html_text()
Sys.setlocale("LC_ALL", "Korean")
## 여론조사 구성요소별로 분리
### 여론조사개요
survey_title <- namu_txt[1]
survey_overview <- str_split_fixed(survey_title, ",", n=2)
survey_agency <- survey_overview[1]
survey_date <- str_extract(survey_overview[2], pattern = "[0-9]{4}년\\s?[0-9]월.*일")
survey_method <- str_remove(survey_overview[2], pattern = ",\\s[0-9]{4}년\\s?[0-9]월.*일")
survey_main <- namu_txt[-1]
### 후보자 지지율
survey_value <- survey_main[str_detect(survey_main, "%")]
### 후보자 정당
survey_text <- survey_main[str_detect(survey_main, "^(?!.*%)")]
index_vec <- str_detect(survey_text, "무당층")
location_무당층 <- which(str_detect(survey_text, "무당층"))
survey_party <- survey_text[1:location_무당층]
### 후보자명
survey_candidate <- c(survey_text[(location_무당층+1):length(survey_text)], "무당층")
# 데이터프레임
one_sample_df <- tibble(정당 = survey_party,
후보자명 = survey_candidate,
지지율 = survey_value,
조사업체 = survey_agency,
조사방식 = survey_method,
조사일자 = survey_date)
one_sample_df %>%
write_rds("data/one_sample_df.rds")
제대로 스크랩핑이 되었는지 확인한다.
앞서 작성된 결과를 바탕으로 이를 함수로 만들어서 값을 특정한 여론조사결과를 표로 추출하는 함수를 만들어본다.
namu_html <- read_html("https://namu.wiki/w/%EC%A0%9C21%EB%8C%80%20%EA%B5%AD%ED%9A%8C%EC%9D%98%EC%9B%90%20%EC%84%A0%EA%B1%B0/%EC%97%AC%EB%A1%A0%EC%A1%B0%EC%82%AC")
scrape_table <- function(table_number) {
namu_txt <- namu_html %>%
html_nodes('div.wiki-table-wrap') %>%
.[table_number] %>%
html_nodes('div.wiki-paragraph') %>%
html_text()
## 여론조사 구성요소별로 분리
### 여론조사개요
survey_title <- namu_txt[1]
survey_overview <- str_split_fixed(survey_title, ",", n=2)
survey_agency <- survey_overview[1]
survey_date <- str_extract(survey_overview[2], pattern = "[0-9]{4}년.*일")
survey_method <- str_remove(survey_overview[2], pattern = ",\\s[0-9]{4}년\\s?[0-9]월.*일")
survey_main <- namu_txt[-1]
### 후보자 지지율
survey_value <- survey_main[str_detect(survey_main, "%")]
### 후보자 정당
survey_text <- survey_main[str_detect(survey_main, "^(?!.*%)")]
index_vec <- str_detect(survey_text, "무당층")
location_무당층 <- which(str_detect(survey_text, "무당층"))
survey_party <- survey_text[1:location_무당층]
### 후보자명
survey_candidate <- c(survey_text[(location_무당층+1):length(survey_text)], "무당층")
# 데이터프레임
one_sample_df <- tibble(정당 = survey_party,
후보자명 = survey_candidate,
지지율 = survey_value,
조사업체 = survey_agency,
조사방식 = survey_method,
조사일자 = survey_date)
return(one_sample_df)
}
scrape_table(300)
# A tibble: 4 x 6
정당 후보자명 지지율 조사업체 조사방식 조사일자
<chr> <chr> <chr> <chr> <chr> <chr>
1 민주 조택상 27.8% 모노커뮤니케이션즈 조사[358] 면접,ars 2020년 3월 9~10일
2 통합 배준영 31.4% 모노커뮤니케이션즈 조사[358] 면접,ars 2020년 3월 9~10일
3 정의 안재형 5.8% 모노커뮤니케이션즈 조사[358] 면접,ars 2020년 3월 9~10일
4 무당층 무당층 32.8% 모노커뮤니케이션즈 조사[358] 면접,ars 2020년 3월 9~10일
앞서 작성된 결과를 바탕으로 이를 함수로 만들어서 값을 특정한 여론조사결과를 표로 추출하는 함수를 활용하여 여론조사 결과를 추출하도록 반복문을 작성한다.
반복을 돌리기에 앞서 반복을 돌릴 색인값을 찾아낸다.
## 2020-03-30
## [시작] 선거구 개편 후 3.1 서울특별시: 265 (입소스 주식회사 조사[323])
## [끝] 선거구 개편 후 3.17. 제주특별자치도: 437 (한국갤럽조사연구소 조사[501])
# namu_html %>%
# html_nodes('div.wiki-table-wrap') %>%
# .[435] %>%
# html_nodes('div.wiki-paragraph') %>%
# html_text()
#
# scrap_table(437)
possibly_scrap_table <- possibly(scrape_table, otherwise = "Error")
survey_full_list <- map(265:437, possibly_scrap_table)
names(survey_full_list) <- 265:437
survey_full_list %>%
write_rds("data/survey_full_list.rds")