본문 바로가기
Project

[ 환경방사능 예측 프로그램 ] 1. 공공 데이터 포털 API 가져오기

by Foxy현 2023. 2. 18.
728x90
반응형

안녕하세요!

현재 진행 중인 프로젝트 과정에 대한 글을 올려볼까 합니다.

방사능 분야의 인공지능 전문가가 되기 위한 첫 프로젝트라고 할 수 있겠는데요

이번 프로젝트에서는 환경 방사선 API를 가져와서 선량값을 예측하는 프로젝트를 진행하려고 합니다.

 

이번 글에서는 그 첫 번째 과정인, API 가져오는 것에 대한 내용입니다.

https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15074724 

 

전라남도_환경방사선 무인감시기 감시 분석 결과

입력 파라미터를 이용하여 전라남도 환경방사선 무인감시기 감시 분석 결과 및 상세정보를 조회할 수 있는 서비스

www.data.go.kr

먼저 공공 데이터 포털의 위 링크의 데이터를 사용할 예정인데요. 제가 사는 곳이 광주광역시이므로 전라남도로 진행해 보았습니다!

 

1. 데이터 활용신청

눌러서 포맷에 맞게 작성을 해주시면 됩니다. 대충 적었던 것 같은데 연구용은 간단하게 적어도 가능한 것 같네요.

 

보시는 것처럼 승인이라고 표시가 되면 사용 가능합니다.

 

2. API 가져오는 코드 작성하기

그리고 들어가 보면 이러한 인증키가 있습니다.

보안 때문에 뒤의 내용은 가렸습니다.

인코딩과 디코딩이 있는데 대부분의 경우에는 디코딩으로 하면 정상 작동하고, 안된다면 인코딩으로도 해보세요!

 

샘플 코드를 그대로 가져와서 사용하겠습니다.

url의 마지막 부분은 

 

 

에 따라 각각 다르게 작성하셔야 하고, 아래 params 부분 또한 상세 내용에 맞게 변경하여 작성합니다.

각 목록마다 아래 표처럼 작성해줘야 하는 부분이 다릅니다.

 

전체 코드입니다.

 

# 모듈 import
import requests
import pprint

#인증키 입력
encoding = '인코딩 코드'
decoding = '디코딩 코드'


#url 입력
url = 'http://apis.data.go.kr/6460000/ecoRadSafeInfo/getDayInfoList'
params ={'serviceKey' : decoding,
         'searchDt' : '2023-02-15', 
         'pageSize' : '1000',
         'startPage' : '1'
 }

response = requests.get(url, params=params)
content = response.text

content에는 불러온 xml 값들이 저장되어 아래에서 사용됩니다.

 

from os import name
import xml.etree.ElementTree as et
import pandas as pd
import bs4
from lxml import html
from urllib.parse import urlencode, quote_plus, unquote

#bs4 사용하여 item 태그 분리

xml_obj = bs4.BeautifulSoup(content,'lxml-xml')
rows = xml_obj.findAll('list')

위에 content를 print 하여 내용을 확인해 보면, 둘러싸인 내용을 확인할 수 있을 것입니다.

 

보시면 요청변수 이후의 값들은 list라는 태그 안에 둘러싸여 있고, 각 리스트 한 개에 튜플 한 개가 들어있는 것을 확인하실 수 있습니다.

 

# 각 행의 컬럼, 이름, 값을 가지는 리스트 만들기
row_list = [] # 행값
name_list = [] # 열이름값
value_list = [] #데이터값

# xml 안의 데이터 수집
for i in range(0, len(rows)):
    columns = rows[i].find_all()
    #첫째 행 데이터 수집
    for j in range(0,len(columns)):
        if i ==0:
            # 컬럼 이름 값 저장
            name_list.append(columns[j].name)
        # 컬럼의 각 데이터 값 저장
        value_list.append(columns[j].text)
    # 각 행의 value값 전체 저장
    row_list.append(value_list)
    # 데이터 리스트 값 초기화
    value_list=[]

반복문을 사용하여 이 정보들을 리스트에 저장해 줍니다.

 

date_meausure = pd.DataFrame(row_list, columns=name_list)
# print(date_meausure.head(20))

 

데이터프레임으로 변경해 주고,

date_meausure.to_csv('data/date_measure.csv', encoding='utf-8-sig')

csv파일로 변환한다면, 이후 이 작업을 반복할 필요가 없겠네요!

 

완성입니다.

이렇게 해서 오늘 XML로 구성된 API 데이터를 가져와서 DataFrame으로 변환하는 것을 배워보았습니다.

사실 혼자 해보면서 조금 시간이 걸렸는데, 이런 경험을 직접 해보았으니 이후에는 시간이 단축되겠네요.

 

이후 프로젝트 과정에 대해서 또 다루도록 하겠습니다. 감사합니다

 

 

728x90
반응형