공공데이터에 있어 api란 실시간정보가 조회가 가능한 것이다

공공데이터 포털에 들어가게되면 csv, excel형식의 파일데이터와  open api형태의 데이터로 나누어 정보를 제공하는데 

 

보통 파일데이터로 제공하기에는 너무 정보가 방대하거나 데이터의 업데이트주기가 짧아야할 경우에 api로 제공하는모양새이다.

 

api는 사용자가 요청한 정보만을 반환한다.

 

한국천문연구원의 특일정보 api를 이용해서 공휴일 정보를 가져와보겠다.

먼저 로그인후에 원하는 데이터를 검색하고 우측상단에 활용신청을 누르면 다음과 같은페이지가 나온다. 

활용신청을 누른뒤 형식에 맞게 입력후 신청을 하면 api에 따라 다르겠지만 보통은 금방 승인이 난다. 

 

후에 마이페이지 -> 오픈 api

아까 신청했던 목록이 보일 것이다 이것을 클릭하면 

이렇게 인증키를 확인할 수 있다. 

 

이제 데이터를 받아 저장하는 파이썬 코드를 알아보자 이 api는 xml이다.

 

본문 상단에 있는 기본정보란에 상세설명을 누르면 

이렇게 요청하는해야하는 변수와 출력해주는 결과를  보여준다.

위의 경우에는 

api주소 + 기능이름 + 년 + 월 + 서비스키를 입력하면

출력결과를 가져오게된다. 

 

import requests
import datetime
from bs4 import BeautifulSoup
import urllib.parse as urlparse


def get_request_query(url, operation, params, serviceKey):
    params = urlparse.urlencode(params)
    request_query = url + '/' + operation + '?' + params + '&' + 'serviceKey' + '=' + serviceKey
    return request_query

먼저 주소,  기능, 요청변수, 서비스키를 입력하면 이들을 합쳐 하나의 url로  이어주는 함수를 정의하였다.

params는 파라미터들의 준말로 여기서는 solYear,solMonth 이다. 

 

mykey = "인증키는 노출불가능"
url = 'http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService'
operation = 'getRestDeInfo'
year = '2021'
month = '09'

params = {'solYear':year, 'solMonth':month}

request_query = get_request_query(url, operation, params, mykey)
print(request_query)

이렇게 나의 인증키, 주소, 요청인자들을 활용해 하나의 url을 만들고 해당 html구문을 분석하여

원하는 정보를 가져오면 된다.

res = requests.get(request_query)
soup = BeautifulSoup(res.text, 'lxml')
items = soup.find_all('item')

for item in items:
    day = item.locdate.get_text()
    name = item.datename.get_text()
    
    print(name, ' : ', day)
추석  :  20210920
추석  :  20210921
추석  :  20210922

포문을 활용하면 이렇게 

import requests
import datetime
import pandas as pd
from bs4 import BeautifulSoup
import urllib.parse as urlparse


def get_request_query(url, operation, params, serviceKey):
    params = urlparse.urlencode(params)
    request_query = url + '/' + operation + '?' + params + '&' + 'serviceKey' + '=' + serviceKey
    return request_query

mykey = "인증키공개 ㄴㄴ"
url = 'http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService'
operation = 'getRestDeInfo'

df = pd.DataFrame()

for year in [2019,2020,2021]:
    for month in range(1,13):

        if month < 10:
            month = '0' + str(month)
        else:
            month = str(month)
        params = {'solYear':year, 'solMonth':month}

        request_query = get_request_query(url, operation, params, mykey)

        res = requests.get(request_query)
        soup = BeautifulSoup(res.text, 'lxml')
        items = soup.find_all('item')

        for item in items:
            day = item.locdate.get_text()
            name = item.datename.get_text()
            data = {'휴일이름':name , '날짜':day}
            df = df.append(data, ignore_index=True)
    
display(df.head())
display(df.tail())
  휴일이름 날짜
0 11 20190101
1 설날 20190204
2 설날 20190205
3 설날 20190206
4 삼일절 20190301
  휴일이름 날짜
47 개천절 20211003
48 대체공휴일 20211004
49 한글날 20211009
50 대체공휴일 20211011
51 기독탄신일 20211225

 

+ Recent posts