선관위 웹사이트에서 공개된 선거벽보를 데이터로 만듧니다.
중앙선거관리위원회 선거정보도서관, “후보자 선전물” 벽보, 공보, 공약서 등 후보자 선전물 검색하여 데이터로 만듧니다.
library(tidyverse)
library(rvest)
library(httr)
poster_url <- "http://elecinfo.nec.go.kr/neweps/3/1/paperSearch.do?chs=&page=&epType=&start_file_sn=&end_file_sn=&svc_path_nm=&epid=&candidate_nm=&elect_ymd=&epdata_id=&ctl_no_id=&elect_sn=&party_nm=&win_yn=&elecDe=&turnDe=%B4%EB%C5%EB%B7%C9%BC%B1%B0%C5&elecType=10&code_id=10++&elecTypeMax=20&turnType=EPS0410++&cityType=EPS041019&guType=&sign_id=19&sido_nm=&elect_region_nm=&fieldName=candidate_nm&category=tms120tbl&myScraps=&kwd=&elecTypes=10&electionType=on&electionTurn=on&pageSize=20&order=elect_ymd&order_sort=desc"
poster_text <- poster_url %>%
read_html() %>%
html_nodes(xpath = '//*[@id="content"]/div[5]/ul') %>%
html_nodes(css = "li") %>%
html_nodes(css = "input") %>%
html_attr("value")
poster_list <- poster_text %>%
str_split(pattern = "(\\s+\\|\\s+)|(,)")
map(poster_list, str_remove, pattern = "|")
[[1]]
[1] "문재인" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 1번" "더불어민주당" "당선"
[10] "후보자선전물" "ECM01201700060001"
[[2]]
[1] "김선동" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 10번" "민중연합당" "낙선"
[10] "후보자선전물" "ECM01201700060010"
[[3]]
[1] "이경희" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 12번" "한국국민당" "낙선"
[10] "후보자선전물" "ECM01201700060012"
[[4]]
[1] "윤홍식" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 14번" "홍익당" "낙선"
[10] "후보자선전물" "ECM01201700060014"
[[5]]
[1] "김민찬" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 15번" "무소속" "낙선"
[10] "후보자선전물" "ECM01201700060015"
[[6]]
[1] "홍준표" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 2번" "자유한국당" "낙선"
[10] "후보자선전물" "ECM01201700060002"
[[7]]
[1] "안철수" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 3번" "국민의당" "낙선"
[10] "후보자선전물" "ECM01201700060003"
[[8]]
[1] "유승민" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 4번" "바른정당" "낙선"
[10] "후보자선전물" "ECM01201700060004"
[[9]]
[1] "심상정" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 5번" "정의당" "낙선"
[10] "후보자선전물" "ECM01201700060005"
[[10]]
[1] "조원진" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 6번" "새누리당" "낙선"
[10] "후보자선전물" "ECM01201700060006"
[[11]]
[1] "오영국" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 7번" "경제애국당" "낙선"
[10] "후보자선전물" "ECM01201700060007"
[[12]]
[1] "장성민" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 8번" "국민대통합당" "낙선"
[10] "후보자선전물" "ECM01201700060008"
[[13]]
[1] "이재오" "2017.05.09" "19대"
[4] "대통령선거" "전국" "전국"
[7] "기호 9번" "늘푸른한국당" "낙선"
[10] "후보자선전물" "ECM01201700060009"
map_chr(poster_list, 1)
[1] "문재인" "김선동" "이경희" "윤홍식" "김민찬" "홍준표" "안철수"
[8] "유승민" "심상정" "조원진" "오영국" "장성민" "이재오"
map_chr(poster_list, 3)
[1] "19대" "19대" "19대" "19대" "19대" "19대" "19대" "19대" "19대"
[10] "19대" "19대" "19대" "19대"
poster_president_19_tbl <- tibble(후보 = map_chr(poster_list, 1),
선거일 = map_chr(poster_list, 2),
선거 = map_chr(poster_list, 3),
선거구분 = map_chr(poster_list, 4),
구분1 = map_chr(poster_list, 5),
구분2 = map_chr(poster_list, 6),
기호 = map_chr(poster_list, 7),
정당 = map_chr(poster_list, 8),
당락 = map_chr(poster_list, 9))
poster_president_19_tbl %>%
write_csv("data/poster_president_19_tbl.csv")
대통령 선거는 1대부터 19대까지 진행되었습니다. 이에 따라 특정 대통령 선거를 넣게 되면 당선자 및 낙선자 기호 정당 등 관련 정보를 크롤링 하도록 코드를 작성한다.
p_number <- 17
president_poster_url <- glue::glue("http://elecinfo.nec.go.kr/neweps/3/1/paperSearch.do?chs=&page=&epType=&start_file_sn=&end_file_sn=&svc_path_nm=&epid=&candidate_nm=&elect_ymd=&epdata_id=&ctl_no_id=&elect_sn=&party_nm=&win_yn=&elecDe=&turnDe=%B4%EB%C5%EB%B7%C9%BC%B1%B0%C5&elecType=10&code_id=10++&elecTypeMax=20&turnType=EPS0410++&cityType=EPS0410{p_number}&guType=&sign_id={p_number}&sido_nm=&elect_region_nm=&fieldName=candidate_nm&category=tms120tbl&myScraps=&kwd=&elecTypes=10&electionType=on&electionTurn=on&pageSize=20&order=elect_ymd&order_sort=desc")
poster_text <- president_poster_url %>%
read_html() %>%
html_nodes(xpath = '//*[@id="content"]/div[5]/ul') %>%
html_nodes(css = "li") %>%
html_nodes(css = "input") %>%
html_attr("value")
poster_list <- poster_text %>%
str_split(pattern = "(\\s+\\|\\s+)|(,)")
poster_president_tbl <- tibble(후보 = map_chr(poster_list, 1),
선거일 = map_chr(poster_list, 2),
선거 = map_chr(poster_list, 3),
선거구분 = map_chr(poster_list, 4),
구분1 = map_chr(poster_list, 5),
구분2 = map_chr(poster_list, 6),
기호 = map_chr(poster_list, 7),
정당 = map_chr(poster_list, 8),
당락 = map_chr(poster_list, 9))
poster_president_tbl
# A tibble: 12 x 9
후보 선거일 선거 선거구분 구분1 구분2 기호 정당 당락
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 정동영 2007.12… 17대 대통령선거… 전국 전국 기호 1번… 대통합민주신당… 낙선
2 금민 2007.12… 17대 대통령선거… 전국 전국 기호 10… 한국사회당 낙선
3 이수성 2007.12… 17대 대통령선거… 전국 전국 기호 11… 국민연대 낙선
4 이회창 2007.12… 17대 대통령선거… 전국 전국 기호 12… 무소속 낙선
5 이명박 2007.12… 17대 대통령선거… 전국 전국 기호 2번… 한나라당 당선
6 권영길 2007.12… 17대 대통령선거… 전국 전국 기호 3번… 민주노동당 낙선
7 이인제 2007.12… 17대 대통령선거… 전국 전국 기호 4번… 민주당 낙선
8 심대평 2007.12… 17대 대통령선거… 전국 전국 기호 5번… 국민중심당 낙선
9 문국현 2007.12… 17대 대통령선거… 전국 전국 기호 6번… 창조한국당 낙선
10 정근모 2007.12… 17대 대통령선거… 전국 전국 기호 7번… 참주인연합 낙선
11 허경영 2007.12… 17대 대통령선거… 전국 전국 기호 8번… 경제공화당 낙선
12 전관 2007.12… 17대 대통령선거… 전국 전국 기호 9번… 새시대참사람연합… 낙선
함수를 작성하여 테스트 한다.
get_poster_info <- function(p_number) {
president_poster_url <- glue::glue("http://elecinfo.nec.go.kr/neweps/3/1/paperSearch.do?chs=&page=&epType=&start_file_sn=&end_file_sn=&svc_path_nm=&epid=&candidate_nm=&elect_ymd=&epdata_id=&ctl_no_id=&elect_sn=&party_nm=&win_yn=&elecDe=&turnDe=%B4%EB%C5%EB%B7%C9%BC%B1%B0%C5&elecType=10&code_id=10++&elecTypeMax=20&turnType=EPS0410++&cityType=EPS0410{p_number}&guType=&sign_id={p_number}&sido_nm=&elect_region_nm=&fieldName=candidate_nm&category=tms120tbl&myScraps=&kwd=&elecTypes=10&electionType=on&electionTurn=on&pageSize=20&order=elect_ymd&order_sort=desc")
poster_text <- president_poster_url %>%
read_html() %>%
html_nodes(xpath = '//*[@id="content"]/div[5]/ul') %>%
html_nodes(css = "li") %>%
html_nodes(css = "input") %>%
html_attr("value")
poster_list <- poster_text %>%
str_split(pattern = "(\\s+\\|\\s+)|(,)")
poster_president_tbl <- tibble(후보 = map_chr(poster_list, 1),
선거일 = map_chr(poster_list, 2),
선거 = map_chr(poster_list, 3),
선거구분 = map_chr(poster_list, 4),
구분1 = map_chr(poster_list, 5),
구분2 = map_chr(poster_list, 6),
기호 = map_chr(poster_list, 7),
정당 = map_chr(poster_list, 8),
당락 = map_chr(poster_list, 9))
return(poster_president_tbl)
}
get_poster_info(6)
# A tibble: 7 x 9
후보 선거일 선거 선거구분 구분1 구분2 기호 정당 당락
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 이세진 1967.05.… 6대 대통령선거 전국 전국 기호 1번… 정의당 낙선
2 전진한 1967.05.… 6대 대통령선거 전국 전국 기호 2번… 한국독립당… 낙선
3 윤보선 1967.05.… 6대 대통령선거 전국 전국 기호 3번… 신민당 낙선
4 서민호 1967.05.… 6대 대통령선거 전국 전국 기호 4번… 대중당 낙선
5 김준연 1967.05.… 6대 대통령선거 전국 전국 기호 5번… 민중당 낙선
6 박정희 1967.05.… 6대 대통령선거 전국 전국 기호 6번… 민주공화당… 당선
7 오재영 1967.05.… 6대 대통령선거 전국 전국 기호 7번… 통한당 낙선
일부 대통령 선거 데이터가 빠져 있어 6대, 12~19대까지 포스터를 데이터프레임으로 데이터화한다.
all_poster_tbl <- map_df(1:19, get_poster_info)
all_poster_tbl %>%
write_csv("data/all_poster_tbl.csv")
all_poster_tbl <- read_csv("data/all_poster_tbl.csv")
all_poster_tbl %>%
reactable::reactable()
poster_url <- "http://elecinfo.nec.go.kr/neweps/3/1/paperSearch.do?chs=&page=&epType=&start_file_sn=&end_file_sn=&svc_path_nm=&epid=&candidate_nm=&elect_ymd=&epdata_id=&ctl_no_id=&elect_sn=&party_nm=&win_yn=&elecDe=&turnDe=%B4%EB%C5%EB%B7%C9%BC%B1%B0%C5&elecType=10&code_id=10++&elecTypeMax=20&turnType=EPS0410++&cityType=EPS041019&guType=&sign_id=19&sido_nm=&elect_region_nm=&fieldName=candidate_nm&category=tms120tbl&myScraps=&kwd=&elecTypes=10&electionType=on&electionTurn=on&pageSize=20&order=elect_ymd&order_sort=desc"
poster_html <- poster_url %>%
read_html()
poster_buttons <- poster_html %>%
html_nodes(xpath = '//*[@id="content"]/div[5]/ul') %>%
html_nodes(css = "a") %>%
html_attr("href")
pdf_files <- poster_buttons[str_detect(poster_buttons, pattern = "start_file")]
pdf_poster_files <- pdf_files[str_detect(pdf_files, pattern = "ECM0120170006")]
glue::glue("http://elecinfo.nec.go.kr{pdf_poster_files}")
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0003
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0012
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0014
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0016
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0017
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0004
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0005
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0006
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0007
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0008
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0009
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0010
http://elecinfo.nec.go.kr/neweps/common/download.do?svc_path_nm=/epdata/EP17/ECM2017/01/ECM0120170006&epid=ECM0120170006&start_file_sn=0011
get_image_address <- function(p_number) {
poster_url <- glue::glue("http://elecinfo.nec.go.kr/neweps/3/1/paperSearch.do?chs=&page=&epType=&start_file_sn=&end_file_sn=&svc_path_nm=&epid=&candidate_nm=&elect_ymd=&epdata_id=&ctl_no_id=&elect_sn=&party_nm=&win_yn=&elecDe=&turnDe=%B4%EB%C5%EB%B7%C9%BC%B1%B0%C5&elecType=10&code_id=10++&elecTypeMax=20&turnType=EPS0410++&cityType=EPS0410{p_number}&guType=&sign_id={p_number}&sido_nm=&elect_region_nm=&fieldName=candidate_nm&category=tms120tbl&myScraps=&kwd=&elecTypes=10&electionType=on&electionTurn=on&pageSize=20&order=elect_ymd&order_sort=desc")
poster_html <- poster_url %>%
read_html()
poster_buttons <- poster_html %>%
html_nodes(xpath = '//*[@id="content"]/div[5]/ul') %>%
html_nodes(css = "a") %>%
html_attr("href")
pdf_files <- poster_buttons[str_detect(poster_buttons, pattern = "start_file")]
pdf_files_url <- glue::glue("http://elecinfo.nec.go.kr{pdf_files}")
return(pdf_files_url)
}
# pdf_poster_files <- pdf_files[str_detect(pdf_files, pattern = "ECM0120170006")]
p_number <- str_pad(1:19, width = 2, side = "left", pad = "0")
poster_url_vec <- map(p_number, get_image_address)
poster_url_vec %>%
write_rds("data/poster/poster_url_vec.rds")
all_poster_tbl <- read_csv("data/all_poster_tbl.csv")
poster_url_vec <- read_rds("data/poster/poster_url_vec.rds")
## 제 6 대 대통령선거 -------
six_poster_tbl <- all_poster_tbl %>%
mutate(기호 = str_remove_all(기호, "기호\\s+")) %>%
filter(선거 == "6대") %>%
mutate(image_url = poster_url_vec[[6]]) %>%
mutate(filename = glue::glue("data/poster/{선거}_{후보}_{기호}.pdf"))
map2(six_poster_tbl$image_url, six_poster_tbl$filename, download.file, mode = "wb")
## 제 13 대 대통령선거 -------
poster_13_tbl <- all_poster_tbl %>%
mutate(기호 = str_remove_all(기호, "기호\\s+")) %>%
filter(선거 == "13대") %>%
mutate(image_url = poster_url_vec[[13]]) %>%
mutate(filename = glue::glue("data/poster/{선거}_{후보}_{기호}.pdf"))
map2(poster_13_tbl$image_url, poster_13_tbl$filename, download.file, mode = "wb")
## 제 14 대 대통령선거 -------
poster_14_tbl <- all_poster_tbl %>%
mutate(기호 = str_remove_all(기호, "기호\\s+")) %>%
filter(선거 == "14대") %>%
mutate(image_url = poster_url_vec[[14]]) %>%
mutate(filename = glue::glue("data/poster/{선거}_{후보}_{기호}.pdf"))
map2(poster_14_tbl$image_url, poster_14_tbl$filename, download.file, mode = "wb")
## 제 15 대 대통령선거 -------
poster_15_tbl <- all_poster_tbl %>%
mutate(기호 = str_remove_all(기호, "기호\\s+")) %>%
filter(선거 == "15대") %>%
mutate(image_url = poster_url_vec[[15]]) %>%
mutate(filename = glue::glue("data/poster/{선거}_{후보}_{기호}.pdf"))
map2(poster_15_tbl$image_url, poster_15_tbl$filename, download.file, mode = "wb")
## 제 16 대 대통령선거 -------
poster_16_tbl <- all_poster_tbl %>%
mutate(기호 = str_remove_all(기호, "기호\\s+")) %>%
filter(선거 == "16대") %>%
mutate(image_url = poster_url_vec[[16]]) %>%
mutate(filename = glue::glue("data/poster/{선거}_{후보}_{기호}.pdf"))
map2(poster_16_tbl$image_url, poster_16_tbl$filename, download.file, mode = "wb")
## 제 17 대 대통령선거 -------
poster_url_tmp <- poster_url_vec[[17]]
poster_17_urls <- poster_url_tmp[str_detect(poster_url_tmp, pattern = "ECM0120080029")]
poster_17_tbl <- all_poster_tbl %>%
mutate(기호 = str_remove_all(기호, "기호\\s+")) %>%
filter(선거 == "17대") %>%
mutate(image_url = poster_17_urls) %>%
mutate(filename = glue::glue("data/poster/{선거}_{후보}_{기호}.pdf"))
map2(poster_17_tbl$image_url, poster_17_tbl$filename, download.file, mode = "wb")
## 제 18 대 대통령선거 -------
poster_url_tmp <- poster_url_vec[[18]]
poster_18_urls <- poster_url_tmp[str_detect(poster_url_tmp, pattern = "ECM0120121025")]
poster_18_tbl <- all_poster_tbl %>%
mutate(기호 = str_remove_all(기호, "기호\\s+")) %>%
filter(선거 == "18대") %>%
mutate(image_url = poster_18_urls) %>%
mutate(filename = glue::glue("data/poster/{선거}_{후보}_{기호}.pdf"))
map2(poster_18_tbl$image_url, poster_18_tbl$filename, download.file, mode = "wb")
## 제 19 대 대통령선거 -------
poster_url_tmp <- poster_url_vec[[19]]
poster_19_urls <- poster_url_tmp[str_detect(poster_url_tmp, pattern = "ECM0120170006")]
poster_19_tbl <- all_poster_tbl %>%
mutate(기호 = str_remove_all(기호, "기호\\s+")) %>%
filter(선거 == "19대") %>%
mutate(image_url = poster_19_urls) %>%
mutate(filename = glue::glue("data/poster/{선거}_{후보}_{기호}.pdf"))
map2(poster_19_tbl$image_url, poster_19_tbl$filename, download.file, mode = "wb")
knitr::include_graphics("data/poster.pdf")