웹스크레이핑 라이브러리인 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를 사용한다.(반대 개념)
다음 글에서는 프롬프트창에 직접 입력해서 그 지역의 날씨 데이터를 가져오는 방식에 대해 설명.
'언어 > Python' 카테고리의 다른 글
Beautiful Soup 사용하여 html 분석하기 (0) | 2020.09.07 |
---|---|
기상청 날씨 데이터 cmd창에서 직접 불러오기 (0) | 2020.09.05 |
파이썬을 이용한 웹데이터 다운로드하기2_urlopen() 함수 (0) | 2020.08.28 |
파이썬을 이용한 웹데이터 다운로드하기1_urlretrieve()함수 (0) | 2020.08.28 |
머신러닝 개념과 파이썬 기초 문법 (0) | 2020.08.26 |