[ 사이드 프로젝트 ] 약국은 휴일에도? -3-

Side 프로젝트 기록글 -3-

크롤링 한 결과를 KakaoMap api 로 후처리하자

front 의 지도를 구성할 때, 특정 위치를 지도에 표시하기 위해서는 위도(latitude)와 경도(longitude) 가 필요하다.
이전 크롤링의 결과값에서는 약국 정보의 주소값 밖에 없기 때문에, front 에 약국의 위치를 그려주기 위해서는 크롤링 후 위도, 경도 좌표를 따로 구해 저장해 둬야 했다.

이를 위해서는 주소값 (도로명 주소) -> 위,경도 좌표 변환을 해줄 수 있는 api 가 필요했고,
마침 kakao developers 에서 해당 open api 를 제공하고 있어 이를 이용하기로 했다.

kakaomap-api 위,경도를 구하기 위해 사용할 kakako map api

developer guide 에 나온 대로 개인 카카오 계정에서 auth_key 를 발급받은 후 api 명세에 나온 endpoint 를 호출하면 주소 정보가 나오게 되어 있었다.

open api 치고 사용하기 굉장히 편리했는데, 이유를 나열해 보자면

해당 요청을 실행하면 아래와 같은 결과를 얻을 수 있다. 주소 결과값은 json 포맷으로, 크게 구주소도로명주소 로 나뉘어져 있으며, 둘 중 아무 주소값에서 x, y 필드를 들고오면 된다.


후처리한 결과를 AWS RDS 에 넣어 보자

kakao map api 를 통해 위,경도 좌표까지 구했으므로 크롤링 로직은 완성되었다.
AWS 에서는 free tier 으로 MySQL, MariaDB, PostgreSQL, Oracle BYOL 에 대하여 t2.micro 인스턴스를 사용하는 20GB 내의 RDS를 무료로 제공한다.
약국 정보는 그리 큰 용량의 DB 를 필요로 하지 않을 것이기 때문에 free tier 등급의 MySQL 을 사용하기로 하자

aws-rds-free-tier공짜 최고!

aws rds 를 public 도메인에 띄운 이후, rds 의 security group 에 내 로컬 ip 주소를 inbound rule 에 추가 하면 로컬에서 직접 접속이 가능하다.
크롤링 한 정보를 DB 에 저장하기 위해서 필요한 DB 테이블을 생성해 주어야 한다.
크롤링 한 정보에는 날짜 / 약국명 / 주소 / 개점시간 / 폐점시간 / 위도 / 경도 / 추가정보 가 있다.
따라서 각 정보를 column 으로 가지는 table 을 생성해준다. mysql-table-infosql 에 생성된 테이블 정보

또한 python 에서는 mypysql 라이브러리를 통해서 mysql db 를 지원하고 있다.
해당 라이브러리를 이용하여 로컬에서 크롤링한 정보를 DB 에 insert 해 보자

crawling-resultDB 삽입 로그

크롤링후 후처리, DB 작업까지 모두 정상적으로 완료되었고, 총 20분 정도의 시간이 소요되었다.
전국 모든 약국의 정보를 모두 긁어오다 보니 크롤링 하는 부분에서 생각보다 시간이 오래 걸리는 듯 하다.
흥미로운 점은 평일과 주말의 운영 약국수가 다르다 보니 ( 거의 5배 정도 차이나는 듯 하다 ), 크롤링 하는 시간도 달라진다는 점이다.
실제 DB 에서 값이 제대로 들어가 있는지 확인해 보면,

db-query-result-1

db-query-result-2

위 결과처럼 총 4224개의 오늘(일요일)에 영업하는 약국의 정보가 잘 저장되어 있는 것을 확인 할 수 있다.


TL; DR

이번 게시글에서는 크롤링한 약국의 주소를 kakao map api 를 이용해 위도 / 경도 정보를 얻어, 후처리한 데이터를 AWS RDS 에 올렸다.
다음 게시글 에는 크롤링코드를 AWS lambda 에 올려 cron job 으로 매일 새벽에 실행되게 하는 포스팅을 올릴 예정이다.

Discussion and feedback