dev

14. 파이썬으로 공공데이터 날씨 데이터 가져오기 예제

뫼B우스 2023. 4. 19. 14:45
반응형

Vue3 + D3.js 지도에 날씨 정보를 표현하기 위해서는 기상청 공공데이터를 가져와야 한다.

 

앞서 내용에서 파이썬으로 공공데이터를 가져오는 예제는 소개하지 않아 초보자를 위해 예제 코드를 소개한다.

 

아래 코드에서 없어질 내용들이 존재하지만, 게을러 코드 최적화는 하지 않았다.

제일 중요한 것은 '죽지 않고 돌아가면 된다' 

 

사용한다면 사용자가 알아서 최적화하여 사용하면 될 것 같다.

 

import mysql.connector

import time

def getWeather(x,y):

	from urllib.request import Request, urlopen
	from urllib.parse import urlencode, quote_plus
	import xml.dom.minidom

	from xml.etree import ElementTree as etree
	import datetime
	conn =  mysql.connector.connect(
	    	host="127.0.0.1",
    		user="root",
    		password="암호",
    		database='디비명'
	)

	d = datetime.datetime.now()
	qtime = d-datetime.timedelta(hours=1)
	strdate = qtime.strftime("%Y%m%d")
	strtime = qtime.strftime("%H00")

	strdate = d.strftime("%Y%m%d")
	strtime = d.strftime("%H00")
	print(strtime)
	
	xPos = str(x)
	yPos = str(y)


	url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst'   
	queryParams = '?' + urlencode({ quote_plus('ServiceKey') : '서비스키',                 
                quote_plus('pageNo') : '1', 
                quote_plus('numOfRows') : '10', 
                quote_plus('dataType') : 'XML', 
                quote_plus('base_date') : strdate, 
                quote_plus('base_time') : strtime, 
                quote_plus('nx') : xPos, 
                quote_plus('ny') : yPos })

	request = Request(url + queryParams)
	request.get_method = lambda: 'GET'
	response_body = urlopen(request).read()

	xml = xml.dom.minidom.parseString(response_body)
	pretty_xml_as_string = xml.toprettyxml()
	tree = etree.fromstring(pretty_xml_as_string)
	result = tree.findall(".//item")
	catagory = [x.findtext(".//category") for x in result]


	values = [x.findtext(".//obsrValue") for x in result]
	print(values)
	with conn.cursor() as cur :
		sql="insert into weather_real values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);"
		cur.execute(sql, (xPos, yPos, strdate, strtime, str(values[0]), str(values[1]), str(values[2]), str(values[3]), str(values[4]), str(values[5]), str(values[6]), str(values[7])))
		conn.commit()

	conn.close()


if __name__ =='__main__':

	getWeather(60, 127) #seoul

 

위 코드와 같이 기상청 공공데이터를 가져오기 위해 위치 정보가 있어야 한다. 

 

xPos, yPos 가 해당하는 값인데, 이것은 경도위도의 데이터 값이 아니기 때문에

기상청 위치정보 테이블을 참고해야 한다. (자세한 내용은 GIS 전문가가 아니니 검색하여 찾아보길 권한다.)

위치 정보는 가이드 라인 문서에 엑셀로 존재하니 참고하길 바란다.

위 코드는  xPos, yPos이 서울 위치로 고정하여 사용하였다.

 

위치 정보, 날짜, 시간, 응답파일 포맷 정보를 request에 데이터를 넣고 쿼리하면 요구한 파일 포맷으로 응답을 준다.

 

xml 파일에서 원하는 데이터를 추출하여 데이터베이스에 insert 한다.

 

그럼 공공데이터를 가져와 로컬 데이터베이스에 저장하는 것까지 완료하게 된다.

 

자세한 내용은 인터넷 안에 넘쳐나기 때문에 하지 않기로 한다.

 

다양한 예제 코드가 많이 존재하기 때문에 자신이 원하는 코드를 사용하면 된다.

 

마지막으로 주위할 것은 요청시 파라미터 값과 인증키 값을 정확히 넣어줘야 한다.

 

버전에 따라 오류가 발생할 수 있으니  python3 이상에서 사용하면 된다.

 

다른 공공데이터도 위의 코드를 기본으로 약간의 수정으로 가져올 수 있다. 

 

반응형