[공공데이터 API]날씨 데이터 수집

hugingstar·2022년 7월 25일
0
post-thumbnail
  • 단기예보 공공데이터 API를 사용해서 날씨 데이터를 취득하는 방법에 대해서 알아보았다.
  • 단기예보 조회서비스 활용 신청하면 참고문서를 확인할 수 있다.
  • 먼저 단기예보 데이터 중에서 '초단기실황조회'를 해보기로 했다.
  • Callback URL주소에 초단기실황조회를 쓴다.(표에서 getUltraSrtNcst을 사용하면 된다.)
http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst
  • 활용 가이드를 확인해보니 몇가지의 파라미터들을 지정해주고 사용하면되는 듯 하다. 아래를 보면, 파라미터 8개를 설정했다.
self.params = {
            'serviceKey': self.serviceKey,
            'base_date' : self.base_date,
            'base_time' : self.base_time,
            'nx' : self.nx,
            'ny' : self.ny,
            'pageNo' : '1',
            'numOfRows' : '1000',
            'dataType' : 'JSON'
        }
  • 날씨데이터는 매시간 30분에 생성되고 40분부터 API로 제공 받아 수집할 수 있다.
  • Schedule 모듈은 minutes 함수를 사용해서 한시간에 한번씩 getWeather 함수를 실행시킬 수 있다.
#매 60분 마다 get.Weather 함수 실행
schedule.every(60).minutes.do(self.getWeather)
  • requests 모듈을 사용해서 Sentence를 json 형태로 소스를 크롤링 해보았다. 그리고 데이터프레임으로 저장을 했다.
  • (Sentence는 기술문서를 보면 어떤 요청메시지 칸에 적혀있다.)
self.Sentence = '{}?serviceKey={}&base_date={}&base_time={}&nx={}&ny={}&numOfRows={}&dataType={}'\
            .format(self.url, self.params['serviceKey'], self.params['base_date'], self.params['base_time'],
                    self.params['nx'], self.params['ny'], self.params['numOfRows'], self.params['dataType'])
response = requests.get(self.Sentence).json()
df = pd.DataFrame(response['response']['body']['items']['item'])
print(df)
  • 날씨 데이터 취득 클래스
import requests
import datetime
import time
import pandas as pd
import schedule

class WeatherCallBack:
    def __init__(self):
        now = datetime.datetime.now()

        "Identification information"
        self.url = 'Callback URL 입력'
        self.serviceKey ='서버 키 입력'

        "Site information"
        self.nx = 100
        self.ny = 90

        "Acquisition time"
        self.base_date = '{}{:0>2}{:0>2}'.format(now.year, now.month, now.day)
        self.base_time = '{:0>2}00'.format(int(now.hour)-1)

        print(self.base_date, self.base_time)
        #매 60분 마다 get.Weather 함수 실행
        schedule.every(60).minutes.do(self.getWeather)

        num = 0
        while True:
            print(num)
            num += 1
            schedule.run_pending()
            time.sleep(60) # 60 초 슬립(60초(1분)당 숫자 1이 올라감, 0부터 59까지 나오면 함수가 실행됨)

    def getWeather(self):
        self.params = {
            'serviceKey': self.serviceKey,
            'base_date' : self.base_date,
            'base_time' : self.base_time,
            'nx' : self.nx,
            'ny' : self.ny,
            'pageNo' : '1',
            'numOfRows' : '1000',
            'dataType' : 'JSON'
        }

        self.Sentence = '{}?serviceKey={}&base_date={}&base_time={}&nx={}&ny={}&numOfRows={}&dataType={}'\
            .format(self.url, self.params['serviceKey'], self.params['base_date'], self.params['base_time'],
                    self.params['nx'], self.params['ny'], self.params['numOfRows'], self.params['dataType'])
        response = requests.get(self.Sentence).json()
        df = pd.DataFrame(response['response']['body']['items']['item'])
        print(df)

WeatherCallBack()

0개의 댓글