인공지능 및 빅데이터

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

아래는 네이버 금융의 시가총액 순위 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

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

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

3일 ago

오라클 래치(Latch)

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

1주 ago

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

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

3주 ago

Vector Store(벡터 스토어)

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

3주 ago

Gemini CLI (재미나이 CLI)

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

3주 ago

과적합 (overfitting)

과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…

1개월 ago