파이썬 웹 크롤링 기초: 방역 현장 날씨 자동 수집하기 (40대 실전 15편)

지난 14편에 걸쳐 엑셀 파일의 데이터를 가공하고 카카오톡으로 자동 발송하는 내부 시스템을 완성했습니다. 하지만 우리가 일하는 진짜 현장은 컴퓨터 모니터 밖, 바로 ‘야외’에 있습니다. 매일 아침 지역별 날씨를 일일이 검색하는 수고를 덜어드리기 위해, 오늘은 파이썬 웹 크롤링 기초를 다루어 보겠습니다. 인터넷에 널려 있는 날씨 정보를 1초 만에 긁어오는 업무 자동화의 두 번째 장을 시작하겠습니다.

방역업에서 가장 민감한 변수는 단연코 ‘날씨’입니다. 오늘 비가 오는지, 습도는 몇 퍼센트인지에 따라 사용할 약제의 종류와 작업 동선이 완전히 달라집니다. 매일 아침 눈을 비비며 포털 사이트에 접속해 지역별 날씨를 하나하나 검색하고 계시지는 않으신가요?

이제 파이썬을 이용해 인터넷에 있는 날씨 정보를 1초 만에 긁어오겠습니다. 파이썬 업무 자동화의 두 번째 장, 웹 크롤링(Web Crawling)의 세계로 안내합니다.

파이썬 웹 크롤링 기초 방역 날씨 검색
Alt텍스트: 파이썬 웹 크롤링 기초 방역 날씨 검색

1. 파이썬 웹 크롤링 기초: requests와 BeautifulSoup

인터넷 사이트에서 정보를 빼 오려면 두 가지 역할이 필요합니다. 식당에서 음식을 배달시키는 과정에 비유해 보겠습니다.

  1. requests (배달원): “OO 사이트에 접속해서 웹페이지(HTML) 전체를 가져와 줘!”라고 명령하는 라이브러리입니다.
  2. BeautifulSoup (포장 뜯는 사람): 배달원이 가져온 복잡한 컴퓨터 언어(HTML) 뭉치 속에서, 우리가 원하는 ‘온도’나 ‘날씨 상태’ 글자만 예쁘게 발라내는(추출하는) 라이브러리입니다.

본격적인 코딩 전, VS Code 터미널 창(하단)에 아래 명령어를 입력하여 이 두 가지 도구를 설치해야 합니다.

  • 설치 명령어: pip install requests beautifulsoup4

2. 실무 트러블슈팅: 내가 ‘로봇(Bot)’이 아니라는 것을 증명하라

인터넷에 있는 수많은 크롤링 기초 강의들이 가장 많이 빼먹는 핵심이 바로 ‘헤더(Header)’ 설정입니다.

네이버나 구글 같은 대형 포털 사이트들은 파이썬 같은 기계(Bot)가 비정상적인 속도로 사이트에 접속해 데이터를 긁어가는 것을 싫어합니다. 그래서 코드를 짜서 무작정 접속을 시도하면 접속을 튕겨내거나(406 Not Acceptable 에러), 빈 화면을 던져줍니다.

이 차단을 피하려면 파이썬이 접속할 때 “나 로봇 아니고, 평범한 사람이 크롬 브라우저 켜서 접속하는 거야”라고 신분증을 위조해서 보여줘야 합니다. 이것이 바로 User-Agent 설정입니다. 실무 크롤링에서 이 한 줄이 없으면 코드는 무용지물이 됩니다.

파이썬 웹 크롤링 봇 차단을 피하기 위한 브라우저 User-Agent 헤더 설정 확인 방법
Alt 텍스트: 파이썬 웹 크롤링 봇 차단을 피하기 위한 브라우저 User-Agent 헤더 설정 확인 방법

3. 실전 코드: 네이버 날씨 1초 만에 긁어오기

이제 방역 작업이 예정된 ‘화성시 날씨’를 포털에서 자동으로 긁어오는 코드를 작성해 보겠습니다. 복잡한 HTML 구조를 BeautifulSoup이 얼마나 쉽게 발라내는지 확인해 보십시오.

Python

import requests
from bs4 import BeautifulSoup

# 1. 봇 차단을 피하기 위한 가짜 신분증(User-Agent) 생성
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
}

# 2. 검색할 지역과 URL 설정
location = "화성시"
url = f"https://search.naver.com/search.naver?query={location}+날씨"

# 3. requests로 페이지 가져오기 (헤더 포함)
response = requests.get(url, headers=headers)

# 4. BeautifulSoup으로 원하는 정보만 쏙쏙 뽑아내기
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 크롬 개발자도구(F12)로 찾은 날씨 및 온도 클래스 이름
    # (참고: 포털 사이트의 클래스명은 시기에 따라 변경될 수 있습니다)
    temperature = soup.select_one('.temperature_text > strong').text
    weather_status = soup.select_one('.weather_main').text
    humidity = soup.select_one('.summary_list > div:nth-child(2) > dd').text
    
    print(f"📍 오늘의 {location} 방역 현장 날씨")
    print(f"🌡️ 현재 온도: {temperature}")
    print(f"🌤️ 기상 상태: {weather_status}")
    print(f"💧 현재 습도: {humidity}")
    
else:
    print("페이지를 불러오지 못했습니다. 에러 코드:", response.status_code)

이 코드를 실행하면 인터넷 창을 띄울 필요도 없이, 1초 만에 터미널 창에 오늘의 온도, 기상 상태, 습도가 깔끔하게 출력됩니다. 비가 온다면 외부 소독 일정을 내부 소독으로 변경하는 결정을 곧바로 내릴 수 있습니다.

파이썬 BeautifulSoup을 이용해 네이버 날씨 크롤링에 성공한 터미널 출력 결과
Alt 텍스트: 파이썬 BeautifulSoup을 이용해 네이버 날씨 크롤링에 성공한 터미널 출력 결과

4. 글을 마치며: 다음 목표는 완벽한 융합

웹 크롤링은 처음 접할 때 복잡한 영어(HTML 태그)들 때문에 지레 겁을 먹기 쉽습니다. 하지만 select_one()이라는 강력한 기능 하나만 마스터하면, 웹상의 모든 정보는 대표님의 든든한 데이터베이스가 됩니다.

여기서 끝이 아닙니다. 오늘 긁어온 이 날씨 정보를 혼자만 알면 무슨 소용이 있을까요? 지난 [14편: 카카오톡 API 연동]에서 만든 코드와 오늘의 크롤링 코드를 합쳐 보십시오. 매일 아침 7시 정각, 파이썬이 인터넷에서 오늘 현장 날씨를 긁어오고, 방역 담당자들의 스마트폰 카카오톡으로 “오늘 화성시 강수 확률 높음, 야외 방역 시 주의 바람” 이라는 메시지를 자동으로 쏘게 될 것입니다.

이것이 진짜 40대 직장인이 코딩을 배워야 하는 이유입니다. 하나씩 배운 기술의 조각들이 합쳐지는 순간, 수십 명의 몫을 해내는 나만의 듬직한 AI 비서가 탄생합니다. 다음 시간에는 크롤링 기술을 응용하여 복수의 여러 데이터를 한 번에 엑셀로 저장하는 방법에 대해 알아보겠습니다.

댓글 남기기