파이썬 주식 크롤링 소스 코드 엑셀 저장 가이드

목차
  1. 주식 크롤링의 기본 구조
  2. 필요한 라이브러리와 저장 형태
  3. 파이썬 소스 코드 기본 예시
  4. 엑셀 저장과 시트 분리 방식
  5. 오류가 자주 나는 지점과 대응
  6. 실전 저장 예시와 확장 범위
주식 크롤링

주식 크롤링은 공개된 주가 데이터와 종목 정보를 파이썬으로 수집한 뒤 엑셀 파일로 저장하는 작업이다. 네이버 금융, 한국거래소, 증권사 페이지처럼 구조가 반복되는 화면에서 특히 자주 쓰인다. 코드가 단순해 보여도 저장 형식, 요청 간격, 테이블 구조가 맞지 않으면 결과가 쉽게 깨진다.

  • 핵심 범위: 종목명, 시가, 고가, 저가, 종가, 거래량
  • 저장 방식: pandas DataFrame, Excel 파일, 시트 분리
  • 주의 조건: 과도한 요청, 동적 페이지, 표 구조 변경

주식 크롤링의 기본 구조

주식 크롤링은 HTML 표를 읽고 필요한 열만 추출한 뒤 정형 데이터로 바꾸는 과정이다. 파이썬에서는 requests로 페이지를 가져오고 BeautifulSoup으로 태그를 읽은 다음 pandas로 표를 엑셀 형식에 맞게 다룬다.

국내 주식 데이터는 페이지 구조가 반복되는 경우가 많아 코드가 짧게 끝나는 편이다. 반면 버튼 클릭 뒤 값이 바뀌는 동적 화면은 Selenium 같은 브라우저 자동화 도구가 필요하다. 정적 페이지와 동적 페이지의 처리 방식은 다르다.

네이버 금융의 종목별 시세 페이지, KRX의 시장 데이터 페이지, 종목 리스트 페이지는 자주 출발점이 된다. 화면에 보이는 값이 표 형태로 내려오면 저장은 비교적 단순하다. 문자열로 보이는 숫자에 쉼표와 부호가 섞여 있으면 먼저 정수형으로 바꾸는 과정이 필요하다.

필요한 라이브러리와 저장 형태

주식 크롤링에서 자주 쓰는 라이브러리는 requests, BeautifulSoup, pandas, openpyxl이다. requests는 페이지 요청, BeautifulSoup은 태그 해석, pandas는 표 정리, openpyxl은 엑셀 저장에 쓰인다.

엑셀 저장은 보통 DataFrame을 바로 xlsx 파일로 내보내는 방식이다. 시트 하나에 일별 시세를 쌓기도 하고, 종목별 시트를 따로 만들기도 한다. 같은 파일 안에 원본, 정제본, 요약본을 분리하면 이후 재사용이 쉽다.

도구 역할 주요 용도
requests 페이지 요청 정적 HTML 수집
BeautifulSoup 태그 파싱 표 구조 해석
pandas 데이터프레임 처리 정리, 결측 제거, 병합
openpyxl 엑셀 엔진 xlsx 저장, 시트 관리

엑셀은 금융 업무에서 여전히 활용도가 높다. 투자 메모, 종목 비교표, 일별 수집 로그를 한 파일에 넣기 쉽다. 주식 크롤링 결과를 CSV로 저장한 뒤 다시 엑셀로 변환하는 방식도 흔하다.

파이썬 소스 코드 기본 예시

가장 단순한 구조는 한 종목의 표를 읽어 DataFrame으로 바꾸고 엑셀로 저장하는 흐름이다. 종목코드가 정해져 있으면 URL만 바꿔 여러 종목에 적용할 수 있다.

아래 예시는 네이버 금융 계열의 정적 표를 가져오는 형태를 가정한 코드이다. 실제 페이지 구조에 따라 선택자와 열 이름은 조정된다. 사이트별 HTML 구조에 맞춰 주식 크롤링 코드를 작성한다.

