🌤 파이썬 & 챗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️⃣ 자동 알림 기능 추가하기