TOP
class="layout-aside-left paging-number">
본문 바로가기
데이터분석 만능열쇠 [파이썬]/<파이썬 데이터 분석>

[파이썬] 19대 대선 결과 분석 -1

by 기록자_Recordian 2024. 5. 1.
728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.

데이터 획득 준비하기 (Selenium, Beautiful Soup)

 

본격적인 데이터 분석을 하기 전에, 초기 세팅 작업 실시

이전에 분석했던 [파이썬] 우리나라 인구 소멸 위기 지역 분석 - 1  에서의 코드와 동일

# pandas, numpy 모듈 import
import pandas as pd
import numpy as np

# 운영 체제 정보를 확인하고, matplotlib을 사용하여 그래프 그릴 준비하기
import platform
import matplotlib.pyplot as plt

%matplotlib inline

path = "c:/Windows/Fonts/malgun.ttf"

from matplotlib import font_manager, rc
if platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Sorry')

plt.rcParams['axes.unicode_minus'] = False

※주의: 이 부분은 집필 기준일과 현재 시점(23년)의 차이로 분석이 어려울 수 있으므로, 스크롤을 내려 주세요.

 

그런 다음, 중앙선거관리위원회의 선거통계시스템에 접속하여 필요한 데이터를 얻어야 한다.

크롬 드라이버를 이용하여 접속

selenium

※ webdriver.Chrome() 부분은 하단 내용 참고.

 

[파이썬] Selenium 라이브러리 사용하기

시작에 앞서 해당 내용은 -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다. 보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다. Selenium 라이브러리 사용하기 파이썬의 Selenium

puppy-foot-it.tistory.com

사이트가 잘 뜨는 것을 확인

중앙선거관리 위원회

 

크롬의 새로운 창을 열고 중앙선거관리위원회에 접속하여 크롬 개발자 도구 (F12 키)로 들어가서 source 탭을 확인

iframe_body / iframe_map
iframe_body / iframe_map

 

Selenium 에서 프레임 이동은 switch_to_frame 명령으로 수행

driver.switch_to_default_content()
driver.switch_to_frame('main')

 

그러나, 아래와 같은 에러가 뜨는데,

AttributeError: 'WebDriver' object has no attribute 'switch_to_default_content'

 

그리하여 Chat GPT에 문의 결과, selenium frame 의 문법이 바뀌었다며 아래와 같은 코드를 주었다.

[Chat GPT said]
driver.switch_to_default_content() 명령어가 실행되지 않는 이유는
해당 명령어가 Selenium WebDriver에서 지원되지 않기 때문입니다.
대신에 driver.switch_to.default_content()를 사용해야 합니다.
driver.switch_to.default_content()
driver.switch_to.frame('main')

그러나 이번에는 하단과 같은 오류가 발생했는데,

NoSuchFrameException: Message: main

검색해보니 NoSuchFrameException 오류가 발생한 이유는 Selenium WebDriver가 'main'이라는 이름의 프레임을 찾지 못해서이며, 프레임 이름이나 ID가 정확하지 않을 수 있기 때문이라고 한다.

 

Chat GPT에서도 찾지 못한다면 구글링을 해서 찾아보면 된다.

검색결과, 어떤 블로거님께서 아래와 같은 글과 관련 자료들을 남겨주셔서 해당 내용을 토대로 다시 시작하기로 한다.

  • 교재를 집필 완료한 후, 선거관리 위원회 홈페이지가 재보궐선거로 구성화면이 변경되었다
  • 그러므로 일일이 진입하던 코드를 생략하고, 바로 19대 대통령 선거 결과를 확인할 수 있는 페이지 바로가기로 진입하였다
  • 교재에 나온 6-1, 6-2절의 코드는 변경되었다. 6-3절부터 학습하는 경우라면 Github에서 배포하는 데이터를 사용하면 된다

다시 시작

크롬 드라이버를 통해 하단의 링크로 접속

(마찬가지로 크롬 창에 동일한 창을 켜준다)

driver = webdriver.Chrome()
driver.get("http://info.nec.go.kr/main/showDocument.xhtml?electionId=0000000000&topMenuId=VC&secondMenuId=VCCP09")

 

크롬 드라이버
중앙선거관리위원회

XPath 활용하기 - 대통령선거

 

먼저 '대통령 선거' 항목의 XPath 를 찾는다

