매일 손으로 복사하던 웹 데이터, 파이썬으로 자동 수집하기
매일 손으로 복사하던 웹 데이터, 파이썬으로 자동 수집하기 (완성 코드 공개)
"오늘 환율은 얼마지?", "경쟁사 상품 가격이 또 바뀌었나?", "오늘 주요 뉴스 제목 정리해야 하는데…"
매일 같은 웹사이트를 열어 필요한 데이터를 눈으로 확인하고 손으로 복사해서 엑셀에 붙여넣는 작업을 반복하고 있지는 않으신가요? 데이터를 수집하는 것 자체가 목적이 아닌데, 수집하는 데 시간을 다 써버리는 경우가 많습니다. 파이썬을 한 번만 세팅해두면 지정한 웹페이지에서 원하는 데이터를 자동으로 가져와 엑셀 파일로 저장할 수 있습니다.
⚠️ 주의: 웹 크롤링은 반드시 해당 사이트의 이용약관을 확인한 후 사용해야 합니다. 크롤링을 명시적으로 금지한 사이트에는 사용하지 마세요. 이 글에서는 크롤링을 허용하는 공개 데이터 사이트를 예시로 사용합니다.
1단계: 준비물 설치
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
웹 데이터 수집에 필요한 라이브러리 두 가지를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install requests beautifulsoup4 pandas openpyxl
requests는 웹페이지를 내려받는 라이브러리이고, beautifulsoup4는 내려받은 페이지에서 원하는 데이터만 골라내는 라이브러리입니다. pandas와 openpyxl은 수집한 데이터를 엑셀 파일로 저장하는 데 사용합니다.
💡 이 코드로 할 수 있는 것: 지정한 웹페이지의 HTML에서 원하는 항목(제목, 가격, 날짜 등)을 자동으로 추출해 엑셀 파일로 저장합니다. 네이버 뉴스 헤드라인, 공공 데이터 포털, 환율 정보 페이지 등 HTML 구조로 된 페이지에 적용할 수 있습니다.
2단계: 완성 코드
아래 코드를 그대로 복사해서 메모장에 붙여넣고, web_crawler.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
예시로 네이버 뉴스 헤드라인을 수집해 엑셀로 저장하는 코드입니다.
import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
# ① 설정: 수집할 URL과 저장 경로
URL = "https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=100"
OUTPUT_PATH = r"C:\Users\내이름\Desktop\뉴스헤드라인.xlsx" # ← 본인 경로로 수정
SHEET_NAME = "헤드라인"
# ② 웹페이지 내려받기
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}
response = requests.get(URL, headers=headers, timeout=10)
response.raise_for_status() # 오류 발생 시 즉시 중단
response.encoding = "utf-8"
print(f" ✔ 페이지 로드 완료 (상태 코드: {response.status_code})")
# ③ 원하는 데이터 추출
soup = BeautifulSoup(response.text, "html.parser")
articles = soup.select("a.nclicks[href*='article']") # 뉴스 링크 태그 선택
results = []
for article in articles:
title = article.get_text(strip=True)
link = article.get("href", "")
if title and len(title) > 5: # 너무 짧은 텍스트 제외
results.append({"제목": title, "링크": link})
print(f" ✔ 수집된 항목: {len(results)}건")
# ④ 엑셀로 저장
if results:
df = pd.DataFrame(results).drop_duplicates(subset="제목")
df.insert(0, "수집일시", datetime.now().strftime("%Y-%m-%d %H:%M"))
df.to_excel(OUTPUT_PATH, sheet_name=SHEET_NAME, index=False)
print(f"\n✅ 완료! {len(df)}건 저장 → {OUTPUT_PATH}")
else:
print("\n⚠ 수집된 데이터가 없습니다. URL 또는 태그 선택자를 확인하세요.")
3단계: 실행 방법
- 코드 ① 설정의
OUTPUT_PATH에 저장할 엑셀 파일 경로를 입력합니다. - 수집할 사이트가 다르다면
URL을 원하는 페이지 주소로 바꿉니다. - 터미널에서 아래 명령어로 실행합니다:
python web_crawler.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 페이지 로드 완료 (상태 코드: 200) ✔ 수집된 항목: 28건 ✅ 완료! 26건 저장 → C:\Users\내이름\Desktop\뉴스헤드라인.xlsx
엑셀 파일을 열면 수집일시, 제목, 링크가 열별로 정리된 표가 만들어져 있습니다. 스크립트를 실행할 때마다 최신 데이터로 덮어씌워집니다.
4단계: 자주 발생하는 오류와 해결법
오류 1: ModuleNotFoundError: No module named 'bs4'
beautifulsoup4가 설치되지 않은 경우입니다. 설치 명령어에서 bs4가 아닌 반드시 beautifulsoup4로 입력해야 합니다.
python -m pip install requests beautifulsoup4 pandas openpyxl
오류 2: 수집된 데이터가 0건으로 나옴
웹사이트가 HTML 구조를 변경했거나, 로그인 후에만 접근 가능한 페이지일 때 발생합니다. 브라우저에서 해당 페이지를 열고 F12(개발자 도구) → Elements 탭에서 수집하려는 요소의 태그와 클래스명을 직접 확인한 뒤 코드 ③의 soup.select() 안의 선택자를 수정해야 합니다.
오류 3: requests.exceptions.ConnectionError
인터넷 연결 문제이거나 해당 사이트가 크롤러 접근을 차단한 경우입니다. headers의 User-Agent 값이 코드에 제대로 들어가 있는지 확인하세요. User-Agent가 없으면 봇으로 판단해 차단하는 사이트가 많습니다.
응용: 매일 자동 실행하도록 예약하고 싶다면
윈도우 작업 스케줄러를 활용하면 매일 정해진 시간에 스크립트를 자동 실행할 수 있습니다.
- 윈도우 검색창에 "작업 스케줄러"를 입력해 실행합니다.
- 오른쪽 패널에서 "기본 작업 만들기"를 클릭합니다.
- 이름 입력 → 트리거: "매일" 선택 → 실행 시간 설정 (예: 오전 9시)
- 동작: "프로그램 시작" 선택 → 프로그램란에
python, 인수란에web_crawler.py의 전체 경로 입력 - 완료 후 저장하면 매일 지정 시간에 자동으로 실행됩니다.
💡 이전 게시글과 결합하면: 수집한 데이터를 차트 자동 저장 편의 코드와 연결하면, 웹에서 데이터를 수집하고 차트까지 자동으로 만드는 파이프라인을 구성할 수 있습니다.
핵심 요약
- 준비물: Python + requests + beautifulsoup4 + pandas + openpyxl 설치
- 설정: 수집할 URL과 저장 경로, 태그 선택자만 수정
- 실행: 터미널에서 python web_crawler.py 입력
- 결과: 수집일시 포함 데이터가 엑셀 파일로 자동 저장, 실행마다 최신 데이터로 업데이트
이 코드를 응용하면 여러 페이지를 순차적으로 수집하거나, 수집한 데이터를 이메일로 자동 발송하는 것도 가능합니다.
