본문 바로가기

셀레늄

첫번째 단계에서 해야할 작업은 서울시의 전기차 충전소 현황을 담은 자료를 구하는 것이었다. 

우리가 첫번째로 구할 수 있었던 자료는 전력 빅데이터 센터(https://bigdata.kepco.co.kr/)의 전기차 충전소 설치 현황 자료였다.

자료 : https://home.kepco.co.kr/kepco/BD/BDBAPP008/BDBAPP008.do?menuCd=FN33020108

 

이것만 갖고 본래 작업을 수행하려 했으나, 개수가 적고 특정지역에 비어있는 등의 문제가 있는 것을 확인하였고, 다른 충전소 자료를 탐색하여 전체 충전소에 대한 자료가 맞는지 확인해본 결과, 전기차 충전소 실시간 조회 서비스를 찾을 수 있었다. 여담으로 포스트 작성을 하면서 이곳(https://www.ev.or.kr/evmonitor)에서도 실시간 전기차 충전소 모니터링 서비스를 제공한다. 이곳의 자료도 수집하여 정보를 검토할 수도 있었을 것 같다.

 

주소: http://user.happecharger.co.kr/chargeView.do

happeCharger의 충전소 조회 서비스 화면

위 자료와 같이 지도에 충전소 위치에 마커를 표시하였고 좌측에 충전소 목록을 확인할 수 있다. 우리의 목표는 이 왼쪽의 박스다! 이것을 selenium을 활용한 크롤링을 하여 구하고자 한다. 사용한 코드는 아래와 같다.

 

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import datetime
import pandas as pd
from tqdm import tqdm_notebook
browser = webdriver.Chrome(r'chromedriver.exe')
url = 'http://user.happecharger.co.kr/chargeView.do'
browser.get(url)

우선 관련 라이브러리를 import한 후, 웹드라이버를 구동시킨 다음 충전소 조회 서비스 페이지로 이동한다.

이제 데이터를 수집하는 페이지에 다다랐다. 하지만 우리는 이 단계에서 바로 데이터를 수집할 수 없다. 충전소 조회 설정을 해야하기 때문이다. 이 또한 코드 작업으로 자동화할 수도 있겠으나, 그 단계까지의 자동화가 필요한 작업도 아니기 때문에 웹드라이버 내에서 손수 클릭하여 검색설정을 바꾸었다..!

바꾼 설정은 1. 충전기 운영기관을 전부 체크 2. 지역명 - '전체'로 설정 두 가지다.

webdriver 내에서 조회 설정을 바꾼 결과

element_list = browser.find_elements_by_class_name('adressbox')
sttn_names = []
address_list = []
for element in tqdm_notebook(element_list):
    tmp = element.text.split('\n')
    sttn_names.append(tmp[0])
    address_list.append(tmp[1])
sttn_df = pd.DataFrame({'name':sttn_names,
                  'address':address_list})

 

 

 

 

 

 

이제 위의 코드로 자료 수집을 시작한다. 좌측 박스의 목록 하나하나는 html코드에서 class name이 'adressbox'로 되어있는 것을 확인했다. (왜 ad'd'ress가 아닐까!)

adressbox태그에는 이름과 주소가 \n으로 구분되어 있으므로 이를 split으로 구분한 다음, 각 list에 append하는 방식으로

수집을 진행하였다. 

그 다음 list 형태로 이름과 주소를 수집한 것을 데이터 프레임으로 저장한 후 그 결과를 확인해 보았다.

크롤링 첫번째 결과

위와 같이 충전소 이름(name)과 주소(address)가 잘 찍혀있는 것 처럼 보였다!

하지만..

서울에 위치한 충전소인데 서울이 아닌 주소들

자료 검토 결과(사실 이후 단계에서 확인한 것이지만) 주소들 중 서울이 아닌 주소들이 일부 발견되었다! 해당 문제에 대해서 탐구해본 결과 주소가 충전소가 위치한 소재지를 가리키는 것이 아니라, 해당 충전소를 관리 및 운영하는 곳의 주소가 적혀있는 것으로 판단되었다. 이에 대한 처리는 아래와 같이 진행하였다.

for i in tqdm_notebook(range(len(sttn_df))):
    if sttn_df.address[i][:2]!='서울':
        sttn_df.loc[i,'address'] = sttn_df.loc[i,'name']

데이터프레임 df의 address 열 값이 '서울'로 시작하지 않는 경우, 그 값을 그 행의 'name'열의 값으로 대체하는 작업을 통해 주소를 일단 충전소 이름으로 대체하는 과정을 통해 위 문제를 해결하였다.

 

 

하지만 이렇게 수집된 결과도 분석결과 이상함을 느껴, 첫번째 자료와 통합한 다음 오류를 직접 찾아보았다. 찾아본 결과 몇몇 충전소 주소가 한군데 주소에 똑같이 찍혀있는 등의 오류를 발견할 수 있었다! 이는 서비스쪽의 서버에서 보내는 단계에서의 오류에 해당하므로, 별 수 없이 수작업으로 수정하였다..! 

이 과정을 끝낸 후에야 데이터 수집 작업을 완전히 마무리할 수 있었다.

 

이 과정으로 얻은 것 두 가지

1. 실시간 조회 서비스 또한 크롤링으로 자료 수집이 가능하다!

2. 크롤링 결과를 안일하게 맹신하지 말자..! 귀찮더라도 잘 수집됐는지 두 번은 확인하자! (실제로 두 번 수정..)

 

다음 포스트에서는 이렇게 수집한 충전소 이름, 주소를 갖고 지리데이터 분석을 하는 기초 단계를 다루어 보고자 한다.

댓글