언어/Python

기상청 날씨 데이터불러오기

뭉지(moonz) 2020. 9. 5. 12:09
반응형

웹스크레이핑 라이브러리인 Beautiful soup 를 활용하기전에!

파이썬 언어로 직접 데이터를 가져오는 방법을 공부해보자.

 데이터를 전송하는 방식 : post / get

Post 방식 ; header에 붙여서 전송

get방식 ; url을 통해 전송 (url 뒤에 구분자(?, &) 이용해서 server에 요청하는 방식)

▶이번에 우린 get 방식을 이용할 것이다.

 

기상청 사이트에서 데이터를 추출하는 방법

---------------------------------------------------------------------------------------------------------------------------------

 

▶기상청 사이트에 있는 배너 같은 필요없는 것들은 추출할 필요 없음.

rss 서비스 ; 이미지 파일들을 제외한 축약된 형태의 텍스트 데이터 제공 서비스

https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp

여기로 들어가게 되면, 전국 날씨의 정보를 포함하는 html이 제공됨.

여기서 우린 태그들을 제외한 내용들만을 가져와야 한다.

▶기상청에서 지정한 지역번호(stnId)가 있는데, 그것을 url 뒤에 덧붙이면 각 지역별 날씨정보를 출력함.

if) 충청남도 관련 지역 날씨만 가져오길 원하면, ?stnId=133 을 덧붙여준다.

  • 대소문자를 구분해야한다.( stnId )
  • 108번은 전체 지역번호, 109번은 서울/경기도 105번은 강원도, 159번은 경상남북도

server에 변수값을 전송하고자 할 때, url 뒤에 구분자와 함께 변수를 덧붙인다.

  • 첫 변수 앞에는 ? 구분자. 두 번째 변수 앞에는 & 구분자 이용. Ex) ? stnId=133 & a = ‘ ‘

      ->서버에 stnId=133에 해당하는 데이터와 a값을 함께 전달.

 

[충청남도 날씨 출력]

server에 있는 jsp 스크립트 파일에서 stnid=133이란 값(충청남도를 의미)에 해당하는 데이터만을 화면에 보여주는 것.


자!! 파이썬 언어를 이용하여 rss서비스에서 제공하는 데이터를 그대로 가져오는 과정을 해보자.

**파이썬에서 문자열은 유니코드로 처리.

**인코딩 ; 문자열(유니코드)을 바이트코드로 변환

**디코딩 ; 바이트코드를 문자열로 변환

 

[순서]

1. 웹상에서 데이터를 읽어오거나 인코딩하기위한 모듈을 import한다.

2. 우선 전국날씨 데이터의 url을 변수에 저장한다.

3. 여러 지역별 코드가 있기 때문에 딕셔너리를 이용하여 값을 저장한다.

4. 그 딕셔너리를 인코딩하고 인코딩한 값을 변수 params에 저장한다.

5. 전국 날씨 url에 지역날씨 변수 params를 덧붙여서 다시 변수에 저장한다.

6. 그것을 프린트하면 '전국날씨 ? 지역변수' 식으로 출력된다.

(메모장은 .py 확장형으로 저장하면 된다.)

 

더보기

[복사용]

import urllib.request	#웹 상에서 데이터를 읽어올 때 쓰는 모듈 request
import urllib.parse	#url을 인코딩(파씽 작업)할때 쓰는 모듈 parse

rssUrl = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp"	#전국날씨 rss서비스페이지의  URL
#우선 전국날씨 URL을 변수에 넣어놓고 필요한 지역날씨변수를 덧붙이는 식으로.

values = {
	'stnId':'105'
}

params = urllib.parse.urlencode(values)		#values 값을 인코딩하여 변수 params에 저장.

url = rssUrl + "?" + params		#강원도 날씨를 불러오기위한 URL을 변수에 저장.
print("url=",url)

cmd에서 확인해보면 마지막 print문까지 잘 실행되어 url주소가 출력되는 것을 확인할 수 있다.

 

이제 다시 메모장으로 돌아와서, 메모리상에 있는 데이터를 디코딩한 후 읽어오는 문장을 써보자.

 

=======이제 데이터를 출력할 차례==========

7. 전국날씨 url변수를 read()하면 그 url변수를 통해 데이터를 메모리상에서 읽어온다.

8. decode로 출력할때의 형식 지정하면서 문자열로 변환.

 

더보기

[복사용]

data = urllib.request.urlopen(url).read()	#url을 통해 데이터를 메모리상에서 읽어온다.
text = data.decode("utf-8")	#utf-8 형식으로 디코딩하여 문자열을 text변수에 저장.

print(text)

 

▶stnId 코드 ; 108 전국 / 109 서울&경기도 / 105 강원도 / 131 충청북도 / 133 충청남도 / 146 전라북도 / 156 전라남도 / 143 경상북도 / 159 경상남도 / 184 제주도

 

이렇게 메모장에 입력 후, cmd창에서 'python ex03.py' 라고 치게 되면 이와같은 결과가 출력된다.

▶[결과]

데이터를 읽어들일 때 encode를 사용했다면, 데이터를 화면에 출력할때는 decode를 사용한다.(반대 개념)

 

다음 글에서는 프롬프트창에 직접 입력해서 그 지역의 날씨 데이터를 가져오는 방식에 대해 설명.

반응형