python/도구

공공데이터포털 데이터를 mysql에 넣기

자코린이 2022. 8. 9. 22:15

일단 기상청 데이터를 받아오기 위해 공공데이터 포털에 접속하여 회원가입과 로그인을 합니다.

https://www.data.go.kr/index.do

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

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/

 

Tutorial: Inserting Records and DataFrames Into a SQL Database

Master the art of the SQL Insert to add data to SQL and MySQL databases using SQL queries, as well as from within Python, and when using pandas.

www.dataquest.io

https://hongjuzzang.github.io/howto/dataframe_to_mysql/

 

pandas Dataframe을 mysql에 저장하기

Jupyter에서 DataFrame을 mysql에 넣기

hongjuzzang.github.io

https://signing.tistory.com/22?category=357604 

 

[API]기상청 api로 데이터 가져오기 2 in Python(feat. 동네예보 - 초단기실황)

1. 활용신청 아래의 URL로 접속하여 활용신청을 한다. https://www.data.go.kr/dataset/15000099/openapi.do 공공데이터포털 국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관

signing.tistory.com

 

'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