본문 바로가기
Tech Story/IoT

파이썬으로 공공데이터 API XML 파싱후 DB저장하기

파이썬으로 공공데이터 API XML 파싱후 DB저장하기


#!/usr/bin/python

#-*- coding: utf-8 -*-

# 공공데이터 포털사이트에서 지역별로 미세먼지 데이터를 시간대별로 API제공 - 인코딩되어 한글이 변환되어 보여진다

# http://tech.leotek.co.kr/2017/04/11/공공데이터포털-한국환경공단-대기오염-api/

# 에어코리아에서 제공해주는 시간별 미세먼지 측정값 XML형식 / %EC%A2%85%EB%A1%9C%EA%B5%AC=종로구

#url = "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?stationName=종로구&dataTerm=month&pageNo=1&numOfRows=10&ServiceKey=u4Q%2FF%2BzFS1PHRIhVj2cJcxGP8J%2B5vOxCbaO039frcCGDEuD2km6rhbR2wZrwBrZtlLu2Z%2FbsqMHDVVGHwkq8ow%3D%3D&ver=1.3"

# 에어코리아에서 제공해주는 시간별 미세먼지 측정값 JSON형식 %EC%A2%85%EB%A1%9C%EA%B5%AC=종로구

#url = "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?stationName=종로구&dataTerm=month&pageNo=1&numOfRows=10&ServiceKey=u4Q%2FF%2BzFS1PHRIhVj2cJcxGP8J%2B5vOxCbaO039frcCGDEuD2km6rhbR2wZrwBrZtlLu2Z%2FbsqMHDVVGHwkq8ow%3D%3D&ver=1.3&_returnType=json"


import xml.etree.ElementTree as ET

import urllib2

import datetime

import time

import sys

import pymysql

import random

now = time.localtime()


# 미세먼지 센서에서 갖고오는 값은 우선 랜덤함수를 이용하여 데이터를 수집한다.

# 추후에 데이터를 수신하여 변수값으로 지정하여 데이터를 생성

from random import *

chkpmValue = uniform(20.0,35.0)


# 현재 나짜를 갖고오는 함수이며, 현재 미세먼지 센서를 통해서 갖고 오는 값을 저장할 때 

# API에서 제공되는 XML 데이터중 해당 시간대와 맞는 데이터를 갖고 오기 위한 작업

#CurrentTime = datetime.datetime.now()

CurrentTime = "%04d-%02d-%02d %02d:00" % (now.tm_year, now.tm_mon, now.tm_mday, 

now.tm_hour)


# AirKorea에서 공식적으로 제공하는 종로구의 시간대별 미세먼지 측정 API 

# 많은 데이터를 제공하고 있지만 여기서는 pm10과 pm25 값 만을 활용

url = "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/

getMsrstnAcctoRltmMesureDnsty?stationName=%EC%A2%85%EB%A1%9C%EA%B5%AC&dataTerm=m

onth&pageNo=1&numOfRows=10&ServiceKey=u4Q%2FF%2BzFS1PHRIhVj2cJcxGP8J%2B5vOxCbaO0

39frcCGDEuD2km6rhbR2wZrwBrZtlLu2Z%2FbsqMHDVVGHwkq8ow%3D%3D&ver=1.3"


tree = ET.ElementTree(file=urllib2.urlopen(url))

root = tree.getroot()


# 함수를 이용하여 해당되는 값이 있을 때만 데이터베이스에 저장한다

def db_insert(a, b, c) :

    # DB Connect

    conn = pymysql.connect(host='localhost', user='ID', password='PASSWD',db='mysql', charset='utf8')

    curs = conn.cursor()


    sql = """insert into dust(drone_id, dust_id, gps_id, chkpmValue, pm25Value, pm10Value, datecreated) values('drone01', 'dust01', 'Eulgiro4ga', %s, %s, %s, now())""";

    curs.execute(sql, (a, b, c))

    conn.commit()

    conn.close()

    sys.exit(1)


# 현재 날짜를 불러와서 날짜가 존재하면 측정값을 실행한다

#print CurrentTime

if CurrentTime > 0 :


    for i in root.iter("item") :

        i.dataTime = i.findtext("dataTime")

        if i.dataTime == CurrentTime :                 # API에서 제공하는 값이 현재 시간하고 맞는 시간대가 존재할 때 측정값을 처리

            i.pm10Value = i.findtext("pm10Value")

            i.pm25Value = i.findtext("pm25Value")

            #print i.dataTime, i.pm10Value, i.pm25Value


       if i.pm10Value > 0 and i.pm25Value >0 :      # 정상적인 값이 존재할 때 수행

        a = db_insert(chkpmValue, i.pm25Value, i.pm10Value)     # 함수를 호출하여 수행

            else :

                sys.exit(1)

else :

    sys.exit(1)


else :

    sys.exit(1)



[관련파일]

https://github.com/e3jake/DustProject



End of Posting