두부너겟
두부너겟 저장소
두부너겟
전체 방문자
오늘
어제
  • 분류 전체보기 (43)
    • 일상 (3)
      • 취준 (3)
    • 통계학 (1)
    • 삽질기록 (3)
    • Python (10)
      • Pandas (0)
    • SQL (3)
      • HackerRank (2)
    • Cloud (3)
      • AWS (3)
    • Algorithm (11)
      • 이코테 (1)
      • 백준 (0)
      • 프로그래머스 (10)
    • Qgis (7)
    • JAVA (0)
      • Spring (0)
    • 책 (0)
      • 파이썬 라이브러리를 활용한 머신러닝 (0)
    • Web (0)
    • 네트워크 (0)
    • R (1)
    • 기타 (1)
    • k8s (0)
      • 따배쿠 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • hackerrank
  • tqdm
  • QGIS
  • Python pie chart
  • OSMnx
  • HSK IBT
  • 시각화
  • HSK
  • jupyter lab 아이콘 에러
  • AWS SAA
  • AWS #aws #Datasync #storageGateway
  • 공공데이터API
  • pie chart
  • python
  • Groupby
  • 기초통계
  • HSK4급
  • 공공데이터포털
  • pandas
  • 통계학

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
두부너겟

두부너겟 저장소

공공데이터포털 Open API를 JSON으로 불러오기
Python

공공데이터포털 Open API를 JSON으로 불러오기

2022. 12. 21. 15:31

공공데이터를 분석하다보면 csv형식으로 제공되지 않는 데이터가 많다.

API로 제공되는 데이터는 따로 파싱해주어야 하는데 매번 쓰면서도 정리를 안 해둬서 이번 기회에 정리하기로 했다.

한번 배워두면 다른 곳에도 응용이 가능해서 유용하다

 

목표는 파이썬을 활용해서 공공데이터 포털의 Open API를 신청하고 데이터를 가져오는 실습을 진행하고

불러온 데이터는 pandas를 이용해서 데이터프레임으로 바꿔서 CSV파일로 만들기!

 

실습 데이터

 

https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15056633 

 

환경부 국립환경과학원_생활계 물사용량 정보제공서비스

매년 전국 광역지자체(17개). 기초지자체(230개)에서 제출한 자료를 바탕으로 국립환경과학원에서 통계자료 등과 비교·검토하여 확정한 자료임. 조사항목은 생활계, 축산계, 산업계, 토지계(국토

www.data.go.kr

 

사용할 데이터는 환경과학원의 물사용량 정보제공 데이터이다.

 

우선 링크에 들어가서 활용신청 클릭 후, 신청하라는 대로 데이터 활용신청 하기

 

 

 

 

이후 공공데이터포털 https://www.data.go.kr/index.do 의 마이페이지에 들어가보면 신청된 API의 여부가 뜬다.

이미 API를 신청하고 key를 발급 받은 상태라 신청은 0건이 뜨고 활용은 5건이 뜨는 것을 확인할 수 있다.

 

중요! 활용으로 넘어가야 API를 사용하는게 가능해진다. 간혹 자동승인이 아닌 경우도 있기 때문. 자동승인인 경우에도 안되면 시간을 두고 기다려 보는 것을 추천한다. (30분에서 2시간 사이)

 

 

 

 

활용신청 된 API를 클릭하면 이런 페이지가 뜨는데, 여기서 가장 중요한 건 인증키!

인증키를 활용하여 url에 인증키와 변수를 넣어주는 식으로 서버에서 데이터를 받아올 수 있다.

 

 

 

아래로 내려보면 미리보기가 있는데 미리보기 확인을 누르면 원하는 변수를 넣어서 미리 조회해볼 수 있다.

 

어떤 변수가 있는지 모르겠다면 API설명 상세페이지 들어가서 doc파일이나 hwp파일을 보고 사용법 참조하면 더 도움이 되니까 꼭 살펴볼것!(API 사용설명서라고 보면 된다)

 

 

불러오기

1. XML로 불러오기

http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo?serviceKey=개인키가들어가는부분&pageNo=1&numOfRows=100&type=xml

 

 

 

2. JSON으로 불러오기

http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo?serviceKey=개인키가들어가는부분&pageNo=1&numOfRows=100&type=json

 

 

예시

http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo

URL 부분은 사용하고자 하는 API마다 다르다.

 

  • serviceKey: 개인이 발급받은 키가 들어가는 부분(encoding/decoding)
  • pageNo: 페이지 넘버
  • numOfRows몇번째 행까지 표시할 건지
  • type: 데이터 타입(XML/JSON)

 

쿼리스트링 방식으로 서버에 요청하는데 엔드포인트 주소 뒤에 ? 시작으로 쿼리스트링이 시작함을 알리고, 파라미터가 여러개일 경우 &를 통해 여러개의 파라미터 값을 넘긴다.

 

참고) https://hianna.tistory.com/465 

 

 

 

