인공지능 및 빅데이터

웹 크롤링 예제(네이버 금융 시가총액 크롤링)

아래는 네이버 금융의 시가총액 순위 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개) 크롤링.

  1. requests.get()에서 User-Agent 설정을 추가해 네이버 차단을 방지.
  2. pd.read_html()로 HTML 테이블을 추출, 필요 없는 빈 행 제거.
  3. sleep(1)을 사용해 서버 부하 방지.
  4. 모든 데이터를 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 설정을 추가하는 것이 가장 안전한 방법입니다.

zerg96

Recent Posts

타입스크립트 (TypeScript)

1. 타입스크립트 개요 타입스크립트(TypeScript)는 마이크로소프트(Microsoft)가 개발한 자바스크립트(JavaScript)의 상위 집합(Superset) 언어입니다.즉, 자바스크립트에 정적 타입(Static Type)을 추가하고,…

5개월 ago

노트북(윈도우)에서 아이폰 유선 테더링 하기

윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…

6개월 ago

오라클 래치(Latch)

오라클 데이터베이스의 성능을 논할 때, 내부적으로 발생하는 경합(Contention)은 피할 수 없는 주제다. 특히 다수의 프로세스가…

7개월 ago

사장님도 3표, 나도 3표? ‘3%룰’ 완전 정복!

안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…

7개월 ago

Vector Store(벡터 스토어)

'벡터 스토어' 완벽 가이드: AI 시대, 데이터의 새로운 심장을 만나다 IT 업계는 인공지능(AI)이라는 거대한 패러다임의…

7개월 ago

Gemini CLI (재미나이 CLI)

1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…

7개월 ago