[python] 공공데이터 포털 오픈API 형태 데이터 불러오기( feat. 서울 열린데이터 광장, 공공데이터 포털)
오픈API
: 누구나 사용할 수 있도록 공개된 API
API
: Application Programming Interface(응용 프로그래밍 인터페이스)의 줄임말
프로그램 간의 소통을 위해 사전에 정의된 약속
* API의 맥락에서 Application란
: 고유한 기능을 가진 모든 소프트웨어를 나타냄, 내가 만들었거나 남이 만들어둔 구글이나 네이버같은 서비스
* API의 맥락에서 Programming란
: 파이썬이나 자바 같은 언어로 프로그램을 만드는 것을 의미
* API의 맥락에서 Interface란
: 두 애플리케이션 간의 서비스 계약이라고 할 수 있음, 서로 간에 원활히 소통을 할 수 있도록 돕는 표준화된 약속
ui는 유저가 사용하라는 인터페이스
api는 개발자가 시스템 사용하라는 인터페이스
주요 오픈 API 사이트
서울 열린데이터 광장
공공데이터포털
문화데이터 광장
공간정보 오픈플랫폼
서울 열린데이터광장 데이터 가져오기
실습 데이터: 서울시 지하철호선별 역별 승하차 인원 정보
https://data.seoul.go.kr/dataList/OA-12914/S/1/datasetView.do
'서울 열린 데이터 광장' 사이트에서 '서울시 지하철호선별 역별 승차차 인원 정보' 검색
1. 라이브러리import pandas as pd import urllib.request # url을 가져오기 위한 파이썬 모듈 import json
2. 가져올 데이터의 주소와 인증키key = '797a5961526b6768374b6146f' # 본인의 인증키 입력 start = 1 # 페이지 시작 end = 1000 # 페이지 끝 # 미리보기 > OpenAPI > 샘플 URL의 URL을 가져와서 다음과 같이 편집 url = f'http://openapi.seoul.go.kr:8088/{key}/json/CardSubwayStatsNew/{start}/{end}/20230211'
3. 데이터 가져오기
# 라이브러리를 활용해 브라우저에 주소를 쳤다고 가정해줄 수 있는 코드 response = urllib.request.urlopen(url) # 브라우저에서 주소창에 쳐서 응답받은 걸 받아오겠다 # 여기서 응답받은 것 tpye = str json_str = response.read().decode('utf-8') # 응답받은 것을 딕셔너리로 변환 # tpye = dict json_object = json.loads(json_str) # 데이터의 실제 로우들을 가져옴 : 파싱 # 위의 JSON 데이터에서 내가 필요한 행들만 df로 선언해주기 subway = pd.json_normalize(json_object['CardSubwayStatsNew']['row']) #확인 subway.head()
위에서 'CardSubwayStatsNew' , 'row'을 지정해주는 것은 json 데이터 형식보고 가져올 수 있다.
이에는 방법이 2가지 있다.
첫번째는 다음과 같이 예제를 보고 데이터 형식을 이해하고 작성하는 법.
(추천) 두번째는 예제 형식을 Ctrl + C, V해서
json파서(https://jsonformatter.org/json-parser)에 넣고 데이터 형식을 파악한 후 가져오는 방법이 있다.
공공데이터 포털 데이터 가져오기
공공데이터 포털은 활용하고자 하는 데이터 신청을 해야하고
https://www.data.go.kr/iim/api/selectAPIAcountView.do
인증키도 데이터마다 다르기 때문에 마이페이지에서 인증키를 찾아서 활용해야한다
!pip install xmltodict # xml을 딕셔너리 형태로 변환하는 라이브러리 import xmltodict import urllib.request import json import pandas as pd key = '%2BBA3rujPiFOfsje81LymKzWOXxsU%2F75gZU2QRnBm6g6RiJg%2Fe5IGaBCUbBEeYrF%2FV06oYDCnEvXmLeQ3J5eseA%3D%3D' strtYymm = 202201 endYymm = 202212 cntyCd = '' url = f'http://apis.data.go.kr/1220000/nationtrade/getNationtradeList?serviceKey={key}&strtYymm={strtYymm}&endYymm={endYymm}&cntyCd={cntyCd}' response = urllib.request.urlopen(url) xml_parse = xmltodict.parse(response) xml_dict = json.loads(json.dumps(xml_parse)) result = xml_dict['response']['body']['items']['item'] im_export = pd.json_normalize(result) im_export
<참고>
https://www.opentutorials.org/course/3085/18887
https://www.youtube.com/watch?v=55FrHTNjTCc
https://docs.python.org/ko/3/howto/urllib2.html