[XPath 찾는 법]
1) 개발자도구(F12 키) 누름
2) ctrl+shift+c 누르고 대통령 선거 클릭
3) 오른쪽에 음영 들어오는 부분 마우스 오른쪽 버튼 클릭
4) Copy - Copy XPath
여기서 대통령선거의 XPath는
//*[@id="electionType1"]

 

XPath Copy

다음엔, XPath를 활용하여 '대통령선거' 버튼을 클릭할 수 있게 코드를 입력

driver.find_element(By.XPATH, '//*[@id="electionType1"]').click()

대통령선거 클릭
대통령선거가 클릭되었다

 

XPath 활용하기 - 선거 회차 선택하기

 

이제 조회조건 중에서 19대를 선택할 수 있게 해야 한다.

이때 '선택' 이라고 표기된 리스트 박스에서 '선택'을 누르면 역대 선거회차 리스트가 나타나는데,

일단 이 회차 리스트의 XPath를 알아서 그 리스트 안에 있는 값을 가져와야 한다

역대 대통령선거 조회

 

선거회차 리스트의 XPath를 확인하고, 확인한 XPath로 접근하여 그 XPath 안에 있는 option 이라는 이름의 태그만 모두 가져와서 리스트로 저장

election_list_raw = driver.find_element(By.XPATH, '//*[@id="electionName"]')
election_list = election_list_raw.find_elements(By.TAG_NAME, "option")
election_number_values = [option.text for option in election_list]
election_number_values = election_number_values[1:]
election_number_values

선거회차 코드
교재내용 + 챗GPT + 구글링을 조합을 통해 스스로 만들어낸 코드이다 (!!)

 

이제 '19대'를 선택할 수 있는 코드 입력

element = driver.find_element(By.ID, "electionName") #element_by_id는 옛날 버전
element.send_keys(election_number_values[1])

 

선택이 잘 되는 것을 확인

19대 선택

XPath 활용하기 - 조회 조건에서 '대통령선거' 선택하기

 

제19대 선거를 선택하면 옆에 '선거'라는 옵션이 나오는데, 여기도 앞서 선거회차 리스트를 선택한 것과 동일한 과정으로 진행

election_code_list_raw = driver.find_element(By.XPATH, '//*[@id="electionCode"]')
election_code_list = election_code_list_raw.find_elements(By.TAG_NAME, "option")
election_code_values = [option.text for option in election_code_list]
election_code_values = election_code_values[1:]
election_code_values

election code list

 

리스트에는 대통령선거 하나만 존재하는데, 이를 클릭할 수 있도록 코드 입력

element = driver.find_element(By.ID, "electionCode") #ID는 electionCode
element.send_keys(election_code_values[0]) #값이 하나이므로, 0

 

대통령선거 클릭
클릭이 잘 되었다

 

XPath 활용하기 - '시도' 리스트 저장하기

 

세번째 조회조건 (너무 많다) 으로 '시도' 리스트가 있는데, 시도 리스트의 XPath를 확인하고, 이를 토대로 접근하여 리스트로 저장한다.

이 역시 앞서 진행했던 다른 조회조건의 XPath 획득 과정과 비슷한 방식으로 진행

(한 번 짜놓은 코드로 일부 내용만 변경하면 되니 난이도는 그다지 높지 않다)

sido_list_raw = driver.find_element(By.XPATH, '//*[@id="cityCode"]') 
sido_list = sido_list_raw.find_elements(By.TAG_NAME, "option")
sido_names_values = [option.text for option in sido_list]
sido_names_values = sido_names_values[1:]
sido_names_values

 

시도 리스트

시도 리스트가 잘 저장되었는지 체크해보기 위해 '서울특별시'가 잘 선택되는지 확인

element = driver.find_element(By.ID, "cityCode") #ID는 cityCode
element.send_keys(sido_names_values[1]) #서울특별시

 

서울특별시 선택
선택이 잘 된다

XPath 활용하기 - 검색 버튼 누르기

 

조회조건이 모두 입력되는 것을 확인했으니, 이제 '검색' 버튼의 XPath를 얻어 해당 버튼 눌리게 설정한다

driver.find_element(By.XPATH, '//*[@id="searchBtn"]').click()

 

19대 대통령선거 서울시 조회

 

 

다음 시간에는 대선 결과 데이터 획득하는 법 진행


다음글

[파이썬] 19대 대선 결과 분석 -2

728x90
반응형