시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, 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년)의 차이로 분석이 어려울 수 있으므로, 스크롤을 내려 주세요.
그런 다음, 중앙선거관리위원회의 선거통계시스템에 접속하여 필요한 데이터를 얻어야 한다.
크롬 드라이버를 이용하여 접속
※ webdriver.Chrome() 부분은 하단 내용 참고.
사이트가 잘 뜨는 것을 확인
크롬의 새로운 창을 열고 중앙선거관리위원회에 접속하여 크롬 개발자 도구 (F12 키)로 들어가서 source 탭을 확인
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에서도 찾지 못한다면 구글링을 해서 찾아보면 된다.
검색결과, 어떤 블로거님께서 아래와 같은 글과 관련 자료들을 남겨주셔서 해당 내용을 토대로 다시 시작하기로 한다.
|
다시 시작
크롬 드라이버를 통해 하단의 링크로 접속
(마찬가지로 크롬 창에 동일한 창을 켜준다)
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를 활용하여 '대통령선거' 버튼을 클릭할 수 있게 코드를 입력
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
이제 '19대'를 선택할 수 있는 코드 입력
element = driver.find_element(By.ID, "electionName") #element_by_id는 옛날 버전
element.send_keys(election_number_values[1])
선택이 잘 되는 것을 확인
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
리스트에는 대통령선거 하나만 존재하는데, 이를 클릭할 수 있도록 코드 입력
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()
다음 시간에는 대선 결과 데이터 획득하는 법 진행
다음글
'[파이썬 Projects] > <파이썬 데이터 분석>' 카테고리의 다른 글
[파이썬] 19대 대선 결과 분석 -3 (0) | 2024.05.04 |
---|---|
[파이썬] 19대 대선 결과 분석 -2 (0) | 2024.05.01 |
[파이썬] 우리나라 인구 소멸 위기 지역 분석 - 4 (0) | 2024.05.01 |
[파이썬] 우리나라 인구 소멸 위기 지역 분석 - 3 (0) | 2024.04.30 |
[파이썬] 우리나라 인구 소멸 위기 지역 분석 - 2 (2) | 2024.04.30 |