Keep going

네이버 증권 동적 크롤링(selenium, BeautifulSoup을 이용한 코스피, 코스닥 시가총액, 영업이익, 영업이익성장률, 매출액, 매출액 성장률, PER 크롤링)(1/2) 본문

주식

네이버 증권 동적 크롤링(selenium, BeautifulSoup을 이용한 코스피, 코스닥 시가총액, 영업이익, 영업이익성장률, 매출액, 매출액 성장률, PER 크롤링)(1/2)

Howard Schultz 2022. 12. 17. 19:38
반응형

오늘은 주식 투자에 있어서 종목 선정에 큰 도움이 된 네이버 증권 크롤링을 소개하고자 합니다.

주식 투자를 함에 있어 적정주가에 산정을 위한 벨류에이션을 필수적이며, 예상되는 미래 주당순이익(EPS)에 적정하다고 판단하는 PER를 곱해줌으로써, 적정주가를 판단합니다.

PER = 주가 / 주당순이익(EPS)

→ 주가 = 주당순이익 x PER

이를 위해서는 매출액과 매출액 성장률 정보만으로는 부족하고 영업외손익이 없다는 가정하여 영업이익과 영업이익 성장률을 통해 예상 영업이익을 뽑고 업종 평균 PER 등을 이용하여 적정 주가를 구할 수 있습니다.

주식 투자에 대한 설명은 이쯤으로 하고, 실제 크롤링하고자 하는페이지는 다음과 같습니다.

https://finance.naver.com/sise/sise_market_sum.naver?sosok=1&page=1

 

네이버 증권-국내증시-시가총액 탭

하지만 이 페이지를 보게 되면 필터링을 위한 체크가 거래량, 외국인비율, 상장주식수, 시가총액, PER, ROE로 주식투자를 위해서는 거래량, 외국인비율, 상장주식수 정보는 큰 의미가 없습니다. 그래서 이를 아래와 같이

 

시가총액, 매출액(억), 매출액증가율, 영업이익(억), 영업이익증가율, PER로 변경해주어야 한다. 이 상태에서 크롤링을 한다면 다음과 같은 결과를 얻을 수 있습니다. 

크롤링하여 엑셀로 저장한 결과

이를 조금 정제하고 영업이익 증가율 순으로 필터를 걸 경우 다음과 같습니다.(N/A가 나오는 항목들은 필터에서 제거하는 방식으로 정제합니다.)

영업이익증가율 내림차순으로 정렬한 결과(2022-12-17 기준)

이와 같이 정제한 이후에 영업이익 증가율이 높은 순서로 투자할만한 주식들을 골라냅니다.

하지만 해당 자료들은 분기별이 아니라, 연도별로 업데이트 된다는 점이 중요합니다. 영업이익 증가율이 6,628.99%로 코스닥에서 가장 높은 성장률은 내는 현우산업의 매출액은 1,843억원으로 이 자료는 21년 기준 매출액입니다. 

21년 현우산업 연결 포괄손익계산서

현재 저는 네이버 증권에서 크롤링하는 방법만을 제시하고 있기 때문에 특정 분기 단위로 크롤링을 하는 것은 불가능한 상황이며, 이에 대해서는 추가적인 연구가 필요할 것이라고 판단됩니다. 

이러한 과정에 필요한 코드는 다음과 같습니다.

먼저 웹페이지 간에서 클릭을 하면서 크롤링하는 동적 크롤링을 해야하기 때문에 selenium에서 webdriver를 임포트합니다. 또한 크롤링을 위해 BeautifulSoup 임포트해야합니다. 판다스를 크롤링한 결과를 데이터 프레임으로 만들고, 엑셀 파일로 저장하기 위해 필요하며, datetime 모듈은 엑셀 파일을 저장할 때 파일 이름에 날짜를 입력하기 위해서 필요합니다.

from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime

이후 가장 핵심적인 동적 크롤링에 필요한 부분은 다음과 같습니다.

driver = webdriver.Chrome('C:\/chromedriver')
data_list = []
data_list1 = []

driver.get('https://finance.naver.com/sise/sise_market_sum.naver?sosok=0&page=1')
driver.find_element_by_id('option1').click()
driver.find_element_by_id('option15').click()
driver.find_element_by_id('option21').click()
driver.find_element_by_id('option22').click()
driver.find_element_by_id('option5').click()
driver.find_element_by_id('option11').click()
driver.find_element_by_id('option12').click()
driver.find_element_by_id('option25').click()
driver.find_element_by_xpath('/html/body/div[3]/div[2]/div[2]/div[1]/div[2]/form/div/div/div/a[1]/img').click()

가장 먼저, webdriver를 통해 크롬 드라이버를 불러와야 한다. 이를 통해 원격으로 크롬을 움직일 수 있게 됩니다. 

webdriver 작동 시 왼쪽 위에 자동화된 소프트웨어에 의해 제어된다고 나오는 모습

여기서 우리는 거래량, 외국인 비율, 상장주식수, ROE(%)는 필요없기에 체크를 해제하고, 우리가 원하는 매출액, 매출액증가율 영업이익, 영업이익증가율을 추가로 체크한 이후 적용하기 버튼을 눌러야 합니다. 

각각의 체크 박스의 이름을 알고, webdriver를 통해 이들을 클릭해야 합니다. 크롬 개발자 도구를 눌러서 살펴보면 다음과 같습니다.

첫번째 거래량 체크박스의 경우 type="checkbox", id = "option1'으로 되어 있으므로, option1을 통해 클릭하여 체크를 해제하면 됩니다. 외국인 비율, 상장주식수, 매출액 등 우리가 체크해제 하고 싶은 것들, 체크하고 싶은 것들을 모두 찾아 반영해준 후 적용하기 버튼을 누르는 과정까지가 위의 코드에 반영되어 있는 것입니다. 

 

위의 코드를 실행한다면, 크롬드라이버가 자동으로 작동되어 거래량, 외국인 비율 등 필요없는 항목들의 체크를 해제하고, 영업이익, 영업이익 증가율 등의 필요한 항목을 체크한 후 적용하기 버튼을 누르는 과정까지가 구동될 겁니다. 이후 부분은 독자 분들의 요청이 있는 경우에 추가적으로 작성하고자 합니다. 흥미 있으신 분은 댓글 달아주시면 감사하겠습니다.

반응형