import requests import pandas as pd from bs4 import BeautifulSoup url = "https://finance.naver.com/item/sise_day.naver?code=005930&page=1" headers = { "User-Agent": "Mozilla/5.0" } res = requests.get(url, headers=headers) res.encoding = "euc-kr" dfs = pd.read_html(res.text) df = dfs[0].dropna() df.columns = ["날짜", "종가", "전일비", "시가", "고가", "저가", "거래량"] df.to_excel("samsung_stock.xlsx", index=False)

이 코드는 표를 읽어 바로 저장하는 가장 짧은 형태다. 실전에서는 페이지를 여러 장 반복 조회하고, 필요 없는 줄을 제거하고, 날짜 형식을 통일하는 단계가 추가된다. 저장 파일명에 종목명과 날짜를 넣으면 관리가 쉬워진다.

행 단위로 쌓을 때는 빈 행 제거와 중복 날짜 제거가 중요하다. 일별 크롤링을 30일치만 돌려도 중복 수집이 섞이기 쉽다. 주식 크롤링 결과를 엑셀로 저장할 때는 저장보다 정리 단계가 더 오래 걸린다.

엑셀 저장과 시트 분리 방식

엑셀 저장은 한 번의 저장으로 끝나지 않는다. 원본 데이터, 정제 데이터, 종목 비교표를 분리하면 나중에 다시 열었을 때 구조가 무너지지 않는다. pandas의 ExcelWriter를 쓰면 여러 시트를 한 파일에 넣을 수 있다.

일별 시세 파일은 종목 하나당 한 시트, 시장 전체 데이터는 날짜별 한 시트로 구성하는 방식이 자주 쓰인다. 파일명 규칙도 중요하다. 종목코드, 종목명, 수집일을 함께 넣어야 덮어쓰기 충돌이 줄어든다.

다음 형태가 자주 사용된다.

  1. 원본 표 수집
  2. 필요 열만 추출
  3. 문자열 숫자 변환
  4. 중복 행 제거
  5. 엑셀 시트별 저장

여러 종목을 묶을 때는 하나의 통합 파일보다 종목군별 분리가 유리한 경우가 많다. 코스피 대형주, 코스닥 성장주, 배당주처럼 목적별로 나누면 조회 속도가 안정적이다. 주식 크롤링 결과를 장기 보관할 때는 xlsx와 csv를 함께 두는 방식도 쓸 만하다.

오류가 자주 나는 지점과 대응

가장 흔한 오류는 표 구조가 바뀌는 경우다. 열 이름이 바뀌거나 광고 영역이 끼어들면 pandas.read_html의 첫 번째 표가 원하던 데이터가 아닐 수 있다. 이때는 표 인덱스를 다시 확인해야 한다.

두 번째 문제는 요청 차단이다. 짧은 시간에 많은 페이지를 반복 호출하면 응답이 느려지거나 빈 값이 내려온다. time.sleep으로 요청 간격을 두고, 같은 페이지를 과도하게 반복하지 않는 방식이 필요하다. 주식 크롤링은 안정성을 우선한다.

세 번째 문제는 인코딩이다. 국내 금융 페이지는 euc-kr을 쓰는 경우가 있어 한글이 깨질 수 있다. res.encoding을 맞추지 않으면 종목명과 날짜가 이상하게 저장된다. 네 번째 문제는 숫자 형식이다. 쉼표가 들어간 거래량, 마이너스 부호가 붙은 등락률은 변환 단계에서 정리해야 계산이 정상 작동한다.

동적 페이지는 requests만으로 값이 비어 보일 수 있다. 이 경우 Selenium으로 화면을 연 다음 표를 가져와야 한다. 수집 경로에 따라 저장 코드를 다르게 작성한다. 주식 크롤링에서 도구 선택은 페이지 구조를 먼저 읽는 데서 결정된다.

실전 저장 예시와 확장 범위

