선거벽보

선관위 웹사이트에서 공개된 선거벽보를 데이터로 만듧니다.

데이터

중앙선거관리위원회 선거정보도서관, “후보자 선전물” 벽보, 공보, 공약서 등 후보자 선전물 검색하여 데이터로 만듧니다.

제 19 대 대통령

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")

벽보 결합

library(pdftools)

poster_pdf_filepath <- fs::dir_ls(path = "data/poster", glob = "*.pdf")

walk(poster_pdf_filepath, pdf_combine, output =  "data/poster.pdf")
knitr::include_graphics("data/poster.pdf")