아래는 네이버 금융의 시가총액 순위 1위부터 500위까지 데이터를 가져와 엑셀로 저장하는 Python 코드입니다.
🔹 설명
requests
를 사용하여 네이버 금융 페이지의 HTML을 가져옵니다.pandas.read_html()
을 이용해 테이블을 추출합니다.- 1페이지부터 10페이지까지(50개 × 10페이지 = 500개) 크롤링합니다.
- 모든 데이터를 하나의 DataFrame으로 합쳐 엑셀 파일(
market_cap_500.xlsx
)로 저장합니다.
✅ Python 코드
import pandas as pd
import requests
from time import sleep
# 저장할 엑셀 파일명
excel_filename = "market_cap_500.xlsx"
# 네이버 금융 시가총액 페이지 URL (코스피 기준, sosok=0)
base_url = "https://finance.naver.com/sise/sise_market_sum.naver?sosok=0&page="
# HTTP 요청 헤더 (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"
}
# 데이터 저장 리스트
all_data = []
# 1페이지부터 10페이지까지 크롤링 (1~500위)
for page in range(1, 11):
url = base_url + str(page)
response = requests.get(url, headers=headers)
if response.status_code != 200:
print(f"페이지 {page} 가져오기 실패!")
continue
# HTML 테이블에서 데이터 추출
tables = pd.read_html(response.text)
if tables:
df = tables[1] # 두 번째 테이블이 시가총액 데이터
df = df.dropna(how="all") # 빈 행 제거
all_data.append(df)
print(f"페이지 {page} 크롤링 완료...")
sleep(1) # 서버 부하 방지를 위해 1초 대기
# 모든 페이지 데이터 합치기
final_df = pd.concat(all_data, ignore_index=True)
# 엑셀 파일로 저장
final_df.to_excel(excel_filename, index=False)
print(f"✅ 시가총액 1~500위 데이터가 '{excel_filename}' 파일로 저장되었습니다!")
📌 코드 주요 특징
네이버 금융 시가총액 페이지에서 1~10페이지(총 500개) 크롤링.
requests.get()
에서 User-Agent 설정을 추가해 네이버 차단을 방지.pd.read_html()
로 HTML 테이블을 추출, 필요 없는 빈 행 제거.sleep(1)
을 사용해 서버 부하 방지.- 모든 데이터를
pandas.concat()
으로 합쳐 엑셀 파일(market_cap_500.xlsx
)로 저장.
🎯 실행 결과
market_cap_500.xlsx
파일이 생성되며, 엑셀에서 시가총액 1위~500위 기업 리스트를 확인할 수 있습니다.

실제 데이터가 생성되었고 엑셀파일로 저장되었음을 확인할 수 있습니다.
중간에 헤더에 User-Agent
는 왜 설정해둔걸까요?
User-Agent
설정 이유
User-Agent
는 브라우저 또는 요청을 보내는 클라이언트의 정보를 서버에 전달하는 HTTP 헤더입니다. 이 설정을 하는 이유는 다음과 같습니다.
✅ 1. 네이버 금융의 봇(스크래핑) 차단 회피
네이버 금융(finance.naver.com
)은 특정 요청이 봇(Bot) 또는 자동화 프로그램에서 왔다고 판단하면 403 Forbidden (접근 차단) 응답을 보낼 수 있습니다.
이를 방지하기 위해 일반 웹 브라우저에서 접근하는 것처럼 보이도록 User-Agent
값을 설정합니다.
✅ 2. requests
기본 User-Agent
차단 가능성
Python의 requests
라이브러리를 사용하면 기본적으로 아래와 같은 User-Agent
를 사용합니다.
python-requests/2.25.1
이 값은 웹사이트에서 자동화된 봇 요청으로 인식될 가능성이 큽니다.
따라서, Chrome 브라우저의 User-Agent
값을 사용하여 사람이 접속한 것처럼 속이는 것이 중요합니다.
❓ 그럼 User-Agent
없이도 동작할까?
✔️ 네이버 금융의 크롤링 정책은 변경될 수 있으므로, 일부 경우에는 동작할 수도 있고, 일부 경우에는 차단될 수도 있습니다.
✔️ 만약 User-Agent
없이 실행했을 때 정상적으로 동작하면 굳이 추가할 필요는 없습니다. 하지만 장기적으로 안정성을 확보하려면 User-Agent
를 설정하는 것이 좋습니다.
🔥 테스트 방법
아래 두 가지 코드로 비교해보세요.
1️⃣ User-Agent
없이 실행
import requests
url = "https://finance.naver.com/sise/sise_market_sum.naver?sosok=0&page=1"
response = requests.get(url)
print(response.status_code) # 정상적으로 작동하면 200, 차단되면 403 또는 다른 코드가 나옴
print(response.text[:500]) # 응답 HTML 일부 확인
2️⃣ User-Agent
추가 후 실행
import requests
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"
}
response = requests.get(url, headers=headers)
print(response.status_code)
print(response.text[:500])
결론
User-Agent
없이도 동작할 수도 있지만, 차단될 가능성이 있으므로 설정하는 것이 권장됨.- 안정적인 크롤링을 위해 Chrome 브라우저의
User-Agent
를 추가하는 것이 좋음. - 만약
403 Forbidden
오류가 발생하면,User-Agent
를 설정한 후 다시 시도하면 정상적으로 동작할 가능성이 큼.
🚀 따라서 User-Agent
설정을 추가하는 것이 가장 안전한 방법입니다.