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

아래는 네이버 금융의 시가총액 순위 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 설정을 추가하는 것이 가장 안전한 방법입니다.

Leave a Comment