SiLaure's Data

[API] Open API를 활용하여 json 데이터 추출하기(공공데이터 API) 본문

Records of/Learning

[API] Open API를 활용하여 json 데이터 추출하기(공공데이터 API)

data_soin 2021. 7. 29. 18:30

 

- 공공데이터 Open API 사용하기

1. 공공데이터 포털 회원가입/로그인
   (https://www.data.go.kr/)
2. API 사용 요청, 키 발급
3. API 문서(specification) 확인
4. API 테스트 및 개발

활용신청은 PC버전에서만 가능하다.
금방 승인된다.

 

발급된 Key 확인하기

 

 

- Key 값 확인하기

  • 서비스 호출을 트래킹 할 목적이나 악의적인 사용을 금지할 목적으로 주로 사용한다.
  • 새로 발급받은 키는 30분 이후 사용이 가능하다.
    (1시간에서 변경됨.)

 

참고문서를 다운받아서 확인해보면 API 활용 메뉴얼을 볼 수 있다.

 

 

 

- EndPoint 확인하기

: API가 서비스 되는 서버의 IP 또는 domain 주소

 

예시 코드

http://api.visitkorea.or.kr/openapi/service/rest/EngService/areaCode?serviceKey=
인증키&numOfRows=10&pageSize=10&pageNo=1&MobileOS=ETC&MobileApp=AppTest

 

 

 

코드의 인증키를 { }로 변경하고 .format() 함수를 사용하여 servicekey를 받아온다.
endpoint = 'http://api.visitkorea.or.kr/openapi/service/rest/EngService/areaCode?serviceKey={}&numOfRows=10&pageSize=10&pageNo=1&MobileOS=ETC&MobileApp=AppTest' .format(serviceKey)
print(endpoint)

출력 : 

http://api.visitkorea.or.kr/openapi/service/rest/EngService/areaCode?serviceKey=dtuzoTN5bo7nYj9fC0ZOIq3jRx7mNbpWVZFk81OjrLH0VjE%2FvObm7sx%2FZb0EFT80%2Byiz2UUYU10IkPH6gS84LA%3D%3D&numOfRows=10&pageSize=10&pageNo=1&MobileOS=ETC&MobileApp=AppTest
클릭해보면 XML 형식으로 되어있다.
이를 json type으로 바꾸려면 요청 코드 뒤에 &_type=json 를 붙이면 된다.

더보기

잠깐!!!!

위에처럼 <SERVICE KEY IS NOT REGISTERED ERROR.> 에러가 떠서 찾아봤더니 이런 경우가 있었다.
Python requests 모듈에서 parameter인 string을 URL encoding을 하기 때문에,
결과적으로 API Key 값을 그대로 전달하는 경우 URL encoding을 '2번'한 결과가 된다.
따라서 서버에서 "SERVICE KEY IS NOT REGISTERED ERROR" 에러를 리턴하게 되는 것이었다.

나는 인증키 사용가능 시간이 안 지난 줄 알고 가마니 기다렸다..

 

따라서 이런 경우에는 decoding url을 쓰거나 자체적으로 decoding 후 써보도록 한다.

 

decoding 인증키를 붙여봐도 안돼서 찾아보다가 decoding 한 뒤 다시 해보려고 하기도 했는데마지막으로 한번 더 해보자 생각하고 했더니그냥 되어버리네..시간이 아직 안 지난 거였다....머쓱ㅎ출력을 클릭하면 다음과 같은 창이 열린다.

맞긴 한데 뭔가 많이 다르네....

 

 

- Python code로 자동화 하기

 

1. parameter 값 확인하기

  • pageNum도 fomat으로 받는다.
endpoint = 'http://api.visitkorea.or.kr/openapi/service/rest/EngService/areaCode?serviceKey={}&numOfRows=10&pageSize=10&pageNo={}&MobileOS=ETC&MobileApp=AppTest&_type=json'.format(serviceKey, 1)
resp = requests.get(endpoint)
print(resp.status_code)
print(resp.text)

resp.json 

type(resp.json)
전달받은 response data가 json일 경우 json으로 호출할 수 있다.

 출력 : 

200
{"response":{"header":{"resultCode":"0000","resultMsg":"OK"},"body":{"items":{"item":[{"code":1,"name":"Seoul","rnum":1},{"code":2,"name":"Incheon","rnum":2},{"code":3,"name":"Daejeon","rnum":3},{"code":4,"name":"Daegu","rnum":4},{"code":5,"name":"Gwangju","rnum":5},{"code":6,"name":"Busan","rnum":6},{"code":7,"name":"Ulsan","rnum":7},{"code":8,"name":"Sejong","rnum":8},{"code":31,"name":"Gyeonggi-do","rnum":9},{"code":32,"name":"Gangwon-do","rnum":10}]},"numOfRows":10,"pageNo":1,"totalCount":17}}}
dict

 

2. data로 가져와서 저장하기

data = resp.json()
print(data['response']['body']['items']['item'][0])
response 안에, body 안에, items 중 item에서 0번째인 것을 data에 저장

출력 : {'code': 1, 'name': 'Seoul', 'rnum': 1}

 

 

Comments