안녕하세요, 코딩하는곰입니다! 오늘은 Python을 이용해서 네이버 뉴스를 크롤링하는 방법을 상세하게 알아보겠습니다. 웹 크롤링은 데이터 분석의 첫 단계로, 실제 뉴스 데이터를 수집하여 다양한 분석을 진행할 수 있는 기초를 마련해 줍니다. 이 글에서는 requests와 BeautifulSoup 라이브러리를 활용해 네이버 뉴스에서 제목, 링크, 요약 내용 등을 추출하는 방법을 단계별로 설명드리겠습니다. Python 초보자도 쉽게 따라할 수 있도록 기본 개념부터 실전 예제까지 꼼꼼히 준비했으니, 끝까지 읽어보시고 나만의 뉴스 크롤러를 만들어 보세요!
🔧 새로운 기술을 배우고 싶다면, (React 심화) Controlled vs Uncontrolled 컴포넌트 완벽 가이드를 참고해보세요.
웹 크롤링이란 웹사이트에서 데이터를 자동으로 수집하는 과정을 의미합니다. Python에서는 requests 라이브러리를 통해 웹페이지의 HTML을 가져오고, BeautifulSoup을 이용해 해당 HTML에서 원하는 데이터를 추출합니다.
requests는 Python에서 HTTP 요청을 간편하게 보낼 수 있는 라이브러리입니다. 웹페이지에 GET 요청을 보내 HTML 코드를 받아오는 역할을 합니다. 설치 방법은 다음과 같습니다:
pip install requests
기본 사용법은 매우 간단합니다:
import requestsurl = "https://news.naver.com/"response = requests.get(url)if response.status_code == 200:print("요청 성공!")html_content = response.textelse:print(f"요청 실패: {response.status_code}")
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을 분석하고 필요한 데이터를 추출합니다. 이 두 라이브러리의 완벽한 조합이 웹 크롤링의 핵심입니다.
🛠️ 프로그래밍 팁과 트릭을 찾고 있다면, (자바 파일 업로드 완벽 가이드) MultipartFile로 쉽게 구현하는 방법를 참고해보세요.
이제 본격적으로 네이버 뉴스 크롤러를 구현해 보겠습니다. 네이버 뉴스 메인 페이지에서 헤드라인 뉴스의 제목, 링크, 요약 내용을 추출하는 것이 우리의 목표입니다.
먼저 필요한 라이브러리를 임포트합니다:
import requestsfrom bs4 import BeautifulSoupimport time
네이버 뉴스 메인 페이지에 요청을 보내 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.textexcept requests.exceptions.RequestException as e:print(f"요청 중 오류 발생: {e}")return None
가져온 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}")continuereturn news_list
위에서 작성한 함수들을 조합하여 완전한 크롤러를 실행합니다:
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()
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다:
네이버 뉴스 크롤러 시작...총 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요약: "또 다른 뉴스 요약 내용입니다..."--------------------------------------------------
로또 당첨 확률을 높이고 싶다면, AI 기반 번호 분석과 QR코드 스캔 기능을 제공하는 지니로또AI를 사용해보세요.
기본적인 크롤러를 구현했으니, 이제 더 안정적이고 효율적인 크롤링을 위한 고급 기술들을 알아보겠습니다.
웹사이트는 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'}
네트워크 문제나 웹사이트 구조 변경에 대비한 강력한 예외 처리:
def robust_crawler():max_retries = 3retry_delay = 2 # secondsfor 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 Nonetime.sleep(retry_delay)
크롤링한 데이터를 정제하고 파일로 저장하는 방법:
import jsonimport csvfrom datetime import datetimedef 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}에 저장되었습니다.")
웹 크롤링 시 반드시 지켜야 할 중요한 규칙들:
requests.Session() 사용으로 연결 재사용concurrent.futures를 이용한 병렬 처리lxml 파서 사용으로 파싱 속도 향상import requestsfrom requests.adapters import HTTPAdapterfrom requests.packages.urllib3.util.retry import Retrydef 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
🛒 장보기 전에 체크하면 유용한 건강식품 추천은, 닥터리본 츄어블 오메가3를 참고해보세요.
이렇게 Python의 requests와 BeautifulSoup을 활용해 네이버 뉴스 크롤러를 만드는 방법을 단계별로 알아보았습니다. 웹 크롤링은 데이터 분석, 머신러닝, 다양한 자동화 프로젝트의 시작점이 될 수 있는 매우 유용한 기술입니다. 하지만 크롤링을 할 때는 항상 법적, 윤리적 측면을 고려해야 합니다. 웹사이트의 이용약관을 준수하고, 서버에 과도한 부하를 주지 않도록 배려하는 개발자가 되시길 바랍니다. 이번 튜토리얼이 여러분의 데이터 수집 프로젝트에 도움이 되었기를 바랍니다. 추가로 궁금한 점이 있으시다면 댓글로 남겨주세요! 다음 시간에는 더 흥미로운 Python 프로젝트로 찾아뵙겠습니다. 코딩하는곰이었습니다. 감사합니다! 참고사항: 웹사이트 구조는 자주 변경되므로, 실제 크롤링 시에는 해당 웹사이트의 현재 HTML 구조에 맞게 선택자를 수정해야 합니다. 또한 크롤링 전 반드시 해당 사이트의 robots.txt와 이용약관을 확인하시기 바랍니다.
👍 믿을 수 있는 건강기능식품 트렌드를 알고 싶다면, 단백채움를 참고해보세요.
