네이버클라우드로 거리,시간,연비 데이터 뽑기

전윤환·2022년 5월 7일
1

파이썬 삽질하기

목록 보기
2/4

작성일: 2022/05/07
모르는것: api 전반에 대한 이해, 사용법
알게된것: 헤더, 파라미터, requests모듈 사용법, requests를 통한 api 데이터 요청/수신
궁금한or앞으로해야될것: 수많은 자료를 어떻게 함수화,반복문을 돌려서 데이터를 뽑아낼 것인가

들어가며

셀레니움을 통해 길찾기를 하다가, 크롬창을 띄워서 검색하면 아무래도 시간이 오래 걸리다보니...(한 건당 10초가량) 더 빨리 할 수 있는 api를 써먹고 싶어서 맨땅에 헤딩하는 기분으로 시작해봤다.
사실 나는 5월 3일부터 9일까지 연차인데, 그 중 첫 3일을 몸이 아파 앓는데에만 시간을 써서 너무 억울했다.
그래서 큰맘 먹고 대천의 머드린 호텔로 당일 숙박을 잡고 거금 18만원을 써서 호텔에 들어왔다.
여기 경치도 너무 좋고 기분도 들떠서 그런지, 코딩공부를 하는데 도움이 많이 된 것 같다. 리프레쉬도 되고... 역시 돈 쓰는게 짱이야. 다만 기분이 너무 좋아서 엄마한테 큰 액수의 용돈을 드리는 실수(?)를 하고 말았다.
아무튼... 들어가보자면

기존 셀레니움을 통한 데이터 추출의 문제점

  1. 시간이 너무 오래 걸림
    정말 시간이 오래 걸린다. 매장 1곳 당 센터 5곳을 일일이 검색해서 거리를 긁어와야 하는데, 탐색 1회당 10초가량이 걸리니 결국 매장 1곳당 50초씩 잡아먹는거다. 근데 매장이 1300개가 넘으니... 난 걍 파이썬 돌려놓고 다른 컴퓨터로 다른 업무를 해야할 지경이라 이건 아니다 싶었다.

  2. 인터넷 연결상태, 렉 등에 취약함
    기존 셀레니움 코드에서 타임슬립을 2~4초정도 걸어놨는데, 그 안에 결과값이 나와야 하지만 그렇지 않을 수가 있다.

    그러므로 셀레니움은 폐기!

네이버클라우드에 도전

사실 기존에 네이버클라우드에 가입도 하고 서비스도 등록을 해놨으나, 나는 api를 쓰는 법을 도저히 모르기 때문에 (ㅎㅎ) 그냥 방치만 해놨었다. 그렇지만 너무나도 쓰고 싶은 마음이 간절하여 구글링을 열심히 했고, 어느정도 정답을 찾은 것 같다.

네이버클라우드 가입

네이버클라우드 홈페이지에 접속해서 가입하면 된다. 나는 네이버 계정을 그대로 사용했다.

사용할 서비스 선택/가입

길찾기 코딩을 위한 서비스는 2개다.
Geocoding, Directions 5
이는 네이버클라우드 홈페이지에서 서비스 - Application service - Maps에 존재한다. 필수사항만 세팅하고 가입신청하면 되는 간단한 일이기에 자세한 설명은 생략한다. 네이버클라우드 홈페이지를 잘 살펴보거나, 구글링을 해보면 친절한 설명들이 많다.

Geocoding

지번주소or신주소를 위,경도 좌표로 바꿔주는 서비스. 그 외에도 많은 정보를 주지만, 길찾기를 하기 위해선 주소가 아니라 좌표가 필요하기 때문에 이것만 알면 됨

Directions 5

경유지를 최대 5개까지 추가할 수 있는 서비스라서 뒤에 5가 붙는다. 더 큰 서비스는 뒤에 15가 붙더라.
이 서비스가 길찾기이므로, 결국 1단계가 geocoding에서 좌표를 먼저 불러오는거고, 그 좌표를 directions5에 넣어서 원하는 데이터를 얻는 2단계로 이어진다.

