Home

(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드

Published in python
November 10, 2025
2 min read
(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드

안녕하세요, 코딩하는곰입니다! 오늘은 Python을 이용해서 네이버 뉴스를 크롤링하는 방법을 상세하게 알아보겠습니다. 웹 크롤링은 데이터 분석의 첫 단계로, 실제 뉴스 데이터를 수집하여 다양한 분석을 진행할 수 있는 기초를 마련해 줍니다. 이 글에서는 requests와 BeautifulSoup 라이브러리를 활용해 네이버 뉴스에서 제목, 링크, 요약 내용 등을 추출하는 방법을 단계별로 설명드리겠습니다. Python 초보자도 쉽게 따라할 수 있도록 기본 개념부터 실전 예제까지 꼼꼼히 준비했으니, 끝까지 읽어보시고 나만의 뉴스 크롤러를 만들어 보세요!

(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드
(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드


🔧 새로운 기술을 배우고 싶다면, (React 심화) Controlled vs Uncontrolled 컴포넌트 완벽 가이드를 참고해보세요.

웹 크롤링의 기본: requests와 BeautifulSoup 이해하기

웹 크롤링이란 웹사이트에서 데이터를 자동으로 수집하는 과정을 의미합니다. Python에서는 requests 라이브러리를 통해 웹페이지의 HTML을 가져오고, BeautifulSoup을 이용해 해당 HTML에서 원하는 데이터를 추출합니다.

requests 라이브러리란?

requests는 Python에서 HTTP 요청을 간편하게 보낼 수 있는 라이브러리입니다. 웹페이지에 GET 요청을 보내 HTML 코드를 받아오는 역할을 합니다. 설치 방법은 다음과 같습니다:

pip install requests

기본 사용법은 매우 간단합니다:

import requests
url = "https://news.naver.com/"
response = requests.get(url)
if response.status_code == 200:
print("요청 성공!")
html_content = response.text
else:
print(f"요청 실패: {response.status_code}")

BeautifulSoup 라이브러리란?

BeautifulSoup은 HTML과 XML 문서를 파싱하고 데이터를 추출하는 라이브러리입니다. 복잡한 HTML 구조에서 원하는 태그와 클래스를 찾아내어 데이터를 정제하는 역할을 합니다. 설치 방법은:

pip install beautifulsoup4

기본 사용법은 다음과 같습니다:

from bs4 import BeautifulSoup
# HTML 문서 파싱
soup = BeautifulSoup(html_content, 'html.parser')
# 특정 태그 찾기
title = soup.find('title')
print(title.text)

두 라이브러리의 협업

requests가 웹서버에 요청을 보내 HTML을 가져오면, BeautifulSoup이 이 HTML을 분석하고 필요한 데이터를 추출합니다. 이 두 라이브러리의 완벽한 조합이 웹 크롤링의 핵심입니다.

(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드
(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드


🛠️ 프로그래밍 팁과 트릭을 찾고 있다면, (자바 파일 업로드 완벽 가이드) MultipartFile로 쉽게 구현하는 방법를 참고해보세요.

네이버 뉴스 크롤러 구현: 단계별 실전 가이드

이제 본격적으로 네이버 뉴스 크롤러를 구현해 보겠습니다. 네이버 뉴스 메인 페이지에서 헤드라인 뉴스의 제목, 링크, 요약 내용을 추출하는 것이 우리의 목표입니다.

1. 필요한 라이브러리 임포트

먼저 필요한 라이브러리를 임포트합니다:

import requests
from bs4 import BeautifulSoup
import time

2. 웹페이지 요청 및 HTML 가져오기

네이버 뉴스 메인 페이지에 요청을 보내 HTML을 가져옵니다:

def get_naver_news():
url = "https://news.naver.com/"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # HTTP 에러 발생 시 예외 처리
return response.text
except requests.exceptions.RequestException as e:
print(f"요청 중 오류 발생: {e}")
return None

3. HTML 파싱 및 데이터 추출

가져온 HTML을 BeautifulSoup으로 파싱하고 원하는 데이터를 추출합니다:

def parse_news_data(html):
soup = BeautifulSoup(html, 'html.parser')
news_list = []
# 헤드라인 뉴스 찾기 (실제 선택자는 상황에 따라 변경 필요)
headline_news = soup.find_all('div', class_='cjs_channel_card')
for news in headline_news:
try:
# 제목 추출
title_element = news.find('span', class_='cjs_t')
title = title_element.text.strip() if title_element else "제목 없음"
# 링크 추출
link_element = news.find('a')
link = link_element.get('href') if link_element else "링크 없음"
# 요약 내용 추출
summary_element = news.find('span', class_='cjs_d')
summary = summary_element.text.strip() if summary_element else "요약 없음"
news_data = {
'title': title,
'link': link,
'summary': summary
}
news_list.append(news_data)
except Exception as e:
print(f"뉴스 데이터 추출 중 오류: {e}")
continue
return news_list

4. 완성된 크롤러 실행하기

위에서 작성한 함수들을 조합하여 완전한 크롤러를 실행합니다:

def main():
print("네이버 뉴스 크롤러 시작...")
# HTML 가져오기
html = get_naver_news()
if not html:
print("HTML을 가져오는데 실패했습니다.")
return
# 데이터 파싱
news_data = parse_news_data(html)
# 결과 출력
print(f"\n총 {len(news_data)}개의 뉴스를 찾았습니다:\n")
for i, news in enumerate(news_data, 1):
print(f"{i}. 제목: {news['title']}")
print(f" 링크: {news['link']}")
print(f" 요약: {news['summary']}")
print("-" * 50)
if __name__ == "__main__":
main()

5. 실제 실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다:

네이버 뉴스 크롤러 시작...
총 15개의 뉴스를 찾았습니다:
1. 제목: "주요 뉴스 헤드라인 1"
링크: https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=001&aid=0012345678
요약: "이것은 뉴스 요약 내용입니다..."
--------------------------------------------------
2. 제목: "주요 뉴스 헤드라인 2"
링크: https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid=001&aid=0012345679
요약: "또 다른 뉴스 요약 내용입니다..."
--------------------------------------------------

(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드
(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드


로또 당첨 확률을 높이고 싶다면, AI 기반 번호 분석과 QR코드 스캔 기능을 제공하는 지니로또AI를 사용해보세요.

고급 크롤링 기술과 주의사항

기본적인 크롤러를 구현했으니, 이제 더 안정적이고 효율적인 크롤링을 위한 고급 기술들을 알아보겠습니다.

1. User-Agent 설정과 로봇 배제 표준

웹사이트는 User-Agent를 통해 접속하는 클라이언트의 정보를 확인합니다. 적절한 User-Agent를 설정하지 않으면 접속이 차단될 수 있습니다:

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'keep-alive'
}

2. 예외 처리와 안정성 향상

네트워크 문제나 웹사이트 구조 변경에 대비한 강력한 예외 처리:

def robust_crawler():
max_retries = 3
retry_delay = 2 # seconds
for attempt in range(max_retries):
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
# HTML 구조 변경에 대비한 유연한 파싱
soup = BeautifulSoup(response.content, 'html.parser')
# 다양한 선택자 시도
selectors = [
'div.cjs_channel_card',
'ul.type06_headline li',
'div.newsnow div.newsnow_tx'
]
for selector in selectors:
elements = soup.select(selector)
if elements:
return process_elements(elements)
raise ValueError("적절한 뉴스 요소를 찾을 수 없습니다.")
except requests.exceptions.Timeout:
print(f"타임아웃 발생, {retry_delay}초 후 재시도... ({attempt + 1}/{max_retries})")
time.sleep(retry_delay)
except Exception as e:
print(f"오류 발생: {e}")
if attempt == max_retries - 1:
return None
time.sleep(retry_delay)

3. 데이터 정제와 저장

크롤링한 데이터를 정제하고 파일로 저장하는 방법:

import json
import csv
from datetime import datetime
def save_news_data(news_list, format='json'):
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
if format == 'json':
filename = f"naver_news_{timestamp}.json"
with open(filename, 'w', encoding='utf-8') as f:
json.dump(news_list, f, ensure_ascii=False, indent=2)
elif format == 'csv':
filename = f"naver_news_{timestamp}.csv"
with open(filename, 'w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['title', 'link', 'summary'])
writer.writeheader()
writer.writerows(news_list)
print(f"데이터가 {filename}에 저장되었습니다.")

4. 법적, 윤리적 주의사항

웹 크롤링 시 반드시 지켜야 할 중요한 규칙들:

  1. robots.txt 확인: 웹사이트의 robots.txt 파일을 확인하고 규칙을 준수하세요
  2. 접속 빈도 제한: 너무 빈번한 요청은 서버에 부담을 줍니다
  3. 저작권 존중: 크롤링한 데이터의 상업적 사용은 저작권법 위반일 수 있습니다
  4. 개인정보 보호: 개인정보가 포함된 데이터는 수집하지 마세요
  5. 서비스 이용약관 확인: 해당 웹사이트의 이용약관을 반드시 확인하세요

5. 성능 개선을 위한 추가 팁

  • requests.Session() 사용으로 연결 재사용
  • concurrent.futures를 이용한 병렬 처리
  • lxml 파서 사용으로 파싱 속도 향상
  • 캐시 구현으로 중복 요청 방지
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
def create_session():
session = requests.Session()
# 재시도 전략 설정
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
return session

(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드
(실전 Python) 네이버 뉴스 크롤러 만들기 requests + BeautifulSoup 완벽 가이드


🛒 장보기 전에 체크하면 유용한 건강식품 추천은, 닥터리본 츄어블 오메가3를 참고해보세요.

마치며

이렇게 Python의 requests와 BeautifulSoup을 활용해 네이버 뉴스 크롤러를 만드는 방법을 단계별로 알아보았습니다. 웹 크롤링은 데이터 분석, 머신러닝, 다양한 자동화 프로젝트의 시작점이 될 수 있는 매우 유용한 기술입니다. 하지만 크롤링을 할 때는 항상 법적, 윤리적 측면을 고려해야 합니다. 웹사이트의 이용약관을 준수하고, 서버에 과도한 부하를 주지 않도록 배려하는 개발자가 되시길 바랍니다. 이번 튜토리얼이 여러분의 데이터 수집 프로젝트에 도움이 되었기를 바랍니다. 추가로 궁금한 점이 있으시다면 댓글로 남겨주세요! 다음 시간에는 더 흥미로운 Python 프로젝트로 찾아뵙겠습니다. 코딩하는곰이었습니다. 감사합니다! 참고사항: 웹사이트 구조는 자주 변경되므로, 실제 크롤링 시에는 해당 웹사이트의 현재 HTML 구조에 맞게 선택자를 수정해야 합니다. 또한 크롤링 전 반드시 해당 사이트의 robots.txt와 이용약관을 확인하시기 바랍니다.

👍 믿을 수 있는 건강기능식품 트렌드를 알고 싶다면, 단백채움를 참고해보세요.









최상의 건강을 위한 영양가득한 식품과 정보! life-plus.co.kr 바로가기
최상의 건강을 위한 영양가득한 식품과 정보! life-plus.co.kr 바로가기



다채로운 문화축제와 공연 소식을 공유하는 블로그! culturestage.co.kr 바로가기
다채로운 문화축제와 공연 소식을 공유하는 블로그! culturestage.co.kr 바로가기



비트코인 세계로의 첫걸음! 지금 가입하고 거래 수수료 할인 혜택 받으세요! bitget.com 바로가기
비트코인 세계로의 첫걸음! 지금 가입하고 거래 수수료 할인 혜택 받으세요! bitget.com 바로가기




Tags

#developer#coding#python

Share

Previous Article
Angular CLI로 프로젝트 시작하기 ng new부터 serve까지 완벽 가이드

Table Of Contents

1
웹 크롤링의 기본: requests와 BeautifulSoup 이해하기
2
네이버 뉴스 크롤러 구현: 단계별 실전 가이드
3
고급 크롤링 기술과 주의사항
4
마치며

Related Posts

(파이썬 기초 마스터) 함수 정의(def)와 호출, return의 모든 것 - 코딩하는곰의 친절한 가이드
December 26, 2025
3 min