본문 바로가기
방구석코딩/주식 크롤링 분석

[파이썬] 주식 데이터 크롤링(8) - 전체 코드 및 향후 해결사항

by 석세상 2024. 7. 18.
반응형

앞에서 파이썬을 이용하여 주식 데이터를 크롤링하기 위해서 단계적으로 진행했는데, 이제 한 사이클을 실행할 수 있는 코드를 작성했다. 차근차근 앞의 해결책들을 따라해봤다면 아래 코드는 이전의 내용을 정리한 것이라 보면 된다.

 

전체 코드 정리

편의를 위해서 앞의 코드를 한곳에 모아두었으니 필요한 경우 사용하길 바란다. 이대로 진행하면 코스피 전체 종목의 체크항목 6개의 정보를 csv 파일에 저장하는 것은 무리가 없다. 

import os                                        # 파일 저장 여부를 확인하는 모듈

import pandas as pd                              # 데이터 분석 및 핸들링 모듈
from selenium import webdriver                   # selenium : 웹브라우저 핸들링을 위한 도구 모음
from selenium.webdriver.common.by import By      # 
import requests                                  # HTTP 요청을 보내고 응답을 받는 데 사용되는 라이브러리
from bs4 import BeautifulSoup                    # 웹 스크래핑 및 데이터 추출을 위한 라이브러리


#########################################################################
# 01. kospi 페이지 정보 및 브라우저 실행
#########################################################################
browser = webdriver.Chrome()
browser.maximize_window()
p_url = 'https://finance.naver.com/sise/sise_market_sum.naver?sosok=0&page='   # kospi url 초기값
browser.get(p_url)


#########################################################################
# 02.증권 페이지 체크박스 항목 해제하기
#########################################################################
# 증권 페이지 체크박스 항목 해제하기
# 크롬에서 마우스 우클릭 ▶︎ 검사
# 마우스를 얹어보면 체크되어 있는 항목은 td.choice, 체크되지 않은 항목은 그냥 td로만 나타남
# 소스코드를 보면 <td class ="choice">로 클래스로 구분되어있음

# 전체 체크박스 목록 가져오기 함수
chkboxs =  browser.find_elements(By.NAME, 'fieldIds') # browser.find_elements : 해당 브라우저에서 엘리먼트를 찾을건데 NAME이 fieldIds인 것을 가져옴
                                                      # 여기서 find_elements로 쓰면 fieldIds가 여러개 있기 때문에 모두 가져오기 위한 것

# 반복문을 통해서 체크박스가 선택되어 있으면 선택해제하는 명령
for chkbox in chkboxs :
    if chkbox.is_selected() : # 체크박스가 체크가 되어있는지 확인하는 명령 for문에 입력한 객체로 넣어주어야 함(chkbox)
        chkbox.click()        # 체크가 된 항목이라면 클릭 명령을 통해 체크 해제



#########################################################################
# 03. 선택항목 입력 및 적용
#########################################################################

# 선택항목
slct_item = ['거래량','시가','고가','저가','매수호가','매도호가']

chkboxs =  browser.find_elements(By.NAME, 'fieldIds')

# 라벨로 가져오려면 현재는 input 부분을 가져왔기 때문에 윗단계인 td로 들어가서 다시 라벨로 내려와서 처리해야 함
for chkbox in chkboxs :
    parent = chkbox.find_element(By.XPATH, '..')            # 윗단계인 td로 가는 명령, XPATH를 이용해서 윗단계로 갈 수 있음, 
                                                            # By는 경로를 이동할 때 사용하는 것으로 보임
                                                            # .. 이 상위 단계로 가는 값으로 보임
    label = parent.find_element(By.TAG_NAME, 'label')       # parent 하위 label 태그를 찾는 방법, TAG_NAME은 명령문으로 봐야함
#    print(label)
#    print(label.text)                                      # 라벨을 잘 불러왔는지 확인용

    if label.text in slct_item :                            # label.text : 라벨이라는 객체안의 text값을 가져옴
        chkbox.click()                                      # 체크박스 체크

# 적용하기 버튼 클릭하기
# 적용하기 버튼을 클릭해야 데이터가 변경됨
button = browser.find_element(By.XPATH, '//a[@href="javascript:fieldSubmit()"]')
button.click()


#########################################################################
# 04. 데이터 가져오기 및 csv 파일 저장
#########################################################################
p_url = 'https://finance.naver.com/sise/sise_market_sum.naver?sosok=0&page='

