[Alex] 데이터 장인의 블로그

[Python] - 공공데이터 api 크롤링(날씨데이터 수집) 본문

Python

[Python] - 공공데이터 api 크롤링(날씨데이터 수집)

Alex, Yoon 2020. 4. 25. 18:26

얼마전까지 수행하던 프로젝트에서 VAN사에 속한 가맹점의 날씨에 대한 매출분석을 진행해 본 적이 있습니다.

날씨에 대한 매출 영향도나 제가 기대했던 의미있는 결과들이 나타나지는 않았지만 날씨에 대한 데이터를 이용하여 분석을 시도하는 경우가 많을 것 같아 api를 활용하여 날씨 데이터를 가져올 수 있도록 python script를 짜보았습니다. 

스크립트를 짜기 전에 우선 api 사용을 위한 서비스 활용 신청이 필요합니다. 

지상(종관, ASOS) 일자료 조회서비스



로그인 이후, 활용신청이 승인되면 아래처럼 고유 계정 인증키가 발급됩니다. 


여기서 저는 기상관측 일자료목록 조회서비스를 활용할 예정입니다. 

 

python을 켭니다. 전 anaconda 환경의 jupyter notebook을 사용하였습니다.

 

1. 사용할 라이브러리를 불러옵니다. 

import pandas as pd
import json
import requests
from bs4 import BeautifulSoup

 

 

2. api를 호출하기위한 url과 필수, 선택 파라미터를 입력해줍니다. 

발급받은 key, 데이터 형식, 데이터를 살펴볼 지역 등 여러가지 정보들을 입력해줍니다. 저는 서울특별시의 2018년도 6월 부터 최근까지의 데이터를 가져오겠습니다. 

url = 'http://apis.data.go.kr/1360000/AsosDalyInfoService/getWthrDataList'

queryParams = '?' + \
              'ServiceKey=' + '발급받은 key' + \
              '&pageNo='+ '1' + \
              '&numOfRows='+ '999' + \
              '&dataType='+ 'JSON' + \
              '&dataCd='+ 'ASOS' + \
              '&dateCd='+ 'DAY' + \
              '&startDt='+ '20180601' + \
              '&endDt='+ '20200421' + \
              '&stnIds='+ '108' # \

+) 파라미터 정보는 활용가이드 파일 or 오픈api 상세정보 등에서 살펴볼 수 있습니다. 


3. api 호출을 위한 최종작업이 끝났습니다. 혹, 작동이 되는지 확인하고 싶다면 url 창에 해당하는 api 주소를 입력해보는 것도 하나의 방법이라 할 수 있습니다. 

url + queryParams # 확인

 

4. get 방식으로 api를 호출한 이후 json 형태로 변환해줍니다. 저희에게 가장 익숙한 데이터 형태로 변형시켜줍니다. 

result = requests.get(url + queryParams)
js = json.loads(result.content)
data = pd.DataFrame(js['response']['body']['items']['item'])

 

5. 결과로 나타내지는 column의 양이 너무 많군요! 저는 최대온도, 평균 온도, 강수량, 바람 등의 정보만 가져오겠습니다. 

li = ['stnId','tm','avgTa','minTa','maxTa','sumRn','maxWs','avgWs','ddMes']

data.loc[:,li]

 

6. 저는 csv 파일로 저장시켜 놓겠습니다. 

data[li].to_csv("weather.csv",index=False )

 

 

FULL 스크립트 입니다. 

import pandas as pd
import json
import requests
from bs4 import BeautifulSoup

url = 'http://apis.data.go.kr/1360000/AsosDalyInfoService/getWthrDataList'

queryParams = '?' + \
              'ServiceKey=' + '개인 발급 KEY'+ \
              '&pageNo='+ '1' + \
              '&numOfRows='+ '999' + \
              '&dataType='+ 'JSON' + \
              '&dataCd='+ 'ASOS' + \
              '&dateCd='+ 'DAY' + \
              '&startDt='+ '20180601' + \
              '&endDt='+ '20200421' + \
              '&stnIds='+ '108' # \ 뒤에 공백 금지

result = requests.get(url + queryParams)
js = json.loads(result.content)
data = pd.DataFrame(js['response']['body']['items']['item'])

li = ['stnId','tm','avgTa','minTa','maxTa','sumRn','maxWs','avgWs','ddMes']

data.loc[:,li]

data[li].to_csv("weather.csv",index=False )

 

반응형
Comments