참고!!

서비스를 신청하고 콘솔에 들어가보면, 좌측의 AI,NAVER AI - Application을 들어가보면 내가 등록한 서비스 목록이 나온다. 거기서 우측에 보면 '한도 및 알림 설정' 버튼이 있는데, 반드시 여길 들어가서 설정을 빡세게 해놔야 한다. 그리고 알림이 오는 메일과 문자를 반드시! 부지런히 체크하도록 하자.

나는 예전에 AWS에서 2690달러, 약 320만원 가량의 요금폭탄을 맞고 문의와 메일로 손이 발이 되도록 비는 짓을 3주간 반복하여 간신히 환불 받은 전적이 있다. 혹시나 내 글을 읽는 사람이 나와 비슷한 경우를 겪지 않았으면 하는 마음에 이 내용도 추가한다.

신청한 서비스의 아이디,비밀번호 확인

app이름 밑에 인증정보 버튼을 누르면 창이 하나 뜨고, 거기에 한도가 부여된 나의 아이디와 비밀번호가 있다. 이걸 아무에게도 보여주지 말고 잘 관리하도록 하자.

Geocoding 코드짜기

requests를 사용하기로 했다. 혹시 beautifulsoup도 쓸 수 있을까 싶어서 써봤는데 잘 안되더라. 아시는 분 있으면 알려주셨으면 좋겠습니다.

코드1. 기본세팅

import json
import requests

# 네이버클라우드 정보
geo_client_id = '따옴표 안에 geocoding 아이디 입력'
geo_client_secret = '따옴표 안에 geocoing 시크릿 입력'

코드2. 데이터 입력

addr = '따옴표 안에 내가 좌표를 얻을 주소(구,신 둘다)'
param = {'X-NCP-APIGW-API-KEY-ID':geo_client_id,'X-NCP-APIGW-API-KEY': geo_client_secret,'query': addr}
url = f'https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode'

설명

param. 파라미터. 매개변수라는 뜻. 어떤 데이터를 전송할지? 뭐 그런 뜻인거 같다. (설명서를 읽어보니 아이디, 시크릿은 요청 '헤더'라고 하는 듯 하다ㅎㅎ)
geocoding에서 요구하는 필수 파라미터는 3개다. 내 아이디, 시크릿, 주소. 이걸 딕셔너리 구조로 만들어서 보내버리면 답장을 준다.
그럼 저 X-NCP-APIGW 어쩌구를 내가 다 척척박사처럼 알아내서 작성했냐? 물론 아니다. 난 쌉초보 허접이기 때문에 이런거 모른다. 네이버클라우드의 설명을 읽어봤을 뿐이다.

geocoding 사용설명서

이런식으로 써있다. 여기서 클라이언트id랑 시크릿이 중괄호에 들어가있길래 중괄호까지 코드에 넣어서 써봤는데 안되더라. 나같은 초보들 눈물흘리게 왜 저렇게 써놨는지....
아무튼, 이걸 토대로 param을 작성한거다.
url은 사진의 요청url을 그대로 쓴거고...
query는 설명서에 필수 요청 파라미터라고 써있어서 추가해봤다.

이렇게 필수여부에 유일하게 Y라고 써있다. 하긴 그렇겠지...주소를 보내야 좌표를 찍어서 보내줄테니깐... 다른 파라미터는 내가 쓸게 아니라서 뭔소린지 모르겠다. 패스.

코드3. requests 작동 확인

a = requests.get(url, params = param)
print(a)

requests.get(url)은 스파르타코딩클럽 공부할 때 자주 써본 함수라 이해가 되는데, params는 처음 써봤다. 코드2에서 작성한 헤더와 파라미터들(param변수)을 requests에 태워서 보내는 변수가 저 params인듯 하다.
print(a)의 값은 response 200이 나온다. 정상 작동한다는 뜻.

