소품집

[파이썬을 이용한 웹 크롤링과 스크레이핑] XML(RSS) 스크레이핑 본문

Web crawling

[파이썬을 이용한 웹 크롤링과 스크레이핑] XML(RSS) 스크레이핑

sodayeong 2021. 5. 4. 17:03

XML 파서로 RSS에서 데이터를 스크레이핑해 봅시다.

RSS란?

블로그 또는 뉴스 사이트 등의 웹사이트는 변경 정보 등을 RSS라는 이름의 XML 형식으로 제공합니다. RSS는 XML을 기반으로 만들어졌으므로 HTML 보다 간단하게 파싱할 수 있습니다. 뉴스 사이트에서 최신 뉴스 URL와 제목을 추출하는 경우 등 스크레이핑하고 싶은 정보가 RSS로 제공되는 경우 어떻게 활용하면 되는지 살펴봅시다.

RSS 파싱하기

그럼 실제로 기상청에서 제공하고 있는 RSS를 살펴봅시다.

그럼 여기서 날씨와 시간 등의 정보를 추출해 보겠습니다. 날씨는 wf에 들어있으며, 기온은 tmn, 최고 기온은 tmx, 시간은 wmEF라는 요소 내부에 적혀 있습니다.

파이썬의 표준 라이브러리에는 XML을 다루기 위한 모듈이 포함돼 있습니다. xml.etree.ElementTree가 사용하기 쉬우므로 이것을 사용해

보겠습니다.

 

 

예제 2.13에서는 ElementTree 모듈을 사용해 RSS를 파싱합니다.

www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109

위 XML을 rss.xml라 저장하고, 작업창에 올려둡니다. 

 

# ElementTree 모듈을 읽어 들입니다.
from xml.etree import ElementTree

# parse() 함수로 파일을 읽어 들이고 ElementTree 객체를 만듭니다.
tree = ElementTree.parse('rss.xml')

# getroot() 매서드로 XML의 루트 요소를 추출합니다.
root = tree.getroot()

#findall() 매서드로 요소 목록을 추출합니다.
# 태그를 찾습니다. (자세한 내용은 RSS를 열어 참고해주세요)
for item in root.findall('channel/item/description/body/location/data'):
        # find() 매서드로 요소를 찾고 text 속성으로 값을 추출합니다.
        tm_ef = item.find('tmEf').text
        tmn = item.find('tmn').text
        tmx = item.find('tmx').text
        wf = item.find('wf').text
        print(tm_ef, tmn, tmx, wf) # 출력합니다.

findall() 메서드 또는 find() 메서드는 매개변수로 XPath를 지정합니다.

예제 2.13을 저정하고 실행하면 다음과 같이 출력됩니다.

