python 기상청 RSS 데이터 파싱하기

Jeongkuk Seo
sjk5766
Published in
4 min readJan 26, 2019

웹 크롤링을 통해 데이터를 추출할 때, 가장 많이 언급되는 언어는 python 입니다. 아무래도 라이브러리가 잘 되어 있어 쉽게 구현할 수 있기 때문인 것 같습니다. RSS는 블로그나 홈페이지의 변경정보를 xml 형식으로 제공하는 것을 의미합니다. 기상청의 RSS 정보를 파싱하는 예제를 정리하도록 하겠습니다.

http://www.weather.go.kr/weather/lifenindustry/sevice_rss.jsp 사이트에 접속하면 아래와 같이 각 지역별 기상정보를 RSS로 확인할 수 있습니다.

이 중 서울 경기도의 RSS 버튼을 클릭해보면 복사하라는 팝업창이 나올텐데 확인 버튼을 눌러보면 다음과 같이 xml 형식의 웹 페이지가 제공됩니다.

url을 wget으로 다운로드 받아보겠습니다. -O 옵션은 다운로드 할 파일의 이름을 지정합니다.

wget http://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109 -O rss.xml

xml 형식이기 때문에 python 에서 xml을 파싱할 수 있는 xml 모듈을 import 하도록 하겠습니다.

from xml.etree import ElementTree   # xml 파싱 모듈 importtree = ElementTree.parse(“rss.xml”) # 기상청 정보를 xml 형식으로 파싱
root = tree.getroot() # xml의 root 요소를 추출
print(root)

위 코드를 간단 요약하자면 xml 데이터를 파싱할 수 있는 모듈을 불러온 뒤 저장해 놓은 rss.xml 파일을 읽어 파싱한 tree 구조에서 root 부분을 읽어 root에 저장한 것 뿐입니다. 실행해보면

[root@localhost test]# python test.py
<Element ‘rss’ at 0x7fe3b5f992c8>

위와 같이 에러나 빈 데이터 없이 정상적으로 진행되는 것을 확인할 수 있습니다. 이제 rss.xml 데이터를 보고 어떤구조로 되어있고 저는 어떻게 데이터를 추출하면 될지 살펴보겠습니다.

캡쳐도구로 캡쳐하니 영 모양이 안사네요. 맨 위의 두 줄은 xml, rss 정보를 보여줄 뿐이고 우리가 처음 접근해야 할 부분은 channel 하위 item, description 을 거쳐 body ,location, data로 가야합니다. 소스상에서는 다음과 같이 각 depth에 접근할 수 있습니다.

root.findall(“channel/item/description/body/location/data”):

한 줄로 원하는 xml 요소에 접근할 수 있으니 오히려 쉬워보입니다. data가 하나가 아닌 여러개이므로 findall 메소드를 통해 접근합니다.

from xml.etree import ElementTree   # xml 파싱 모듈 import
tree = ElementTree.parse(“rss.xml”) #기상청 정보를 xml 형식으로 파싱
root = tree.getroot() # xml의 root 요소를 추출
for data in # 아래 코드랑 동일한 라인에 위치, 길어서 내려갔네요. root.findall(“channel/item/description/body/location/data”):
tmEf = data.find(“tmEf”).text
print(tmEf)

finall 메소드로 데이터를 추출하면 list 형식으로 반환되기 때문에 for ~ in 문법으로 각 리스트에 접근합니다. 그 중 tmEf에는 날짜 데이터가 있기 때문에 이 상태로 코드를 실행시키면 아래와 같은 결과가 나옵니다.

실질적으로 웹 크롤링을 한다고 하면, urllib.request 모듈을 써서 해당 RSS를 주기적으로 가져와서 원하는 정보를 파싱하고 사용하면 될 것 같습니다.

--

--