Python/네이버증권API(New)

[Python/파이썬] 네이버증권 웹 크롤링 활용 - 몇 층에서 샀을까? (국장)

CODE.J 2025. 2. 16. 22:17
반응형

네이버증권에서 종목 정보를 보다면 이런 메뉴가 눈에 들어옵니다.


"삼성전자"를 예시로... https://m.stock.naver.com/investmentInfo/domestic/005930 링크를 들어가보면,
"투자자, 평균 단가, 평균 수익률"을 볼 수 있습니다.
 
문득 평균 단가나 평균 수익률을 투자에 참고하면 좋겠다는 생각이 들었습니다.
python 스크립트를 아래와 같이 작성합니다.
결과물은 csv로 저장하여 엑셀에서 데이터 검토하고자 합니다.

import time
import csv
from multiprocessing import Pool, cpu_count, freeze_support
import pandas as pd
import requests
from bs4 import BeautifulSoup
import re  # 정규 표현식 사용

def extract_number(text):
    """문자열에서 숫자만 추출 후 정수로 변환"""
    numbers = re.sub(r"[^\d]", "", text)  # 숫자가 아닌 문자 제거
    return int(numbers) if numbers else 0  # 변환 후 반환 (비어있으면 0 반환)

# 한국거래소에서 종목 코드 받아오기
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13')[0]
code_df.종목코드 = code_df.종목코드.map('{:06d}'.format)  # 6자리 코드 맞추기
code_df = code_df[['회사명', '종목코드']]  # 필요한 컬럼만 선택
stock_list = code_df.values.tolist()  # 리스트 변환

def investor_info(stock):
    time.sleep(1)
    url = f'https://m.stock.naver.com/investmentInfo/domestic/{stock[1]}'
    page_url = f"https://finance.naver.com/item/main.naver?code={stock[1]}"
    
    #로봇으로 감지 못하도록 추가 했지만... 효과는 잘 모르겠습니다!
    headers = {
        "User-Agent": "Mozilla/5.0"
    }

    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()  # 응답 코드 확인 (200이 아니면 예외 발생)

        soup = BeautifulSoup(response.text, 'html.parser')

        # "Floor_text__TKfxc" 클래스를 가진 strong 태그 가져오기
        strong_tags = soup.find_all("strong", class_="Floor_text__TKfxc")

        # 최소 3개 이상 데이터가 있어야 함
        if len(strong_tags) >= 3:
            return [
                stock[0],  # 종목명
                stock[1],  # 종목 코드
                extract_number(strong_tags[0].text.strip()),  # 총 투자자 (정수 변환)
                extract_number(strong_tags[1].text.strip()),  # 평균 단가 (정수 변환)
                strong_tags[2].text.strip(),  # 평균 수익률
                page_url  # 종목 링크
            ]
        else:
            print(f"[데이터 부족] {stock[0]} ({stock[1]})")
            return None  # 데이터 부족 시 None 반환

    except requests.exceptions.RequestException as e:
        print(f"[요청 오류] {stock[0]} ({stock[1]}): {e}")
        return None  # 요청 실패 시 None 반환

if __name__ == "__main__":
    freeze_support()  # PyInstaller 용

    # 투자자 정보를 담을 리스트
    investor_info_list = []
    
    # 병렬 처리
    with Pool(cpu_count()) as pool:
        results = pool.map(investor_info, stock_list)

    # None 값 필터링 (실패한 종목 제거)
    investor_info_list = [res for res in results if res]

    # CSV 파일로 저장
    with open("investor_info.csv", mode="w", newline="", encoding="ANSI") as file:
        writer = csv.writer(file)
        writer.writerow(["종목명", "종목 코드", "총 투자자(수)", "평균 단가(원)", "평균 수익률", "종목 링크 (네이버)"])  # 헤더 추가
        writer.writerows(investor_info_list)  # 데이터 추가

    print("CSV 저장 완료!")

 
csv 저장 결과를 열어봅니다. 열고나서 "총 투자자(수)" 정보를 내림차순 했습니다.

 
투자자수를 보자마자 역시 국장은 "삼성전자"라는 생각과 함께... 
몇만명의 사람들이 20~50% 이상의 손해를 보고 있다는 점이 많이 놀라웠습니다. 😢
 
평균 단가의 계산 방식이 전체 보유 수량 단가를 반영한 것인지 모르겠습니다만...
투자자 개개인으로 보면 적은 금액이던, 큰 금액이던 수익률이 형평 없는 것으로 보여 씁쓸합니다.
 
아무쪼록 국장도 다시 살아나서 많은 분들이 원금도 회복하고 돈도 많이 벌 수 있는 상황이 오길 기대합니다.
 
 

반응형