본문 바로가기
C++ 200제/코딩 IT 정보

파이썬, 기상청 xml 데이터 가져와서 날씨 뿌리기 (rss 파싱)

by vicddory 2019. 6. 16.

기상청에서 공개하는 xml 데이터 이용하여 날씨 정보 알아낼 수 있습니다. 기상청 날씨누리 인터넷 RSS 페이지로 이동하면 되는데요. 파이썬에서 사용할 링크는 아래에 있습니다.


[기상청] 서비스 인터넷


파이썬 기상청 데이터 가져오기[우리동네날씨] 기상청 관측 자료

기상청 xml 데이터 가져와서 날씨 뿌리기 하려면, 위 그림처럼 전국, 또는 도道별 RSS 정보를 얻어야 합니다.


가령, 전국 URL은 http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108 입니다. 지역은 stnid= 뒤 3자리로 분리됩니다.


중기예보 지역별 코드

 전국 108

 서울, 경기도

 109

 강원도

 105

 충청북도

 131

 충청남도

 133

 전라북도

 146

 전라남도

 156

 경상북도

 143

 경상남도

 159

 제주도

 184


파이썬에서 위의 지역별 코드와 기타 전체 URL 링크를 이용하면 기상청 xml 데이터 가져와서 날씨 뿌리기 가능합니다.


먼저, 전국 날씨를 텍스트로 출력하는 예제 소스 코드와 결과 살펴보겠습니다.


◆ 기상청 xml 데이터 가져와서 날씨 뿌리기 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import urllib.request, re
 
url      = 'http://www.kma.go.kr/weather/forecast/'\
           'mid-term-rss3.jsp?stnId=108'
 
ufile    = urllib.request.urlopen(url)
contents = ufile.read().decode('utf-8')
 
locations = re.findall(r'<location wl_ver="3">.+?</location>',
                       contents, re.DOTALL)
 
for loc in locations:
    province = re.search(r'<province>(.+)</province>', loc)
    city     = re.search(r'<city>(.+)</city>', loc)
 
    print(province.group(1))
    print(city.group(1))
 
    data = re.findall(r'<data>.+?</data>', loc, re.DOTALL)
 
    for item in data:
        mode = re.search(r'<mode>(.+)</mode>', item)
        tmEf = re.search(r'<tmEf>(.+)</tmEf>', item)
        wf   = re.search(r'<wf>(.+)</wf>', item)
        tmn  = re.search(r'<tmn>(.+)</tmn>', item)
        tmx  = re.search(r'<tmx>(.+)</tmx>', item)
        reli = re.search(r'<reliability>(.+)</reliability>', item)
 
        print('   ', mode.group(1), tmEf.group(1), wf.group(1),
              tmn.group(1), tmx.group(1), reli.group(1))
cs


■ 결과


파이썬, 기상청 xml 데이터 가져와서 날씨 뿌리기 (rss 파싱)[우리동네날씨] 기상청 관측 자료


파이썬 기상청 xml[기상청 rss 파싱]


서울에서 제주도까지 전국 날씨 예보 정보를 가져올 수 있습니다.

◆ 충청북도 날씨 예보만 보기 (지역코드 사용법)

기상청 xml 데이터 가져와서 날씨 뿌리기 할 때, 충청북도 정보만 보고 싶다면 어떻게 해야 할까요?


위 파이썬 예제 코드 4번 라인 맨 뒤에 stnId를 108에서 131로 변경하면 됩니다. 지역별로 조회하면 대도시 외에 소도시들도 조회 됩니다. 전국은 광역시, 도별 대도시가 나오지만, 지역별 조회하면 해당 지역 중소도시 날씨 정보도 나옵니다.


충청북도 조회하면 12개 지역 정보가 나와요.


청주, 충주, 영동, 진천, 음성, 제천, 단양, 보은, 괴산, 중평, 추풍령, 옥천


■ 결과


파이썬 python 기상청 데이터[우리동네날씨] 기상청 관측 자료


◆ 추가 정보 1

추가로 다른 파이썬 출력 방법 더 소개합니다.


1
2
3
4
5
6
7
8
9
import urllib.request, re
 
url      = 'http://www.kma.go.kr/weather/forecast/'\
           'mid-term-rss3.jsp?stnId=108'
 
ufile    = urllib.request.urlopen(url)
contents = ufile.read().decode('utf-8')
 
print(contents)
cs


■ 결과


python 날씨 데이터 파싱[우리동네날씨] 기상청 관측 자료


파일을 읽어 9번 라인에서 바로 출력하면, 위 그림처럼 전체 xml 데이터가 출력됩니다.

◆ 추가 정보2

<province> 기준으로 출력하면 시도별 지역을 그룹지어 출력할 수도 있습니다.


1
2
3
4
5
6
7
8
9
10
import urllib.request, re
 
url      = 'http://www.kma.go.kr/weather/forecast/'\
           'mid-term-rss3.jsp?stnId=108'
 
ufile    = urllib.request.urlopen(url)
contents = ufile.read().decode('utf-8')
 
provinces = re.findall(r'<province>(.+)</province>', contents)
print(len(provinces), provinces)
cs


■ 결과


파이썬 rss 파싱 방법[기상청 rss 파싱]


좀 더 보기 좋게 편집하려면 파이썬 for 반복문을 사용합니다. 기상청 xml 데이터 가져와서 날씨 뿌리기할 때 이처럼 다양하게 제어할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
import urllib.request, re
 
url      = 'http://www.kma.go.kr/weather/forecast/'\
           'mid-term-rss3.jsp?stnId=108'
ufile    = urllib.request.urlopen(url)
contents = ufile.read().decode('utf-8')
 
locations = re.findall(r'<location wl_ver="3">.+?</location>',
                       contents, re.DOTALL)
 
for loc in locations:
     province = re.search(r'<province>.+</province>', loc)
     print(province.group())
cs


■ 결과


python 기상청 rss 파싱[우리동네날씨] 기상청 관측 자료


세로로 출력되니 훨씬 보기 좋네요.


여기까지, Python 이용해서 기상청 xml 데이터 가져와서 날씨 뿌리기 였습니다.



관련 글


파이썬 이미지 예제10개 PIL Enhance, Ops


파이썬 이미지 PIL, 크기 조절, 필터, 화면 캡쳐 소스 11개


파이썬 예외 처리(Try except) 기본 문법 2가지


#기상청xml데이터가져와서날씨뿌리기 #기상청xml #기상청데이터가져오기



ⓒ written by vicddory

댓글