[1일 1파] 파이썬으로 웹페이지에서 날씨 정보 가져오기 (크롤링)

🌤 파이썬 & 챗GPT로 날씨 정보 가져오기

📌 오늘 배울 내용

  • 크롤링이란?
  • requests와 BeautifulSoup 라이브러리 사용법
  • 실시간 날씨 정보 가져오기
  • 결과 출력하기

1. 크롤링이란? 🤔

크롤링(Crawling)은 웹사이트에서 필요한 정보를 자동으로 가져오는 기술이에요.

이 기능을 사용하면 날씨, 뉴스, 환율, 쇼핑 정보 등을 자동으로 가져올 수 있어요!

 

📌 예제 목표:
🔹 특정 웹사이트에서 현재 날씨 정보를 가져오기
🔹 웹페이지에서 원하는 데이터만 추출하기
🔹 깔끔하게 출력하기


2. 파이썬 개발 환경 설정 ⚙️

아래 명령어를 터미널(CMD)에 입력해서 필요한 라이브러리를 설치하세요.

pip install requests beautifulsoup4

라이브러리가 없는 경우 명령어 실행 후 모습

 

🔗 Python 처음 설치해 보기
🔗 CMD 창 실행 및 폴더 이동

3. 파이썬으로 날씨 크롤링 프로그램 만들기 🌦

이제 본격적으로 날씨 정보를 가져와 볼게요!
우리는 requests 라이브러리로 웹페이지 데이터를 가져오고,
BeautifulSoup 라이브러리로 필요한 정보를 추출할 거예요.

§  1단계: 웹페이지에서 HTML 코드 가져오기

import requests

url = "https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108"
response = requests.get(url)

print(response.text)  # 가져온 HTML 전체 출력
    

 

→ 또 단계별로 코드 따라서 작성하기 시작~ 그리고 실행도 한 번 눌러보세요.

코드 따라하기

 

→ 결과: 엄청난 결과물이 주루룩~~~ 출력되요.

코드 실행결과 출력물?

 

여기서 문제 발생 !

→ 기상청 서비스가 변경이 되어서 구조를 파악하고, rss xml 데이터로 기상정보를 불러야 하네요. 

url = "http://www.kma.go.kr/repositary/xml/fct/mon/img/fct_mon1rss_108_20250306.xml"

 

✅ 날씨 정보라서 기상청 홈페이지를 참고하지만 다른데 적용한다고 생각하면,

      각 홈페이지 구조(html, rss xml 등)를 파악해야해요. 


§ 2단계: 필요한 정보만 뽑아내기

→ HTML 또는 XML 코드에서 날씨 정보만 가져와야 해요.
이때 BeautifulSoup을 사용해서 원하는 부분을 선택할 수 있어요.

import requests
from bs4 import BeautifulSoup

# 1. 기상청 XML 데이터 URL
url = "http://www.kma.go.kr/repositary/xml/fct/mon/img/fct_mon1rss_108_20250306.xml"
response = requests.get(url)

# 2. XML 파싱
soup = BeautifulSoup(response.text, features="xml")

# 3. 지역 정보 찾기 (서울ㆍ인천ㆍ경기도)
local_ta = soup.find("local_ta")


# 지역명 가져오기
local_name = local_ta.find("local_ta_name").text.strip()

# 1주 차 날씨 정보 가져오기
week1 = local_ta.find("week_local_ta")

# 지역명 출력
print(f"🌤 {local_name}")

#구조파악하기
print(week1)
    

 

→ 위 코드는 xml구조를 파악하기 위해서 여러번 실행을 하고 수정을 했어요. 😥

    제가 기상청 홈페이지 날씨 데이터 구조를 어찌 알겠어요. chatGPT를 믿고 방심했네요.

    서울을 가져오고 싶은데 title= 전국 이었나봐요;;

전국 데이터 정보네요

 


§  3단계: 더 깔끔하게 출력하기

import requests
from bs4 import BeautifulSoup

# 1. 기상청 XML 데이터 URL
url = "http://www.kma.go.kr/repositary/xml/fct/mon/img/fct_mon1rss_108_20250306.xml"
response = requests.get(url)

# 2. XML 파싱
soup = BeautifulSoup(response.text, features="xml")

# 3. 지역 정보 찾기 (서울ㆍ인천ㆍ경기도)
local_ta = soup.find("local_ta")

