학습목표

  1. OPEN API 사용하여 데이터 획득하기

공공데이터 포털 OPEN API 사용하기

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

Endpoint 확인하기

  • API가 서비스되는 서버의 IP 혹은 domain 주소
In [2]:
serviceKey = 'v3%2Ba%2FgQwZ2yRv5tiZME8EIyzxG2c0L34lhUBI8%2Fu27cOw3QQCYYftNgd8Izc1nTW4uokpNTjaRLadHrqLcZECA%3D%3D'
In [3]:
endpoint = 'https://api.odcloud.kr/api/15098465/v1/uddi:b299ef06-0f02-4c1b-a214-9f4a6196905c?page=1&perPage=10&serviceKey=v3%2Ba%2FgQwZ2yRv5tiZME8EIyzxG2c0L34lhUBI8%2Fu27cOw3QQCYYftNgd8Izc1nTW4uokpNTjaRLadHrqLcZECA%3D%3D'
endpoint2 = 'https://api.odcloud.kr/api/15098465/v1/uddi:b299ef06-0f02-4c1b-a214-9f4a6196905c?page=1&perPage=10&serviceKey={}'.format(serviceKey)

key 값 확인하기

  • 서비스 호출 트래킹할 목적이나 악의적인 사용을 금지할 목적으로 주로 사용
  • 새로 발급받은 키는 1시간 이후 사용 가능

Parameter 확인하기

  • API 호출에 필요한 parameter 값 확인 및 구성
In [4]:
print(endpoint2)
https://api.odcloud.kr/api/15098465/v1/uddi:b299ef06-0f02-4c1b-a214-9f4a6196905c?page=1&perPage=10&serviceKey=v3%2Ba%2FgQwZ2yRv5tiZME8EIyzxG2c0L34lhUBI8%2Fu27cOw3QQCYYftNgd8Izc1nTW4uokpNTjaRLadHrqLcZECA%3D%3D
In [5]:
resp = requests.get(endpoint)
print(resp.status_code)
resp.text
200
Out[5]:
'{"currentCount":3,"data":[{"구분":"직접배출(SCOPE 1)고정연소","메테인":"0.696","아산화질소":"0.326","에너지 사용량(TJ)":"0.00","이산화탄소":"4.395"},{"구분":"직접배출(SCOPE 1)이동연소","메테인":"0.028","아산화질소":"0.002","에너지 사용량(TJ)":"0.00","이산화탄소":"0.202"},{"구분":"간접배출(SCOPE 2)(전기구매)","메테인":"9.051","아산화질소":"4.525","에너지 사용량(TJ)":"16.09","이산화탄소":"779.865"}],"matchCount":3,"page":1,"perPage":10,"totalCount":3}\n'

요청 및 Response 확인

  • requests 모듈을 활용하여 API 호출
  • response 확인하여 원하는 정보 추출
  • json 데이터의 경우, python dictionary로 변경하여 사용가능
In [6]:
data = resp.json()
In [7]:
data
Out[7]:
{'currentCount': 3,
 'data': [{'구분': '직접배출(SCOPE 1)고정연소',
   '메테인': '0.696',
   '아산화질소': '0.326',
   '에너지 사용량(TJ)': '0.00',
   '이산화탄소': '4.395'},
  {'구분': '직접배출(SCOPE 1)이동연소',
   '메테인': '0.028',
   '아산화질소': '0.002',
   '에너지 사용량(TJ)': '0.00',
   '이산화탄소': '0.202'},
  {'구분': '간접배출(SCOPE 2)(전기구매)',
   '메테인': '9.051',
   '아산화질소': '4.525',
   '에너지 사용량(TJ)': '16.09',
   '이산화탄소': '779.865'}],
 'matchCount': 3,
 'page': 1,
 'perPage': 10,
 'totalCount': 3}
In [8]:
data['data']
Out[8]:
[{'구분': '직접배출(SCOPE 1)고정연소',
  '메테인': '0.696',
  '아산화질소': '0.326',
  '에너지 사용량(TJ)': '0.00',
  '이산화탄소': '4.395'},
 {'구분': '직접배출(SCOPE 1)이동연소',
  '메테인': '0.028',
  '아산화질소': '0.002',
  '에너지 사용량(TJ)': '0.00',
  '이산화탄소': '0.202'},
 {'구분': '간접배출(SCOPE 2)(전기구매)',
  '메테인': '9.051',
  '아산화질소': '4.525',
  '에너지 사용량(TJ)': '16.09',
  '이산화탄소': '779.865'}]
In [9]:
print(data['data'][0]['구분'])
직접배출(SCOPE 1)고정연소
In [10]:
print(data['data'][1])
print(data['data'][2])
{'구분': '직접배출(SCOPE 1)이동연소', '메테인': '0.028', '아산화질소': '0.002', '에너지 사용량(TJ)': '0.00', '이산화탄소': '0.202'}
{'구분': '간접배출(SCOPE 2)(전기구매)', '메테인': '9.051', '아산화질소': '4.525', '에너지 사용량(TJ)': '16.09', '이산화탄소': '779.865'}