실전에서는 한 종목의 일별 주가만 저장하지 않는다. 거래량, 시가총액, PER, 외국인 보유율, 투자자별 매매동향까지 함께 쌓는 경우가 많다. 파일 하나에 쌓으면 비교가 쉽고, 시트별로 나누면 추적이 편하다.

저장 범위가 넓어질수록 코드보다 폴더 관리가 중요해진다. 원본, 가공본, 백업본을 같은 폴더에 두면 파일 충돌이 자주 난다. 날짜별 하위 폴더를 두고 정기 실행 결과를 따로 저장하면 누적 관리가 쉬워진다.

주식 크롤링은 단발성 메모보다 반복 수집에서 가치가 커진다. 1회 수집으로 끝나는 데이터보다 30일, 90일, 1년 단위로 쌓인 데이터가 분석에 직접 쓰인다. 엑셀 저장은 그 누적의 출발점이다.

최종 파일을 만들 때는 날짜 순 정렬, 결측 제거, 열 순서 고정이 기본이다. 이 3가지만 맞춰도 파일 품질이 안정된다. 저장된 엑셀은 차트 작성, 피벗 테이블, 조건부 서식과 바로 연결된다.

주식 크롤링은 파이썬 코드만으로 끝나지 않는다. 요청 방식, 표 구조, 인코딩, 엑셀 저장 방식이 함께 맞아야 결과가 쓸 만해진다. 네이버 금융처럼 반복 구조가 명확한 페이지에서는 주식 크롤링과 엑셀 저장의 결합이 특히 단순하다.

Add a comment

답글 남기기

금융리더 편집팀
CHIEF EDITOR 금융리더

2023년부터 대출·부동산·절세·투자 분야의 금융 정보를 한국은행·금융감독원 공식 데이터 기반으로 정리하고 있습니다. 복잡한 자본의 언어를 일상의 언어로 번역하는 것이 목표이며, 특정 금융사나 금융상품의 판매·홍보를 목적으로 하지 않습니다. 모든 분석은 공개된 공시 자료와 통계치에 근거하며, 독자 여러분의 의사결정에 실질적인 기준을 제시하는 것을 원칙으로 합니다.

전문 분야
주택담보대출 전세자금대출 대출 갈아타기 부동산 시장 분석 청약·분양 연금저축·IRP 절세 연말정산·세금 글로벌 매크로 주식·ETF 투자 신용점수·금리 비교
참고 공식 기관 및 데이터
한국은행 경제통계시스템(ECOS)
금융감독원 금융상품통합비교공시
국토교통부 실거래가 공개시스템
청약홈(한국부동산원) 분양 정보
통계청 소비자물가·가계동향 통계
금융위원회·기획재정부 공식 보도자료
편집·검수 프로세스
① 주제 선정
독자 수요·
자산 결정
직결 주제
② 자료 조사
공식 기관
원문 데이터
직접 확인
③ 작성
전문 용어
일상 언어로
번역
④ 사실 검토
수치·출처
교차 확인
기준일 표기
⑤ 정기 갱신
금리·제도
변경 시
즉시 업데이트

⚠️ 주의: 본 블로그에 게재된 모든 정보는 대출·투자·세금·부동산 등 금융 전반에 관한 일반적인 정보 제공을 목적으로 합니다. 특정 금융상품의 가입 권유, 투자 자문, 법률·세무 자문에 해당하지 않으며, 본 블로그는 금융상품 판매업자 또는 투자자문업자가 아닙니다. 모든 투자에는 원금 손실의 위험이 따르며, 투자·대출·보험 가입 등 일체의 금융 의사결정과 그 결과에 대한 최종 책임은 이용자 본인에게 있습니다. 중요한 결정 전에는 반드시 해당 금융기관과 전문가(세무사·변호사·투자상담사 등)의 확인을 받으시기 바랍니다. 면책조항 전문 →

#금융인사이트#투자분석#자본시장#공식데이터기반#독립편집

뉴스를 최신 상태로 유지하세요📌

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use