들어가며
네이버증권 국내주식 테마 크롤링 : (1)테마 번호 수집 포스팅을 시작하도록 하겠습니다.
최근 주식 시장에서 다양한 테마들이 투자자들에게 주목받고 있습니다. 특히 국내 주식 테마는 특정 산업, 기술, 트렌드 등에 따라 세분화되며, 관련 종목들이 테마에 맞춰 움직이는 경향이 있습니다. 이런 테마들을 파악하고 분석하는 것은 투자 전략을 세우는 데 큰 도움이 됩니다. 이번 포스팅에서는 네이버증권의 국내주식 테마 정보를 Python을 사용하여 효율적으로 크롤링하는 방법을 소개합니다.
먼저 아래 포스팅을 읽어보고 오시면 도움이 될 것 입니다.
네이버증권 테마 완벽 분석 및 엑셀 파일 공유 | 2024년 투자자가 알아야 할 핵심 테마 정리
네이버증권 테마 크롤링 순서
아쉽게도 네이버증권의 테마 관련 API가 없기때문에 부득이 실제 페이지를 띄워서 테마 관련 정보들의 url을 직접 추출해 보기로 하였습니다.
네이버증권 바로가기
우선 가장 먼저 네이버증권에 가보기로 하겠습니다.
국내증시 탭 바로가기
이어서 국내증시 탭을 클릭합니다. 아래 url을 살펴보면 기존 메인url에서 sise라는 경로가 추가된 것을 볼 수 있습니다.
https://finance.naver.com/sise
테마별 시세 바로가기
국내증시 페이지에서 테마 관련 내용으로 이동할 수 있는 UI를 찾아봅니다. 총 2군데가 있습니다. 아래 이미지상 2군데 중 하나를 클릭해 봅니다.
테마별 시세 페이지 분석
이처럼 테마별 시세 페이지에 도달하였습니다.
https://finance.naver.com/sise/theme.naver
해당 페이지를 아래로 내려보면 페이지 네비게이션 영역이 있으며 여기서 2page를 클릭해 봅니다.
그러면 기존 url에서 &page=2 파라미터가 생기는 것을 알 수 있습니다.
https://finance.naver.com/sise/theme.naver?&page=2
여기서 알 수 있는 사실은 page값을 3,4,5…대입해보면 역시 해당 페이지가 나오는 것을 확인할 수 있으실 것 입니다.
여기서 총 8페이지 까지 존재하는 것을 알 수 있어요.
본격적으로 네이버증권 테마 정보 크롤링 python 코드를 작성해보자
사실 아래 코드는 챗GPT(chatGPT) 의 도움을 받아서 코딩하였습니다.
내용은 간단합니다. https://finance.naver.com/sise/theme.naver?&page= 여기에 숫자를 1부터 8까지 대입하면서 실제 페이지를 띄워봅니다. 당연히 크롬브라우저를 띄울껀데 여기에 사용되는 모듈은 selenium을 사용할 것 입니다.
혹시 이렇게 python 코드를 작성하고 실행하는 이전 과정에 대해서 잘 모르는 분들은 아래 포스팅을 참고해 보시기 바랍니다.
import time
import pandas as pd
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import re # 정규식을 이용해 숫자 추출
# Chrome 옵션 설정
options = Options()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(service=Service(), options=options)
# URL 기본 설정
base_url = "https://finance.naver.com/sise/theme.naver?&page="
# 데이터를 저장할 리스트 초기화
data = []
# 페이지 순회 (1부터 8까지)
for page in range(1, 9):
# 각 페이지 URL로 이동
driver.get(base_url + str(page))
time.sleep(2) # 페이지 로딩 대기
# 페이지별로 `tr` 행 범위 설정
tr_start = 4
tr_end = 23 if page == 8 else 64
# 각 `tr` 행 순회
for tr_index in range(tr_start, tr_end + 1):
try:
# XPath로 `a` 태그 찾기
link_xpath = f'//*[@id="contentarea_left"]/table[1]/tbody/tr[{tr_index}]/td[1]/a'
link = driver.find_element(By.XPATH, link_xpath)
# 링크가 존재할 경우 테마명과 URL 추출
theme_name = link.text.strip()
theme_url = link.get_attribute('href')
# URL 끝의 숫자를 추출하여 theme_num에 저장
theme_num = re.search(r'\d+$', theme_url).group()
print(f"페이지 {page}, 행 {tr_index} - 테마명: {theme_name}, URL: {theme_url}, 테마 번호: {theme_num}")
# 데이터 리스트에 추가
data.append({"테마명": theme_name, "URL": theme_url, "theme_num": theme_num})
except Exception as e:
print(f"페이지 {page}, 행 {tr_index} - 요소를 찾을 수 없습니다:", e)
# 브라우저 닫기
driver.quit()
# DataFrame으로 변환하고 CSV로 저장
df = pd.DataFrame(data)
df.to_csv("theme_data.csv", index=False, encoding="utf-8-sig")
print("CSV 파일이 저장되었습니다: theme_data.csv")
결국 이렇게 얻은 정보들을 각각 변수 theme_name, theme_url, theme_num에 값을 담아서 각각 테마명, URL, theme_num 컬럼 이름으로 저장하도록 합니다. 이를 다시 theme_data.csv 파일에 저장해 보도록 하겠습니다.
위 내용에서 중요한 것은 바로 테마 번호 입니다. 이렇게 얻은 테마 번호를 가지고 다시 python코드를 작성해서 개별종목으로 접근하는 코드의 반복문 변수로 넣도록 하겠습니다.
마치며
이번 포스팅에서는 네이버증권의 국내주식 테마 정보를 파이썬으로 크롤링하는 방법을 소개했습니다. 네이버증권의 테마는 각각 테마번호로 접근할 수 있었으며, 향후 이번 포스팅에서 얻은 테마 번호를 가지고 개별종목으로 접근하는 코드도 작성해 보도록 하겠습니다. 따라서 많은 관심 가져주시면 감사하겠습니다.
댓글 남기기