반응형
Selenium을 이용한 선거구 데이터 크롤링¶
(사실 그냥 다운로드하면 편하다)
In [1]:
import pandas as pd
import numpy as np
import platform
import matplotlib.pyplot as plt
%matplotlib inline
폰트 설정¶
In [2]:
from matplotlib import font_manager, rc
rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False
방법¶
- 홈페이지에 접근(http://info.nec.go.kr/)
- 역대선거 클릭
- 투개표 클릭
- 개표현황 클릭
- 대통령 선거 클릭
- 정보 가져오기
In [3]:
from selenium import webdriver
import time
In [4]:
driver = webdriver.Chrome('./chromedriver')
driver.get('http://info.nec.go.kr')
1. 홈페이지 접근¶
In [5]:
driver.switch_to_default_content()
driver.switch_to_frame('main')
2. 역대선거 클릭¶
In [6]:
driver.find_element_by_class_name("eright").click()
3. 투개표 클릭¶
In [7]:
driver.find_element_by_xpath("""//*[@id="presubmu"]/li[3]/a""").click()
4. 개표현황 클릭¶
In [8]:
driver.find_element_by_xpath("""//*[@id="header"]/div[4]/ul/li[4]/a""").click()
5. 대통령선거 클릭¶
In [9]:
driver.find_element_by_xpath("""//*[@id="electionType1"]""").click()
6. 몇대 선거를 선택할지 및 선거 시도¶
In [10]:
select_list_raw = driver.find_element_by_xpath("""//*[@id="electionName"]""")
select_list=select_list_raw.find_elements_by_tag_name("option")
select_names = [option.text for option in select_list]
select_names = select_names[1:]
print(select_names)
제 19대를 클릭해주자
In [12]:
code_list_raw = driver.find_element_by_xpath("""//*[@id="electionCode"]""")
code_list=code_list_raw.find_elements_by_tag_name("option")
code_names = [option.text for option in code_list]
code_names = code_names[1:]
code_names
Out[12]:
대통령 선거도 클릭해주자
In [14]:
city_list_raw = driver.find_element_by_xpath("""//*[@id="cityCode"]""")
city_list=city_list_raw.find_elements_by_tag_name("option")
city_names = [option.text for option in city_list]
city_names = city_names[2:]
print(city_names)
서울특별시도 클릭해주자!
7. 검색 버튼 클릭!¶
In [16]:
driver.find_element_by_xpath("""//*[@id="searchBtn"]""").click()
그럼 우리는 chromdriver에서 서울특별시의 정보가 뜨는 것을 볼수 있다
BeautifulSoup을 이용하여 selenium으로 접근한 페이지를 가져오자!¶
In [19]:
from bs4 import BeautifulSoup
1. 해당page의 내용을 긁어오자¶
나는 투표수, 문재인, 홍준표, 안철수 까지만 긁어올 것이야
In [21]:
def get_vote(n):
# selenium 페이지를 beautifulsoup으로 불러오기
name = n
html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
# tmp에는 투표값들이 들어가있고,
# gu에는 구값들이 들어가 있다.
tmp = soup.find_all('td', 'alignR')
gu = soup.find_all('td', 'alignL')
gu_names = [tmp_val.get_text() for tmp_val in gu[1:]]
# 줄에 해당하는 투표수, 문재인, 홍준표, 안철수가 해당하는 table수를 계산해서 그 값들만 뽑아 [list]형식으로 만들고
# 그값을 key = gu, value = tmp_list로 하여 dictionary에 넣어주자
tmp_list = []
for i in range(19, len(tmp), 18):
tmp_values = [(tmp_val.get_text().replace(",", '')) for tmp_val in tmp[i:i+4]]
tmp_list.append(tmp_values)
tmp_list = tmp_list[:-1]
gu_dict = {}
for i in range(len(tmp_list)):
name = gu_names[i]
items = tmp_list[i]
gu_dict[name] = items
gu_dict
# dictionary를 DataFrame으로 바꿔주고, 컬럼명을 변경해준다.
result =pd.DataFrame.from_dict(gu_dict).T
result.columns = ['pop', 'moon', 'hong', 'ahn']
# 모든 광역시에 대하여 가져올것이기 때문에, 광역시도 컬럼을 만들어 해당 시도를 입력하준다.
result['광역시도'] = n
result.reset_index(inplace=True)
result.rename(index=str, columns={"index": "시군"}, inplace = True)
return result
2. 이제 cityCode마다 돌면서, 값을 다 긁어와주자!¶
In [22]:
for city in city_names:
element = driver.find_element_by_id("cityCode")
element.send_keys(city)
driver.find_element_by_xpath("""//*[@id="searchBtn"]""").click()
tmp = get_vote(city)
if city ==city_names[0]:
result = tmp
else:
result = result.append(tmp)
result
Out[22]:
3. 마지막으로 저장! 끗¶
In [23]:
result.to_csv('./data/election_result.csv', encoding='utf-8', sep=',')
반응형
'Study > 파이썬으로 데이터 주무르기' 카테고리의 다른 글
[시계열 데이터 분석] numpy를 이용한 시계열 데이터 분석 (0) | 2018.07.18 |
---|---|
[19대 선거] 후보 간의 득표 수 시각화 하기 (0) | 2018.07.16 |
[Folium으로 지도 그리기] folium으로 지도그리기 feat.인구소멸 위기지역 (0) | 2018.07.13 |
[인구 데이터] 우리나라 인구 소멸 위기 지역 분석 (0) | 2018.07.13 |
[서울시 범죄율] folium을 이용한 시각화 (0) | 2018.07.11 |
댓글