네이버 금융 뉴스 크롤링 — 파이썬 requests·BeautifulSoup 단계별 정리

A laptop screen showing a code editor with visible programming code in a dimly lit environment.

주식·환율·증시 흐름을 매일 추적하려면 뉴스 데이터가 필수입니다. 네이버 금융 섹션은 종목별 뉴스, 시황, 공시까지 한곳에 모여 있어 정보 수집 출발점으로 자주 활용되죠. 이 글에서는 네이버 금융 뉴스 크롤링을 처음 시도하는 분들을 위해 환경 설정부터 본문 추출, 저장, 자동화, 주의사항까지 단계별로 정리해드릴게요.

DATA SCRAPING
네이버 금융 뉴스 크롤링 입문
requests·BeautifulSoup·pandas 조합
데이터 수집·저장·자동화까지 한 번에

크롤링 전 알아야 할 기본 원칙

네이버 금융 뉴스 크롤링 - 크롤링 전 알아야 할 기본 원칙

크롤링은 편리한 도구지만 무분별한 요청은 서버에 부담을 주고 IP가 차단될 수 있어요. 네이버 robots.txt와 이용약관을 확인하고, 페이지 요청 간격을 1~3초 이상 두는 매너가 기본입니다. 또한 수집 데이터는 개인 학습·분석 목적에 한정하고 상업적 재배포는 피하시는 것이 안전합니다.

HTML 구조가 자주 바뀌기 때문에 셀렉터(CSS Selector·XPath)도 정기적으로 재확인이 필요해요. 크롬 개발자 도구(F12)에서 Elements 탭을 열고 원하는 요소를 우클릭하면 셀렉터를 바로 복사할 수 있죠. 네이버 금융 뉴스 크롤링 작업의 절반은 이 셀렉터 유지보수라고 봐도 무방합니다.

1~3초

권장 요청 간격

200

정상 응답 코드

429

요청 과다 차단

UA

헤더 필수 항목

파이썬 환경 설정과 기본 라이브러리

파이썬 3.10 이상에 requests, BeautifulSoup4, lxml, pandas만 설치하면 기본 셋업은 끝납니다. 가상환경(venv·conda)을 만들어 충돌을 방지하시는 것을 권장드려요. 동적 페이지(JavaScript 렌더링)가 필요한 경우 selenium이나 playwright를 추가하면 됩니다.

  • requests – HTTP 요청 송수신, 가장 가볍고 빠릅니다
  • BeautifulSoup4 – HTML 파싱, 초보자에게 직관적이에요
  • lxml – 파싱 속도 빠른 백엔드 엔진
  • pandas – 표 형태 데이터 정리·CSV 저장
  • ▲ playwright – 동적 페이지 처리 시 selenium 대체 추천

설치는 터미널에서 pip install requests beautifulsoup4 lxml pandas 한 줄이면 완료됩니다. VS Code나 PyCharm 같은 IDE에서 .py 파일을 만들고 import 문부터 시작하시면 돼요.

네이버 금융 뉴스 페이지 구조 분석

네이버 금융의 종목별 뉴스 URL은 https://finance.naver.com/item/news_news.naver?code=종목코드 형태입니다. 예를 들어 삼성전자(005930)의 뉴스 목록은 code=005930으로 접근하죠. 페이지네이션은 page 파라미터로 제어합니다. 시황·공시·해외증시 등 카테고리별 별도 URL도 제공되고요.

1

1단계

종목 코드와 페이지 번호로 URL 구성

2

2단계

requests로 HTML 받아오기, headers에 User-Agent 추가

3

3단계

BeautifulSoup으로 뉴스 리스트 td 셀렉터 추출

4

4단계

각 뉴스 상세 URL에 재요청해 본문 파싱

5

5단계

pandas DataFrame으로 정리 후 CSV 저장

뉴스 목록 표는 보통 table.type5 안에 위치하고, 각 행에 제목·언론사·날짜가 들어 있어요. 상세 본문은 별도 URL로 이동해야 받을 수 있는데, 인포스탁이나 연합뉴스 같은 외부 사이트로 리다이렉트되는 경우도 있어 예외 처리가 필요합니다.

실전 코드 예제와 본문 추출

네이버 금융 뉴스 크롤링 - 실전 코드 예제와 본문 추출

핵심 흐름을 의사코드로 정리하면 이렇습니다. requests.get(url, headers=헤더)로 응답을 받고, BeautifulSoup(res.text, ‘lxml’)로 파싱한 뒤 select 메서드로 원하는 요소를 골라내는 구조죠. headers에 User-Agent를 사람 브라우저처럼 위장해두지 않으면 차단되는 경우가 많더라고요.

요소 CSS 셀렉터 예시 추출 데이터
뉴스 행 table.type5 tr 제목·언론사·날짜 묶음
제목 td.title a 기사 제목 + 상세 URL
언론사 td.info 발행 매체명
날짜 td.date YYYY.MM.DD HH:MM
본문 div#newsct_article 기사 전체 텍스트