코드4. 데이터 확인

print(a.json())

이렇게 하면 온갖 정보가 다 제이슨 형태로 담겨서 출력된다.
진짜 드럽게 나온다. 그럴때 제이슨 뷰어를 쓰면 좀 좋다.

내가 쓴 온라인 제이슨 뷰어

여기서 'x':'숫자', 'y':'숫자' 로 나오는 것을 뽑아내면 된다. 이 데이터를 가지고 directions5로 넘어간다.

Directions5 코드짜기

이것도 geocoding처럼 requests로 계속 간다.

코드1. 기본 세팅

import json
import requests


# 네이버 클라우드 아이디, 비밀번호
dir_client_id = '따옴표 안에 아이디'
dir_client_secret = '따옴표 안에 시크릿'

geocoding과 같으므로 설명 생략. 요청헤더에 대한 내용을 변수에 담음

코드2. 데이터 입력

url = f'https://naveropenapi.apigw.ntruss.com/map-direction/v1/driving'

start = 'x좌표,y좌표' # 출발지 좌표. ,으로 x,y구분
goal =  'x좌표,y좌표' # 도착지 좌표. ,으로 x,y구분
cartype = '' # 필수 아님. 원하면 넣음
fueltype = '' # 필수 아님, 원하면 넣음
mileage = '' # 필수 아님, 원하면 넣음
param = {'X-NCP-APIGW-API-KEY-ID':dir_client_id, 'X-NCP-APIGW-API-KEY': dir_client_secret, 'start': start, 'goal': goal}

형식은 geocoding이랑 똑같다. 다만 요청파라미터가 다르므로! 아이디랑 시크릿 다음이 조금 다르다.

Directions5 사용설명서


필수여부가 start, goal뿐이다. 나머지는 원하면 넣으면 됨. 나도 차종, 유종, 연비를 변수는 설정해놨지만 굳이 당장 설정할 수 없어서 비워놨고, param에도 추가하지 않았다.

코드3. 데이터 출력

a = requests.get(url, param)
print(a.json())

geocoding과 마찬가지로 json형태로 뽑아낸다.
여긴 진짜...드럽게 많이 나온다. 어마어마하다. 반드시 제이슨뷰어를 사용하자.

json 이쁘게 출력하기

pprint나, json.dumps()를 쓰면 이쁘게 나온다고 하던데, 나는 잘 안되더라. 당장에 급한 일도 아니기 때문에 구글링을 깊게 하진 않았다. 나중에 시간 나면 해봐야지..누가 알려주셨으면 좋겠습니다.

json 결과 확인


json형태는 위와 같다.

코드4. 나에게 필요한 데이터 뽑아내기

b = dict(a.json())
거리 = b['route']['traoptimal'][0]['summary']['distance']
시간 = b['route']['traoptimal'][0]['summary']['duration']
톨비 = b['route']['traoptimal'][0]['summary']['tollFare']
기름 = b['route']['traoptimal'][0]['summary']['fuelPrice']

distance : 106,370미터
duration: 5,650,706밀리초(1/1000초)
tollFare: 2,600원(톨게이트비용) - 기본값 설명서참조
fuelPrice: 14,689원(유류비) - 기본값 설명서참조

이 데이터들을 뽑아서 사용하면 되겠다. 어떻게 뽑냐? 그건 지금부터 생각해야된다.

참고한 사이트

https://velog.io/@choonsik_mom/Naver-API%EB%A1%9C-%EA%B8%B8%EC%B0%BE%EA%B8%B0with-python

https://www.daleseo.com/python-json/

https://dgkim5360.tistory.com/entry/python-requests

profile
코딩 연습장. 발전하고 싶습니다. 모든 방향에서의 비판 부탁드립니다.

0개의 댓글