일단 기상청 데이터를 받아오기 위해 공공데이터 포털에 접속하여 회원가입과 로그인을 합니다.
https://www.data.go.kr/index.do
1. 로그인 후 활용신청을 눌러줍니다.
2. 활용 승인이 나오면 아래 창을 참조합니다.
1) 참조 문서를 참조 하여 원하는 곳의 x,y 좌표를 확인합니다.
2) 일반 인증키를 복사합니다.
3) 초단기 실황조회의 확인 버튼을 누릅니다.
3. 아래 창에 값을 넣고 미리보기를 누릅니다.(servicekey는 복사한 키입니다.)
4. 결과 확인
5. python 코딩
from urllib.request import urlopen
from urllib.parse import urlencode, unquote, quote_plus
import urllib
import requests
import json
import pandas as pd
import pymysql
from sqlalchemy import create_engine
import datetime
import time
while True:
#current date
currentTime = datetime.datetime.now()
date = str(currentTime.strftime('%Y%m%d'))
#last 1 hour
#데이터가 정각에 안 들어오고 시간이 좀 걸린다. 이를 방지하기 위해 1시간 전으로 설정
#아니면 try걸어서 넘겨준다.
lastHourDateTime = datetime.datetime.now() - datetime.timedelta(hours = 1)
hour = str(lastHourDateTime.strftime('%H'.zfill(2)))
# Setting for URL parsing
CallBackURL = 'https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst'
params = '?' + urlencode({
quote_plus("serviceKey"): "privateKey", # 인증키
quote_plus("numOfRows"): "10", # 한 페이지 결과 수 // default : 10
quote_plus("pageNo"): "1", # 페이지 번호 // default : 1
quote_plus("dataType"): "JSON", # 응답자료형식 : XML, JSON
quote_plus("base_date"): date, # 발표일자 // yyyymmdd
quote_plus("base_time"): hour + "00", # 발표시각 // HHMM, 매 시각 40분 이후 호출
quote_plus("nx"): "57", # 예보지점 X 좌표
quote_plus("ny"): "77" # 예보지점 Y 좌표
})
# URL parsing
req = urllib.request.Request(CallBackURL + unquote(params))
# Get Data from API
response_body = urlopen(req).read() # get bytes data
# Convert bytes to json
data = json.loads(response_body)
# Result
df = pd.DataFrame(data['response']['body']['items']['item'])
#DB connect
db_connection_str = "mysql+pymysql://{user}:{pw}@127.0.0.1/{db}".format(user="user",pw="passwd",db="DBname")
db_connection = create_engine(db_connection_str)
conn = db_connection.connect()
#insert data
#if table exists, add panda data into table
df.to_sql(name='table name', con=db_connection, if_exists='append',index=False)
print("done")
#wait 1 hour
time.sleep(3600)
여기까지 하시면 mysql에 데이터가 들어가는 것을 확인 할 수 있습니다.
(수정본)
from urllib.request import urlopen
from urllib.parse import urlencode, unquote, quote_plus
import urllib
import requests
import json
import pandas as pd
import pymysql
from sqlalchemy import create_engine
import datetime
import time
while True:
#current date
currentTime = datetime.datetime.now()
date = str(currentTime.strftime('%Y%m%d'))
#last 1 hour
lastHourDateTime = datetime.datetime.now() - datetime.timedelta(hours = 1)
hour = str(lastHourDateTime.strftime('%H'.zfill(2)))
# Setting for URL parsing
CallBackURL = 'https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst'
params = '?' + urlencode({
quote_plus("serviceKey"): "", # 인증키
quote_plus("numOfRows"): "10", # 한 페이지 결과 수 // default : 10
quote_plus("pageNo"): "1", # 페이지 번호 // default : 1
quote_plus("dataType"): "JSON", # 응답자료형식 : XML, JSON
quote_plus("base_date"): date, # 발표일자 // yyyymmdd
quote_plus("base_time"): hour + "00", # 발표시각 // HHMM, 매 시각 40분 이후 호출
quote_plus("nx"): "57", # 예보지점 X 좌표
quote_plus("ny"): "77" # 예보지점 Y 좌표
})
# URL parsing
req = urllib.request.Request(CallBackURL + unquote(params))
# Get Data from API
response_body = urlopen(req).read() # get bytes data
# Convert bytes to json
data = json.loads(response_body)
item = data['response']['body']['items']['item']
conn = pymysql.connect(host='127.0.0.1', user='user', password='passwd', db='DBname', charset='utf8')
cursor = conn.cursor()
sql = "INSERT INTO tableName (baseDate, baseTime, category, nx, ny, obsrValue) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}')"
for list in item:
cursor.execute(sql.format(list.get("baseDate"), list.get("baseTime"), list.get("category"), list.get("nx"), list.get("ny"), list.get("obsrValue")))
conn.commit()
conn.close()
print("done")
#wait 1 hour
time.sleep(3600)
전에 만든 panda를 사용하는 코드는 테이블 구조를 변경하기 힘들어서 수정하였습니다.
도움이 되셨으면 합니다. :)
참조 :
https://www.dataquest.io/blog/sql-insert-tutorial/
https://hongjuzzang.github.io/howto/dataframe_to_mysql/
https://signing.tistory.com/22?category=357604
'python > 도구' 카테고리의 다른 글
가비아 sms 최종 소스 (0) | 2022.12.07 |
---|---|
가비아 sms 서비스 구축 (0) | 2022.12.07 |
python 에서 원격으로 폴더 생성(paramiko) (0) | 2022.07.22 |
python 파일 삭제 (0) | 2022.07.22 |
Thread 생성 (0) | 2022.07.21 |