(scraping) dayeong@dayeong-ui-MacBookPro ~ % python scrape_rss.py
2021-05-07 00:00 13 19 구름많고 비
2021-05-07 12:00 13 19 맑음
2021-05-08 00:00 11 21 맑음
2021-05-08 12:00 11 21 맑음
2021-05-09 00:00 12 23 맑음
2021-05-09 12:00 12 23 맑음
2021-05-10 00:00 13 24 구름많음
2021-05-10 12:00 13 24 구름많음
2021-05-11 00:00 13 22 흐림
2021-05-11 12:00 13 22 흐림
2021-05-12 00:00 14 23 구름많음
2021-05-13 00:00 13 24 맑음
2021-05-14 00:00 13 24 구름많음
2021-05-07 00:00 13 17 구름많고 비
2021-05-07 12:00 13 17 맑음
2021-05-08 00:00 12 18 맑음
2021-05-08 12:00 12 18 맑음
2021-05-09 00:00 12 19 맑음
2021-05-09 12:00 12 19 맑음
2021-05-10 00:00 13 20 구름많음
2021-05-10 12:00 13 20 구름많음
2021-05-11 00:00 12 20 흐림
2021-05-11 12:00 12 20 흐림
2021-05-12 00:00 13 20 구름많음
2021-05-13 00:00 13 21 맑음
2021-05-14 00:00 14 21 구름많음
2021-05-07 00:00 11 20 구름많고 비
2021-05-07 12:00 11 20 맑음
2021-05-08 00:00 10 22 맑음
2021-05-08 12:00 10 22 맑음
2021-05-09 00:00 11 22 맑음
2021-05-09 12:00 11 22 맑음
2021-05-10 00:00 12 24 구름많음
2021-05-10 12:00 12 24 구름많음
2021-05-11 00:00 13 23 흐림
2021-05-11 12:00 13 23 흐림
2021-05-12 00:00 12 23 구름많음
2021-05-13 00:00 12 25 맑음
2021-05-14 00:00 12 24 구름많음
2021-05-07 00:00 9 19 구름많고 비
2021-05-07 12:00 9 19 맑음
2021-05-08 00:00 9 21 맑음
2021-05-08 12:00 9 21 맑음
2021-05-09 00:00 9 22 맑음
2021-05-09 12:00 9 22 맑음
2021-05-10 00:00 10 22 구름많음
2021-05-10 12:00 10 22 구름많음
2021-05-11 00:00 11 22 흐림
2021-05-11 12:00 11 22 흐림
2021-05-12 00:00 10 22 구름많음
2021-05-13 00:00 10 23 맑음
2021-05-14 00:00 11 24 구름많음
2021-05-07 00:00 9 21 구름많고 비
2021-05-07 12:00 9 21 맑음
2021-05-08 00:00 9 23 맑음
2021-05-08 12:00 9 23 맑음
2021-05-09 00:00 10 24 맑음
2021-05-09 12:00 10 24 맑음
2021-05-10 00:00 11 25 구름많음
2021-05-10 12:00 11 25 구름많음
2021-05-11 00:00 12 23 흐림
2021-05-11 12:00 12 23 흐림
2021-05-12 00:00 11 23 구름많음
2021-05-13 00:00 10 24 맑음
2021-05-14 00:00 10 25 구름많음
2021-05-07 00:00 11 21 구름많고 비
2021-05-07 12:00 11 21 맑음
2021-05-08 00:00 10 23 맑음
2021-05-08 12:00 10 23 맑음
2021-05-09 00:00 11 24 맑음
2021-05-09 12:00 11 24 맑음
2021-05-10 00:00 12 24 구름많음
2021-05-10 12:00 12 24 구름많음
2021-05-11 00:00 13 23 흐림
2021-05-11 12:00 13 23 흐림
2021-05-12 00:00 12 23 구름많음
2021-05-13 00:00 11 23 맑음
2021-05-14 00:00 12 26 구름많음
2021-05-07 00:00 11 17 구름많고 비
2021-05-07 12:00 11 17 맑음
2021-05-08 00:00 11 19 맑음
2021-05-08 12:00 11 19 맑음
2021-05-09 00:00 10 18 맑음
2021-05-09 12:00 10 18 맑음
2021-05-10 00:00 11 18 구름많음
2021-05-10 12:00 11 18 구름많음
2021-05-11 00:00 11 18 흐림
2021-05-11 12:00 11 18 흐림
2021-05-12 00:00 11 19 구름많음
2021-05-13 00:00 12 19 맑음
2021-05-14 00:00 12 20 구름많음
2021-05-07 00:00 11 19 구름많고 비
2021-05-07 12:00 11 19 맑음
2021-05-08 00:00 9 22 맑음
2021-05-08 12:00 9 22 맑음
2021-05-09 00:00 10 23 맑음
2021-05-09 12:00 10 23 맑음
2021-05-10 00:00 11 24 구름많음
2021-05-10 12:00 11 24 구름많음
2021-05-11 00:00 13 23 흐림
2021-05-11 12:00 13 23 흐림
2021-05-12 00:00 12 24 구름많음
2021-05-13 00:00 11 25 맑음
2021-05-14 00:00 11 26 구름많음
2021-05-07 00:00 14 18 구름많고 비
2021-05-07 12:00 14 18 맑음
2021-05-08 00:00 12 21 맑음
2021-05-08 12:00 12 21 맑음
2021-05-09 00:00 12 22 맑음
2021-05-09 12:00 12 22 맑음
2021-05-10 00:00 14 23 구름많음
2021-05-10 12:00 14 23 구름많음
2021-05-11 00:00 14 22 흐림
2021-05-11 12:00 14 22 흐림
2021-05-12 00:00 14 23 구름많음
2021-05-13 00:00 14 25 맑음
2021-05-14 00:00 12 25 구름많음
2021-05-07 00:00 10 17 구름많고 비
2021-05-07 12:00 10 17 맑음
2021-05-08 00:00 10 17 맑음
2021-05-08 12:00 10 17 맑음
2021-05-09 00:00 10 20 맑음
2021-05-09 12:00 10 20 맑음
2021-05-10 00:00 11 20 구름많음
2021-05-10 12:00 11 20 구름많음
2021-05-11 00:00 12 21 흐림
2021-05-11 12:00 12 21 흐림
2021-05-12 00:00 10 21 구름많음
2021-05-13 00:00 10 22 맑음
2021-05-14 00:00 12 21 구름많음
2021-05-07 00:00 12 18 구름많고 비
2021-05-07 12:00 12 18 맑음
2021-05-08 00:00 11 20 맑음
2021-05-08 12:00 11 20 맑음
2021-05-09 00:00 11 21 맑음
2021-05-09 12:00 11 21 맑음
2021-05-10 00:00 12 22 구름많음
2021-05-10 12:00 12 22 구름많음
2021-05-11 00:00 12 22 흐림
2021-05-11 12:00 12 22 흐림
2021-05-12 00:00 12 22 구름많음
2021-05-13 00:00 12 23 맑음
2021-05-14 00:00 12 23 구름많음
2021-05-07 00:00 12 18 구름많고 비
2021-05-07 12:00 12 18 맑음
2021-05-08 00:00 10 21 맑음
2021-05-08 12:00 10 21 맑음
2021-05-09 00:00 10 22 맑음
2021-05-09 12:00 10 22 맑음
2021-05-10 00:00 11 22 구름많음
2021-05-10 12:00 11 22 구름많음
2021-05-11 00:00 13 21 흐림
...

ElementTree를 사용해 간단하게 XML을 파싱했습니다.

 

728x90
Comments