본문 바로가기
대학공부/데이터과학

OpenAPI와 공공데이터에 대한 이해

by 진진리 2024. 3. 11.
728x90

공공데이터의 뜻과 관리 지침

  • 공공데이터의 뜻과 공공데이터법
    • 공공데이터법: 공공데이터의 제공 및 이용 활성화에 관한 법률 
    • 공공기관이 일상적 업무수행의 결과물로 생성 또는 취득하여 관리하고 있는 다양한 형태의 모든 자료 또는 정보
    • 공공기관장은 기계 판독(Machine-readable)이 가능한 형태의 공공데이터를 정비하고자 노력해야 함
  • 기계 판독과 Open Data 5 Star
    • 🌟: 특정 SW에서 읽기만 가능, 자유로운 수정 및 변환 불가 / ex. PDF -> 미충족 포맷
    • 🌟 🌟 : 특정 SW에서 읽기, 수정, 변환 가능 / ex. HWP, JPG, PNG, MP3
    • 🌟 🌟 🌟 : 적어도 하나의 비독점적 SW에서 읽기, 수정, 변환 가능 / ex. CSV, JSON, XML
    • 🌟 🌟 🌟 🌟 : URI에 기초하여 데이터의 속성 및 관계에 대해 기술 / ex. RDF
    • 🌟 🌟 🌟 🌟 🌟 : 웹상의 다른 데이터와 연결되어 제공되는 데이터 / ex. LOD
    • star 개수가 많을 수록 더 개방적

예시의 포맷에 따라 무조건 나뉘는 것은 아님 !

  • 공공데이터가 우리 곁에 오기까지
    1. 생성수집
      • 기관이 생성하는 데이터를 기계 판독이 가능한 꼴로 정비
      • 데이터 개방을 위해 공공데이터의 제공대상을 정의
    2. 처리
      • 제공하고자 하는 데이터가 법적으로 공공데이터에 해당하는지 검토
      • 제공제외대상이 포함되어 있는지, 저작권을 확보했는지 등을 확인
    3. 등록
      • 공공데이터목록등록관리시스템에 제공대상 목록 및 데이터를 등록
    4. 제공
      • 기관의 데이터를 국민과 기업 등을 대상으로 개방 및 제공하는 단계
    5. 사후관리
      • 제공 단계 이후 공공데이터 변경사항 및 갱신주기 등을 반영
      • 데이터 이용에 있어서의 불편 사항 접수 및 분쟁 조정 처리

 

  • 공공데이터 제공 신청과 그 절차

 

공공데이터의 수집과 활용

광역 수준의 다른 자체 포털이 있는지 검토해볼 필요가 있음

  • 웹 크롤링과 OpenAPI
    • 파일 형태가 아닌 OpenAPI 방식으로 공개된 데이터도 공공데이터포털에 존재
    • API 활용을 위한 인증 키 신청 후 Python을 이용하여 데이터 수집 가능
  • Web Crawing
    • BeautifulSoup을 이용한 정적 크롤링
    • Selenium을 이용한 동적 크롤링
    • OpenAPI를 이용한 데이터 접근 및 수집
  • XML 형식 데이터의 수집과 처리
import requests 
import pandas as pd
from bs4 import BeautifulSoup 
 
url1 = 'http://apis.data.go.kr/B553530/BEEC/BEEC_01_LIST?serviceKey=' 
key = 'RRDg18a7noGpfK%2F1rmFBRX8ms0%2BbAL0PO1VqCEhrWak%2BKISmaIZf%2BcHsT2FMSFtFnm%2FvLNlPtBrNZoWdTt6jfA%3D%3D' 
url2 = '&apiType=XML&q1=2022&q2=2022&q3=1&q4=1&q5=9' 

url = url1 + key + url2 

result = requests.get(url) 
result = result.content 

soup = BeautifulSoup(result, 'lxml-xml')
soup

df = pd.read_xml(result, xpath='.//item')
df

 

 

  • JSON 형식 데이터의 수집과 처리
import requests 
import json 
 
url1 = 'http://apis.data.go.kr/B553530/BEEC/BEEC_01_LIST?serviceKey=' 
key = 'RRDg18a7noGpfK%2F1rmFBRX8ms0%2BbAL0PO1VqCEhrWak%2BKISmaIZf%2BcHsT2FMSFtFnm%2FvLNlPtBrNZoWdTt6jfA%3D%3D' 
url2 = '&apiType=JSON&q1=2022&q2=2022&q3=1&q4=1&q5=9' 

url = url1 + key + url2 

result = requests.get(url) 
result = result.json() 
result