라이브러리

import requests
import pprint
import json
import pandas as pd
from pandas.io.json import json_normalize

 

api로 받아오기

# Python3 샘플 코드 #

decoding = '발급받은개인키'
encoding ='발급받은개인키'

# api parameter call 하는 부분
# params 에 원하는 값 넣어주면 된다
# fstring방식도 사용 가능함
url = 'http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo'
params ={'serviceKey' : decoding, 'numOfRows' : '1000',
         'pageNo' : '1', 'resultType' : 'json',
         'startYear' : '2012', 'endYear' : '2022',
         'adivi_cd' : '3014011600',
         'city_nm' : '대전광역시', 'citicoungu_nm' : '',
         'adivi_doung_nm' : '', 'adivi_ni_nm' : '' }

response = requests.get(url, params=params) # json파일 접근

contents = response.text

# 정리
pp = pprint.PrettyPrinter(indent=4)
print(pp.pprint(contents))

 

문자열 JSON으로 변환

json_txt = json.loads(contents)
print(type(json_txt))

 

딕셔너리 형태인 것을 확인 가능하다.

 

 

원하는 값만 가져오기

body = json_txt['getLvlhPpnWatUsageInfo']['item']
print(body)

중요! 출력된 값을 보면 getLvlhPpnWatUsageInfo -> header -> item순으로 되어있다.

JSON마다 이름이 달라지므로 JSON을 보고 맞게 바꿔줘야 한다.

여기서는 getLvlhPpnWatUsageInfo 안에 있는 item 속에 원하는 정보가 포함 된 것을 확인할 수 있다.

 

가져와지는것을 확인할 수 있다.

 

추출된 값을 DataFrame으로 만들기

1. json_normalize() 사용

df = json_normalize(body)
df.head()

 

2. from_dict() 사용

df2 = pd.DataFrame.from_dict(body, orient='columns')
df2.head()

 

둘 중 어느것을 사용해도 결과는 같다.

 

csv로 저장

df.to_csv('water_daejeon.csv',index=False)

 

 

전체 코드

import requests
import pprint
import json
import pandas as pd
from pandas.io.json import json_normalize

# Python3 샘플 코드 #

decoding = '발급받은키'
encoding = '발급받은키'

# api parameter call 하는 부분
# params 에 원하는 값 넣어주면 된다
# fstring방식도 사용 가능함
url = 'http://apis.data.go.kr/1480523/LvlhPpnWatUsageService/getLvlhPpnWatUsageInfo'
params ={'serviceKey' : decoding, 'numOfRows' : '1000',
         'pageNo' : '1', 'resultType' : 'json',
         'startYear' : '2012', 'endYear' : '2022',
         'adivi_cd' : '3014011600',
         'city_nm' : '대전광역시', 'citicoungu_nm' : '',
         'adivi_doung_nm' : '', 'adivi_ni_nm' : '' }

response = requests.get(url, params=params) # json파일 접근
contents = response.text

# 정리
pp = pprint.PrettyPrinter(indent=4)
print(pp.pprint(contents))


# 문자열 JSON 변환
json_txt = json.loads(contents)
print(type(json_txt))

# JSON 값 가져오기
body = json_txt['getLvlhPpnWatUsageInfo']['item']
print(body)

#추출한 값을 df로
# 1. json_normalize() 사용
df = json_normalize(body)
df.head()

# 2. from_dict() 사용
df2 = pd.DataFrame.from_dict(body, orient='columns')
df2.head()

## csv로 저장
df.to_csv('water_daejeon.csv',index=False)
저작자표시 (새창열림)

'Python' 카테고리의 다른 글

[Seaborn] legend 위치 옮기기  (1) 2023.01.06
OSMnx 설치하기  (0) 2022.12.15
[Geopandas] 기초 시각화, geojson 사용하기  (0) 2022.12.15
[Python] tqdm  (0) 2022.11.28
[Python] Groupby로 묶은 df 다시 되돌리기  (0) 2022.11.22
    'Python' 카테고리의 다른 글
    • [Seaborn] legend 위치 옮기기
    • OSMnx 설치하기
    • [Geopandas] 기초 시각화, geojson 사용하기
    • [Python] tqdm
    두부너겟
    두부너겟

    티스토리툴바