앞에서 파이썬을 이용하여 주식 데이터를 크롤링하기 위해서 단계적으로 진행했는데, 이제 한 사이클을 실행할 수 있는 코드를 작성했다. 차근차근 앞의 해결책들을 따라해봤다면 아래 코드는 이전의 내용을 정리한 것이라 보면 된다.
전체 코드 정리
편의를 위해서 앞의 코드를 한곳에 모아두었으니 필요한 경우 사용하길 바란다. 이대로 진행하면 코스피 전체 종목의 체크항목 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개만 가져왔고 코스닥 종목은 아직 가져오지 못했다. 물론 위의 내용을 복사해서 붙여넣고 체크항목과 코스피 페이지를 코스닥 주소로 변경해서 실행해도 된다.
하지만 이렇게 작업하면 유사한 작업으로 인해 코드가 굉장히 길어질 뿐 아니라 향후에 수정이 생긴다면 같은 부분을 복사해서 붙여넣은 부분을 하나씩 변경해 주어야 한다.
따라서 여기서 같은 동작을 하는 부분은 함수로 지정하여 체크항목만 변경하고 코스피 페이지를 코스닥 페이지로 변경하여 작업할 수 있도록 만들어 둔다면 향후 관리하기도 훨씬 편리해 질것이다.
다음 부분은 이 부분에 대해 함수 정의를 통해 전체 체크항목 정보와 코스닥 정보까지 모두 가져올 수 있도록 진행하겠다. 다만 이 부분에 대해서는 조금 시간이 필요할 것으로 보인다.
또 앞의 코드에 대해 좀 더 자세한 내용을 공부하고 싶다면 아래 링크들을 하나씩 참고하면 된다.
'방구석코딩 > 주식 크롤링 분석' 카테고리의 다른 글
[파이썬] 주식 크롤링 매크로화(2) - 체크박스 해제 함수정의(코드분석) (0) | 2024.07.25 |
---|---|
[파이썬] 주식 크롤링 매크로화(1) - 함수정의 및 사전작업 (4) | 2024.07.23 |
[파이썬] 주식 데이터 크롤링(7) - csv로 저장 (2) | 2024.07.16 |
[파이썬] 주식 데이터 크롤링(6) - 웹 페이지 데이터 가져오기 (for문) (0) | 2024.07.12 |
[파이썬] 주식 데이터 크롤링(5) - 웹 브라우저 체크박스 선택 (selenium) (0) | 2024.07.11 |
댓글