[API, Python] API 데이터 받아오기 & JSON 파싱하기

김재연·2022년 3월 18일
1

사용할 API

Electricity API를 쓰려면 key를 받아야 하는데 하루가 지나도 안준다..

근데 API 문서를 보다보니 api key가 없어도 받아올 수 있는 api가 딱 하나 있길래 api 받아오는 파이썬 코드 연습해볼 겸 해보기로 했다.

받아올 API는 이거다.

api key가 있는 경우에는 지역 이름과 이 지역에 대한 정보를 가져오고 싶을 때 접근 가능한 경로(어떤 정보를 가져올 수 있는지)를 반환해준다. 근데 지금은 key가 없으니까 지역 이름만 나올 것이다.


ThunderClient로 API 받아오기

일단 thunderclient를 이용해서 해당 api의 url로 GET 요청을 보내면 다음과 같은 응답이 온다.


Python으로 API 받아오기

그럼 이제 파이썬으로 코드를 짜보자

패키지 설치하기

request 패키지를 설치한다. 설치하고 import했는데 노란줄 오류가 떠서 파이썬 인터프리터를 3.10에서 3.7로 바꿔줬다.

pip install requests

json은 이미 깔려있는건지 굳이 안깔아도 되는건지 바로 import json 을 써도 오류가 안났다. (오히려 pip install json 이 오류가 났음)


Request 작성하기

GET 방식으로 불러올 것이기 때문에 requests.get('REST API URL') 을 사용한다.

import requests
requestData = requests.get('REST API URL')

만약 POST 방식으로 불러올 것이라면 requests.post('REST API URL') 로 써주면 된다.

import requests
requestData = requests.post('REST API URL')

지금은 API key가 없기 때문에 헤더에 따로 써줘야할 것은 없지만 나중에는 API key를 헤더에 포함시켜서 요청을 보내야한다. 헤더에는 headers에 dictionary 형태의 값을 넣어주면 된다.

headerDict = {}
headerDict.setdefault('Authorization', 'TOKEN')
requestData_withHeader = requests.get('REST API URL', headers=headerDict)

파라미터를 같이 넘겨야할 때도 헤더 때와 비슷하다.

paramDict = {}
paramDict.setdefault('id', 'admin')
paramDict.setdefault('password', '1234')
requestData_withParam = requests.get('REST API URL', params=paramDict)

둘다 보내고 싶으면 둘다 쓰면 된다.


Response Status Code 확인하기

그럼 데이터는 어떻게 반환되는가?

request로 데이터를 받아오고 나면 status_code로 연결 상태를 확인할 수 있다. 이 코드로 데이터를 잘 받아왔는지, 에러가 났는지 확인할 수 있다. 정수형으로도 판단할 수 있고, requests에서 지원하는 status code 변수로도 판단할 수 있다.

requestData = requests.get('REST API URL')
if requestData.status_code == 200 || requestData.status_code == requests.status_code.ok :
	print('Request OK')

api key를 요구하지 않는 api와 요구하는 api 하나씩 테스트 코드를 돌려보니 다음과 같이 나왔다.

request로 받은 데이터는 기본적으로 string text 형식으로 출력되고, 우리는 해당 string을 json 형식으로 변환하여 출력한다. 이를 위해서는 받아온 데이터 뒤에 .json() 메소드만 붙여주면 된다. 그리고 데이터 출력은 제대로 받아왔을 때만 하면 되므로 status_code가 200인 경우에만 변환하여 출력한다.

requestData = requests.get('REST API URL')
jsonData = None
if requestData.status_code == requests.status_code.ok :
	jsonData = requestData.json()

Response JSON으로 출력하기

그럼 이제 데이터를 출력해보자.

json 변환을 안하고 출력하면 어떻게 되는지 궁금해서 떼고 requestData만 출력해봤더니 status code가 나왔다.


JSON 파싱하기

단일

json으로 나온 데이터를 파싱해서 보기 좋게 만들어보자.

load, loads, dump 같은거 다 써봤는데 다 오류났다. 알고보니 load나 dump는 문자열<->json 변환할 때 쓰는 거 같은데 api로 받아온 이 데이터는 바로 json이라 굳이 이 과정을 거치지 않아도 됐었던거 같다. 바로 .get("Name") 으로 파싱할 수 있었다.


전체

api로 받아온 모든 데이터를 파싱하려면?

dictionary를 for문으로 돌린다.

json 데이터를 파싱하는 방법에는 대괄호를 사용하는 방법과 get을 사용하는 방법이 있는데, 대괄호를 사용하면 에러가 나지만 get을 사용하면 에러가 나지 않는다고 한다. 위 결과에서 볼 수 있듯이 get으로 받아왔을 때 countryName이 없어도 에러가 나지 않고 None 으로 출력되는 것을 볼 수 있다.

profile
일기장같은 공부기록📝

0개의 댓글