My Project/풍덩

풍덩 - 웹 크롤러 시행착오 일기

Hitzi 2020. 1. 12. 11:26

난 게임을 하나 시작하면 반드시 첫 캐는 망캐가 된다.

게임시스템이며 캐릭/직업 특성이며 이것저것 배워야할 게 너무 많아 손가는대로 대충 키워보고 결국 한 번 망하고 그 시스템들에 익숙해진 뒤 새로 키우는 캐릭터를 잘 키우게 된다.

 

그래서 저번에 하던 프로젝트가 하나 망했으니 이번 새 프로젝트는 순조로울거라고 생각했지만,

이번에 새로 만드는 웹앱도 마찬가지였다. 시도하는거 하나하나 시행착오를 안 겪는게 없었다.

저번에 하던 프로젝트를 말아먹어서 절망감에 빠져 한강 수온 체크 웹앱을 만들기로 결심했으니 이번엔 반드시 만들어내서 뿌듯함을 느껴보자. 프로젝트 성공을 위해 내가 겪었던 시행착오를 기록해서 오답노트로 삼자.

 

이번에 새로 만들 웹앱은 한강 수온 체크 웹 어플리케이션 "풍덩" 이다.

 

한 때 자살 조장 앱이 아니냐는 오해를 받은 적이 있는 기존 한강 수온 체크 앱 "퐁당"

원래 "퐁당"이라는 모바일 앱이 있으니 어떻게 보면 클론코딩이라고도 할 수 있겠다.

일단 이 웹 앱을 만들기위해서는 한강 수온 데이터를 구해와야 한다. 

 

데이터를 구해오는 방법엔 일단 두가지가 있었다.

 1. 실시간 수질 정보 시스템(http://www.koreawqi.go.kr/index_web.jsp)에서 웹 크롤링으로 데이터 긁어오기

 2. Open API를 이용하여 데이터 요청하기

 

처음엔 저번 프로젝트때 실패한 한이 남아서 API는 일부러 차선책으로 두고 웹 크롤링을 하려고 했으나, 내 코드가 준 답변은 null값이었다. 이유를 알아보니 나는 파이썬 라이브러리인 requests와 BeautifulSoup4를 사용해서 웹 크롤링을 했는데, 이 두 라이브러리는 정적 웹페이지의 데이터만 긁어올 수 있는 아이들이었고, 실시간 수질 정보 시스템 웹페이지의 수온 정보는 javascript로 불러온 동적 데이터였기 때문에 내 코드는 데이터를 긁어올 방법이 없었다. 

 

크롬 개발자 도구에 있는 디버거 기능. 위 사진의 Disable JavaScript에 체크를 하면 해당 웹 페이지에서 어떤 것들이 동적 페이지로 작동하는지 알 수 있다.

 

때문에 얌전히 api값을 받아와서 만들기로 했지만, 공공 데이터 센터의 오픈 API의 데이터는 너무 빈약했다. 

분명 리얼타임 수질 데이터인데도 불구하고 연도별/지역별로 데이터가 한 두가지 씩 밖에 들어있지 않아서 도저히 써먹을 수가 없었다. 우리 공공기관은 믿을게 못 된다는 결론만 얻을 수 있었다.

 

결국 다시 웹크롤링으로 돌아와서 동적 데이터도 긁어올 수 있는 셀레니움을 활용한 웹 크롤러를 만들었다.

셀레니움은 그 자체가 웹 크롤러는 아니지만, 웹드라이버를 활용하여 동적 페이지가 작동된 이후의 웹페이지 데이터를 긁어오는데 도움을 주는 파이썬 라이브러리다.

 

from selenium import webdriver

from bs4 import BeautifulSoup

import time

 

URL = "http://koreawqi.go.kr/index_web.jsp"

path = r"C:\Users\taehw\AppData\Local\Programs\Python\Python37\chromedriver.exe"

 

def get_temperature():

    driver = webdriver.Chrome(path)

    driver.get(URL)

    driver.implicitly_wait(3)

    req = driver.page_source

    soup = BeautifulSoup(req, 'html.parser')

    temper = soup.select('tr.site_S01001 > td.avg1')

    return {"temperature" : temper}

 

get_temperature()

 

처음엔 IDE를 활용해서 이 py파일을 테스트 해봤으나 크롬드라이버를 찾을 수 없다는 오류만 뜨길래 코드가 잘못된건가 싶어 한참을 알아봤지만, 결국 이유를 알 수가 없어 될대로 되라는 식으로 직접 py파일을 실행해보니 오류도 안뜨고 동작은 하는 것 같아 웹크롤러는 IDE로 테스트를 하면 안된다는 교훈을 얻을 수 있었다.

 

또 하나 문제가 생겼는데, 이렇게 얻은 데이터를 어떻게 프론트로 가져와야 하는지를 알 수가 없다. DB에 저장해서 서버로 가져와야 하는 것인가? 아니면 그대로 프론트에서 써먹을 수 있는 것인가? 이 쪽은 좀 더 공부가 필요하다.

 

다음 번 포스팅은 프론트에 긁어온 데이터를 활용하는 과정이 되겠다.