if local_ta:
    # 지역명 가져오기
    local_name = local_ta.find("local_ta_name").text.strip()

    # 1주 차 날씨 정보 가져오기
    week1 = local_ta.find("week_local_ta")
    if week1:
        normal_temp = week1.find("week1_local_ta_normalYear").text
        temp_range = week1.find("week1_local_ta_similarRange").text
        min_val = week1.find("week1_local_ta_minVal").text
        max_val = week1.find("week1_local_ta_maxVal").text

        # 1주 차 온도 정보 출력
        print(f"🌤 {local_name} 지역 1주 차 평균 기온: {normal_temp}°C")
        print(f"   유사 범위: {temp_range}°C")
        print(f"   최소 기온 확률: {min_val}%")
        print(f"   최대 기온 확률: {max_val}%")
    else:
        print("❌ 1주 차 날씨 데이터를 찾을 수 없습니다.")
else:
    print("❌ 해당 지역의 데이터를 찾을 수 없습니다.")

    

 

→ 코드는 길지만 아래처럼 깔끔하게 결과가 나왔네요. 서울은 아니지만요...

전국 날씨 코드 실행 결과


4. 전체 파이썬(Python)코드 📝

 

→ 사실은 말이야. 전체 코드가 이렇게 복잡해 질 줄 몰랐어요~ 🤣

 

     그래서 하는 김에 처음 목표였던, [서울ㆍ인천ㆍ경기도] 데이터를 찾을 수 있게끔.

     ChatGPT에 물어봐서 아래처럼 코드를 수정했어요~

 

     결론, 코드가 복잡해 보일 수 있는데 한 줄 씩 따라해보면 기존에 코드와 크게 다르지 않아요.

     모르는 건. 우리의 친구 GPT에 물어보아요.  AI지옥~ 불신(?)천국~?  

 

    (※ 100% 결과를 신뢰하려면 본인이 꼭 다시 한 번 확인해야 해요! 잘 못된 정보도 자연스럽게 녹아있을 수 있어요.)

import requests
from bs4 import BeautifulSoup

# 1. 기상청 XML 데이터 URL
url = "http://www.kma.go.kr/repositary/xml/fct/mon/img/fct_mon1rss_108_20250306.xml"
response = requests.get(url)

# 2. XML 파싱
soup = BeautifulSoup(response.text, features="xml")

# 3. 전국 지역 데이터 찾기
local_ta_list = soup.find_all("local_ta")  # 모든  태그 찾기

# 4. "서울ㆍ인천ㆍ경기도" 지역 데이터 찾기
selected_local = None

for local in local_ta_list:
    local_name_tag = local.find("local_ta_name")
    if local_name_tag and "서울ㆍ인천ㆍ경기도" in local_name_tag.text:
        selected_local = local
        break  # 원하는 지역을 찾으면 반복문 종료

# 5. 해당 지역의 날씨 정보 출력
if selected_local:
    local_name = selected_local.find("local_ta_name").text.strip()
    week1 = selected_local.find("week_local_ta")  # 1주 차 날씨 정보

    if week1:
        normal_temp = week1.find("week1_local_ta_normalYear").text
        temp_range = week1.find("week1_local_ta_similarRange").text
        min_val = week1.find("week1_local_ta_minVal").text
        max_val = week1.find("week1_local_ta_maxVal").text

        # 1주 차 온도 정보 출력
        print(f"🌤 {local_name} 지역 1주 차 평균 기온: {normal_temp}°C")
        print(f"   유사 범위: {temp_range}°C")
        print(f"   최소 기온 확률: {min_val}%")
        print(f"   최대 기온 확률: {max_val}%")
    else:
        print("❌ 1주 차 날씨 데이터를 찾을 수 없습니다.")
else:
    print("❌ '서울ㆍ인천ㆍ경기도' 지역 데이터를 찾을 수 없습니다.")

    

 


5. 초보자를 위한 FAQ 🧐

    • ❓ 크롤링하면 안 되는 사이트도 있나요?
    • 네! 일부 사이트는 크롤링을 허용하지 않아요. `robots.txt` 파일을 확인해 보세요!

 

    • ❓ 실행했는데 한글이 깨져요!
    • 이럴 땐 `response.encoding = 'utf-8'` 을 추가하면 해결돼요.

 

  • ❓ 데이터를 더 많이 가져오고 싶어요!
  • `find_all()`을 사용하면 여러 개의 정보를 가져올 수 있어요.
    all_items = soup.find_all("description") for item in all_items: print(item.text)

 

6. 맺음말 & 발전 과제 🚀

오늘은 웹에서 실시간 날씨 정보를 가져오는 방법을 배웠어요!

  • ✅ requests로 웹페이지 가져오기
  • ✅ BeautifulSoup으로 데이터 추출하기
  • ✅ 날씨 정보 출력하기

⚠ 발전 과제

  • 1️⃣ 사용자에게 지역을 입력받아 해당 지역 날씨를 출력하기
  • 2️⃣ GUI(그래픽 화면)로 만들기
  • 3️⃣ 자동 알림 기능 추가하기

🔗 이전 글 / 다음 글 🔗