본문 추출 시에는 광고·기자정보·관련기사 박스를 제외해야 깨끗한 텍스트가 나와요. .decompose()로 불필요 태그를 제거하고 .get_text(separator=’\n’, strip=True)로 정리하면 됩니다. 네이버 금융 뉴스 크롤링의 품질은 이 후처리 단계에서 결정된다고 봐도 무방합니다.

크롤링 작업 시간 비중 – 셀렉터 분석35
크롤링 작업 시간 비중 – 예외 처리·후처리45
크롤링 작업 시간 비중 – 코드 작성 자체20

데이터 저장과 자동화 스케줄

수집한 뉴스는 pandas DataFrame으로 변환 후 to_csv() 또는 to_excel()로 저장하시면 됩니다. 대용량이거나 누적 분석이 필요하다면 SQLite·PostgreSQL 같은 DB에 적재하는 편이 확장성이 좋아요. 파일명에 날짜를 포함시키면 일자별 백업도 자연스럽게 이뤄집니다.

자동화는 윈도우에서 작업 스케줄러, macOS·리눅스에서 cron이 표준입니다. 매일 오전 8시에 .py 파일이 실행되도록 등록하면 야간 시황을 출근 전에 받아볼 수 있죠. 클라우드라면 GitHub Actions나 AWS Lambda + EventBridge 조합도 무료 한도 내에서 충분히 운용 가능합니다.

로컬 자동화

윈도우 작업 스케줄러·cron으로 매일 실행

클라우드 자동화

GitHub Actions 무료 2,000분으로 일일 실행

알림 연동

텔레그램 봇·슬랙 웹훅으로 요약 푸시

데이터 시각화

matplotlib·plotly로 키워드 빈도 추이 그래프

크롤링 결과를 그대로 두기보다 키워드 빈도, 언론사 분포, 종목별 뉴스 양 같은 2차 가공을 거치면 인사이트가 풍부해져요. 더 깊이 있는 가이드는 파이썬 공식 문서의 표준 라이브러리 섹션도 함께 참고하시면 좋습니다.

주의사항과 차단 방지 노하우

같은 IP로 초당 수십 건 요청을 보내면 거의 즉시 차단당해요. time.sleep(2)로 요청 간격을 두고, 헤더에 Referer·Accept-Language까지 채워주면 자연스러운 트래픽으로 인식됩니다. 장기 운용 시에는 프록시 로테이션이나 무료 프록시 풀을 활용할 수도 있죠. 다만 무료 프록시는 안정성이 떨어지니 학습용으로만 권합니다.

요청 실패 시 재시도 로직도 필수입니다. requests의 Session 객체와 urllib3 Retry를 결합하면 5xx 오류 발생 시 자동으로 3회 재시도하게 만들 수 있어요. try-except로 네트워크 예외, 셀렉터 누락, 인코딩 깨짐 같은 케이스를 모두 잡아야 자동화가 안정적으로 돕니다.

절대 하지 말아야 할 것

동시 다발 요청, 로그인 필요한 페이지 무단 접근, 수집 데이터 상업적 재배포 – 세 가지는 법적 분쟁으로 이어질 수 있으니 피하세요

“크롤링은 도구일 뿐 – 매너 있는 요청과 꾸준한 셀렉터 점검이 안정성의 본질입니다”

자주 묻는 질문 (FAQ)

Q1. 네이버 금융 뉴스 크롤링이 합법인가요?

개인 학습·분석 목적의 소량 수집은 일반적으로 허용된다고 평가받습니다. 다만 robots.txt를 존중하고 상업적 재배포는 피하셔야 해요. 정확한 판단은 변호사 상담을 권합니다.

Q2. requests로 받았는데 한글이 깨질 때 어떻게 해결하나요?

res.encoding = ‘utf-8’ 또는 ‘euc-kr’로 명시 지정하시면 됩니다. 네이버 금융은 utf-8이 기본이지만 일부 외부 매체 페이지는 euc-kr을 사용하니 응답 헤더의 charset을 먼저 확인하세요.

Q3. 페이지가 동적으로 로딩되는 경우는 어떻게 처리하나요?

JavaScript로 데이터를 그리는 페이지라면 requests만으로는 한계가 있어요. selenium 또는 playwright로 실제 브라우저를 구동하거나, 개발자 도구 Network 탭에서 XHR/fetch 요청 URL을 직접 호출하는 방법이 효율적입니다.

Q4. 크롤링 자동화 시 알림은 어떻게 받나요?

텔레그램 봇 토큰을 발급받아 sendMessage API로 푸시하는 방식이 가장 간단하더라고요. 5줄 정도의 코드로 수집 결과 요약을 휴대폰으로 받을 수 있어요. 슬랙 웹훅, 디스코드 웹훅도 비슷한 방식으로 구현 가능합니다.

Q5. 차단당하지 않으려면 요청 빈도를 어떻게 조절해야 할까요?

시간당 100~200건 이내, 요청 간격 1~3초가 안전권으로 알려져 있어요. 야간 시간대(02~05시) 분산 실행, 사용자 에이전트 다양화, 프록시 로테이션을 결합하면 장기 운영에서도 안정적인 수집이 가능합니다.

Similar Posts