"코스피, 코스닥에 상장되어 있는 기업의 재무 데이터 중 6가지 데이터(PER, PBR, ROE, etc.)를 네이버 증권 사이트를 이용하여, 스크래핑 수행 후, CSV파일로 해당 데이터들을 로컬 컴퓨터에 저장하는 작업 수행"
데이터는 최대 6가지 선택이 가능한데, 조회 항목을 바꾸고 싶다면, https://finance.naver.com/sise/sise_market_sum.naver?sosok=1 로 접속하여, 조회 항목 리스트를 보고, want_to_select 변수에 담긴 리스트 내용 수정.
# 원하는 조회 항목 선택
want_to_select = ["시가총액", "PER", "ROE", "PBR", "매출액증가율", "유보율"] # 최대 6가지 선택 가능
for check_box in check_boxes:
parent = check_box.find_element(By.XPATH, "..") # 부모 태그 선택
lable = parent.find_element(By.TAG_NAME, "label") # 부모 태그 내 lable이라는 자식 태그 선택
if lable.text in want_to_select: # label 태그 이름이 원하는 항목 내 존재한다면
check_box.click() # 해당 체크 박스 선택
아래는 코스피, 코스닥 모든 상장 기업에 대한 주가 정보와 더불어 6가지 지표(시가총액(억원), 매출액 증가율(%), PER(배), ROE(%), PBR(배), 유보율(%))을 CSV 형식으로 저장 후, 엑셀로 열어, 매출액 증가율을 기준으로 정렬한 내용이다.
전체 소스 코드
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import pandas as pd
from io import StringIO
browser = webdriver.Chrome() # 크롬 브라우저 열기
browser.maximize_window() # 창 최대화
# 페이지 이동
url_kospi = "https://finance.naver.com/sise/sise_market_sum.naver?&page=" # 코스피 url
url_kosdaq = "https://finance.naver.com/sise/sise_market_sum.naver?sosok=1&page=" # 코스닥 url
browser.get(url_kosdaq)
time.sleep(1) # 브라우저에 내용 로드 완료 위해, 1초 휴식
# 조회 항목 초기화(즉 체크된 항목 초기화)
check_boxes = browser.find_elements(By.NAME, "fieldIds")
for check_box in check_boxes:
if check_box.is_selected(): # 만약 체크박스가 체크가 된 상태라면
check_box.click() # 체크 해제
# 원하는 조회 항목 선택
want_to_select = ["시가총액", "PER", "ROE", "PBR", "매출액증가율", "유보율"] # 최대 6가지 선택 가능
for check_box in check_boxes:
parent = check_box.find_element(By.XPATH, "..") # 부모 태그 선택
lable = parent.find_element(By.TAG_NAME, "label") # 부모 태그 내 lable이라는 자식 태그 선택
if lable.text in want_to_select: # label 태그 이름이 원하는 항목 내 존재한다면
check_box.click() # 해당 체크 박스 선택
# 적용하기 버튼 클릭
btn_apply = browser.find_element(By.XPATH, '//a[@href="javascript:fieldSubmit()"]')
btn_apply.click()
time.sleep(1) # 1초 휴식
# 코스닥에 대해서
for i in range(1, 40 + 1): # 1 ~ 40 페이지까지 해당 작업 반복 # 24.04.x 코스닥 기준 35페이지(총 1722개의 기업)까지 존재
# 페이지 넘어가기
browser.get(url_kosdaq + str(i))
# 데이터 추출
data_frame = pd.read_html(StringIO(browser.page_source))[1] # 1번째 인덱스에 해당하는 테이블 내용
data_frame.dropna(axis='index', how='all', inplace=True) # 테이블 내 행(row)의 내용이 존재하지 않는면 삭제 후 적용
data_frame.dropna(axis='columns', how='all', inplace=True) # 테이블 내 열(column)의 내용이 존재하지 않는면 삭제 후 적용
if len(data_frame) == 0: # 특정 페이지 내의 내용이 존재하지 않는다면
break # 반복 작업 끝
# CSV 파일로 저장 # 엑셀로 파일 로드 가능
file_name = "kospi_kosdaq_companies.csv"
if os.path.exists(file_name): # 이미 파일이 존재한다면
data_frame.to_csv(file_name, encoding='utf-8-sig', index=False, mode='a', header=False) # 테이블 헤더(테이블 내 맨 위 상단 제목) 내용이 존재한다면 header 추가 없이 테이블 내용만 해당 파일에 append
else: # 파일이 존재하지 않는다면
data_frame.to_csv(file_name, encoding='utf-8-sig', index=False) # 테이블 header 내용 추가하여 새로운 파일로 저장.
print("{} 페이지 완료".format(i))
# 코스피에 대해서
for i in range(1, 50 + 1): # 1 ~ 50 페이지까지 해당 작업 반복 # 24.06.x 코스피 기준 45페이지(총 2212개의 기업)까지 존재
# 페이지 넘어가기
browser.get(url_kospi + str(i))
# 데이터 추출
data_frame = pd.read_html(StringIO(browser.page_source))[1] # 1번째 인덱스에 해당하는 테이블 내용
data_frame.dropna(axis='index', how='all', inplace=True) # 테이블 내 행(row)의 내용이 존재하지 않는면 삭제 후 적용
data_frame.dropna(axis='columns', how='all', inplace=True) # 테이블 내 열(column)의 내용이 존재하지 않는면 삭제 후 적용
if len(data_frame) == 0: # 특정 페이지 내의 내용이 존재하지 않는다면
break # 반복 작업 끝
# CSV 파일로 저장 # 엑셀로 파일 로드 가능
file_name = "kospi_kosdaq_companies.csv"
if os.path.exists(file_name): # 이미 파일이 존재한다면
data_frame.to_csv(file_name, encoding='utf-8-sig', index=False, mode='a', header=False) # 테이블 헤더(테이블 내 맨 위 상단 제목) 내용이 존재한다면 header 추가 없이 테이블 내용만 해당 파일에 append
else: # 파일이 존재하지 않는다면
data_frame.to_csv(file_name, encoding='utf-8-sig', index=False) # 테이블 header 내용 추가하여 새로운 파일로 저장.
print("{} 페이지 완료".format(i))
browser.quit()
'InfoSec Log > Python' 카테고리의 다른 글
[Python] 메모장 기능 구현 (0) | 2024.04.13 |
---|---|
[Python] 구글 이미지 웹 스크래핑 (0) | 2024.04.13 |
[Python] 로또 번호 Generator (1) | 2024.04.13 |
[Python]한국경제 기사 웹 스크래이핑 후 엑셀로 저장 (0) | 2024.04.10 |
[Python] QR 코드 생성 (0) | 2024.04.10 |