#############################################
# (1) 1페이지부터 마지막 페이지까지 필요 테이블 불러오기
for idx in range(1, 46) :            # 마지막 페이지까지 반복, mk_lspg_num 해당 시장 종목 페이지 마지막 번호
    browser.get(p_url + str(idx))                # http 주소는 문자이기 때문에 str을 이용하여 숫자를 문자로 변경해줘야함
    df = pd.read_html(browser.page_source)[1]     # 아래에서 각 테이블 정보를 확인해서 필요한 정보가 들어있는 [1] 테이블의 정보를 가져옴
    
    #############################################
    # (2) 불필요한 데이터 정제
    # 전체가 NaN인 데이터를 보면 네이버증권에서 확인해보면 선이 그려진 부분으로 데이터가 없는 부분임, 소스코드 확인

    df.dropna(axis = 'index', how = 'all', inplace = True)
    df.dropna(axis = 'columns', how = 'all', inplace = True)       # columns는 컬럼 기준으로 적용
    
    #############################################
    # (3) 반복문 실행 시 df의 데이터를 csv에 누적하여 저장
    f_name = '/Users/hd/Documents/python/stock_pgm/01.raw_data/kospi.csv'

	# 파일이 있다면 헤더 제외
	if os.path.exists(f_name) :
    	df.to_csv(f_name, encoding = 'utf-8-sig', mode = 'a', index = False, header = False)

	# 파일이 없는 경우 헤더 포함, 첫 파일 생성 시
	else :
    	df.to_csv(f_name, encoding = 'utf-8-sig', mode = 'a', index = False, header = True)

 

만약 패키지가 설치되지 않았다라고 한다면 주피터노트북을 이용하는 사람의 경우 아래와 같이 설치해주면 된다. 그 외의 경우는 느낌표를 제외하고 실행해주면 된다.

# !pip install 패키지명

!pip install selenium
!pip install webdriver_manager

 

향후 해결할 부분

현재 코스피 전 종목을 가져왔지만 체크박스의 항목은 6개만 가져왔고 코스닥 종목은 아직 가져오지 못했다. 물론 위의 내용을 복사해서 붙여넣고 체크항목과 코스피 페이지를 코스닥 주소로 변경해서 실행해도 된다.

 

하지만 이렇게 작업하면 유사한 작업으로 인해 코드가 굉장히 길어질 뿐 아니라 향후에 수정이 생긴다면 같은 부분을 복사해서 붙여넣은 부분을 하나씩 변경해 주어야 한다.

 

따라서 여기서 같은 동작을 하는 부분은 함수로 지정하여 체크항목만 변경하고 코스피 페이지를 코스닥 페이지로 변경하여 작업할 수 있도록 만들어 둔다면 향후 관리하기도 훨씬 편리해 질것이다.

 

다음 부분은 이 부분에 대해 함수 정의를 통해 전체 체크항목 정보와 코스닥 정보까지 모두 가져올 수 있도록 진행하겠다. 다만 이 부분에 대해서는 조금 시간이 필요할 것으로 보인다.

 

또 앞의 코드에 대해 좀 더 자세한 내용을 공부하고 싶다면 아래 링크들을 하나씩 참고하면 된다.

 

[파이썬] 증권 전 종목 크롤링 하기 (1) - 사전 작업

파이썬을 통해 증권 정보를 크롤링 하는 방법에 대해서는 여러 자료에서 찾아볼 수 있다. 하지만 내가 원하는 전 종목, 모든 항목에 대해서 한번에 크롤링 할 수 있는 자료를 찾는 건 쉽지 않았

gusugi.tistory.com

 

[파이썬] 증권 전 종목 크롤링(2) - 필요 패키지

파이썬을 통해 주식 데이터 크롤링을 위해서 어떤 패키지가 필요한지 알아보고 웹브라우저를 핸들링할 수 있는 방법을 알아보겠다. 한번에 모든 내용을 자세히 적기에는 양이 많기 때문에 하나

gusugi.tistory.com

 

[파이썬] 주식 데이터 크롤링(3) - 웹 브라우저 자동 실행(webdriver)

이번에는 주식 정보 크롤링을 위한 실질적인 코드 작성이 들어가는 단계이다. 네이버 증권에 있는 주식 정보를 불러오는 방법이다.  웹 브라우저 실행주식 데이터 크롤링을 하기 위해서는 맨

gusugi.tistory.com

 

[파이썬] 주식 데이터 크롤링(4) - 웹 브라우저 체크박스 해제 (selenium)

파이썬을 이용한 주식 데이터 크롤링을 위해 앞에서 사전준비 할 내용과 필요 패키지, 웹 브라우저 자동 실행에 대해서 알아보았다. 이번에는 실행한 웹 브라우저에서 네이버 증권의 체크박스

gusugi.tistory.com

 

[파이썬] 주식 데이터 크롤링(5) - 웹 브라우저 체크박스 선택 (selenium)

앞에서 파이썬을 이용하여 주식데이터 크롤링을 위해 체크박스를 해제하는 부분까지 진행하였다. 그러면 이제 웹 브라우저에서 내가 원하는 항목의 체크박스를 클릭하는 방법에 대해 알아보겠

gusugi.tistory.com

 

[파이썬] 주식 데이터 크롤링(6) - 웹 페이지 데이터 가져오기 (for문)

파이썬을 주식 데이터 크롤링을 위해서는 앞부분까지는 웹 브라우저에서 실행 및 제어하는 부분이었다면, 이제는 이렇게 원하는 페이지의 정보를 파이썬으로 데이터를 가져오는 영역이다. 데

gusugi.tistory.com

 

[파이썬] 주식 데이터 크롤링(7) - csv로 저장

앞에서 파이썬을 이용하여 주식 데이터 크롤링을 위해 웹 페이지에 있는 정보를 파이썬으로 가져오는 부분까지 진행했다.하지만 반복문을 수행하면서 동일한 데이터프레임명으로 저장하는 과

gusugi.tistory.com

 

728x90
반응형

댓글