Django

[Python] OpenAPI JSON 데이터 받아오기

오늘 할 일을 내일로 2024. 1. 18. 18:04

공공데이터포털의 데이터를 이용하여 재밌는 프로젝트를 하나 해보고 싶어서 Open API로 JSON 데이터 받아오기를 먼저 해보았다.

 

csv 파일로 데이터를 받아올 수도 있지만, Django 내부의 데이터베이스에 데이터를 저장해서 사용하고 싶어서 OpenAPI를 이용하는 방식을 이용하였다. 

 

 

일단 공공데이터 포털에서 인증키를 발급 받고 url을 설정해 준다. 

key = "인증키"
start = 1	# 첫 데이터
end = 50 	# 마지막 데이터
url = f"http://openAPI.seoul.go.kr:8088/{key}/json/ListSnowRemoveBox/{start}/{end}/"

 

여기에 맞게 변수를 설정해 주었다. 

 

 

def get_data(url):
    req = request.Request(url)
    response = request.urlopen(req)

    # response status code
    print(response.getcode())

    if response.getcode() == 200:
        return response.read().decode('utf-8')
    else:
        print("[ERROR] " + response.getcode())
        return None

 

request.Request로 request 객체를 생성하고, 

request.urlopen으로 request 객체 (url)를 열어서 response를 받아온다. 

 

response의 status code 가 200 이면 reponse 값을 utf-8로 인코딩하여 data를 읽어오고

200이 아니라면 오류 매세지 출력하고, 아무것도 return 하지 않는다. 

 

 

get_data() 함수로 얻은 return 값을 출력해보면, 

 

request에 대한 response의 status 값과 json 데이터를 받아올 수 있다. 

 

 

class Box:
    def __init__ (self):
        self.boxNum = ""
        self.boxAddress = ""
        self.boxXMin = 0.0
        self.boxXMax = 0.0
        self.boxYMin = 0.0
        self.boxYMax = 0.0

    def print_data(self):
        print(self.boxNum + " " + self.boxAddress)
  
  
def sort_data():
    # json.loads() : JSON 문자열을 딕셔너리로 전환
    data = json.loads(get_data(url))

    for i in range(5):
        box = Box()
        box.boxNum = data["ListSnowRemoveBox"]["row"][i]["SBOX_NUM"]
        box.boxAddress = data["ListSnowRemoveBox"]["row"][i]["DETL_CN"]
        box.print_data()

 

데이터 각각을 저장할 Box라는 객체를 선언하고, 

위에서 만든 get_data() 함수로 data를 받아온다. 

 

여기서 데이터를 json으로 받아오겠다고 url 설정을 해놓았기 때문에 데이터는 json 형식으로 받아오고, 

json.loads() 함수를 이용하여 JSON 을 딕셔너리 형식으로 바꾸어 준다. 

 

 

반복문을 이용하여 임의로 5개의 데이터들에 대해 box 객체를 생성하여 출력해보면,

원하는 출력 값이 나오는 것을 확인 할 수 있다. 

 

 

전체 코드를 보면 

import json
from urllib import request


key = "인증키"
start = 1
end = 50
url = f"http://openAPI.seoul.go.kr:8088/{key}/json/ListSnowRemoveBox/{start}/{end}/"	#JSON 타입으로 설정


class Box:
    def __init__ (self):
        self.boxNum = ""
        self.boxAddress = ""
        self.boxXMin = 0.0
        self.boxXMax = 0.0
        self.boxYMin = 0.0
        self.boxYMax = 0.0

    def print_data(self):
        print(self.boxNum + " " + self.boxAddress)

def get_data(url):
    req = request.Request(url)
    response = request.urlopen(req)

    # response status code
    print(response.getcode())

    if response.getcode() == 200:
        return response.read().decode('utf-8')
    else:
        print("[ERROR] " + response.getcode())
        return None


def sort_data():
    # json.loads() : JSON 문자열을 딕셔너리로 전환
    data = json.loads(get_data(url))

    for i in range(5):
        box = Box()
        box.boxNum = data["ListSnowRemoveBox"]["row"][i]["SBOX_NUM"]
        box.boxAddress = data["ListSnowRemoveBox"]["row"][i]["DETL_CN"]
        box.print_data()


print(get_data(url))
sort_data()

 

 

 

<참고>

https://wikidocs.net/126088

 

077 JSON 데이터를 다루려면? ― json

json은 JSON 데이터를 쉽게 처리하고자 사용하는 모듈이다. ## 문제 다음은 개인정보를 JSON 형태의 데이터로 만든 myinfo.json 파일이다. `[파일명: m…

wikidocs.net

https://data-yul.postype.com/post/7091616

 

openAPI를 이용하여 원하는 데이터를 json 파일로 저장하기 : 포스타입 포스트

""" 공공포탈의 관광자원통계서비스 API를 이용해 서울시 여행자의 데이터를 가져오기 """ import datetime import json import math import urllib.request # 작성된 url에 접속해서 데이터 받아오기 def get_request_url(u

data-yul.postype.com

https://docs.python.org/3/howto/urllib2.html

 

HOWTO Fetch Internet Resources Using The urllib Package

Author, Michael Foord,. Introduction: Related Articles: You may also find useful the following article on fetching web resources with Python: Basic Authentication A tutorial on Basic Authentication...

docs.python.org