개발자/파이썬

파이썬 재무제표 스크래핑으로 내가 원하는 주식 찾기(feat. 네이버금융)

june__kim 2021. 1. 4. 22:28

파이썬 재무제표 스크래핑으로 내가 원하는 주식 찾기(feat. 네이버금융)

 

2021/01/03 - [개발자/파이썬] - 파이썬 셀레니움 (Selenium) headless

2021/01/02 - [개발자/파이썬] - 파이썬 Selenium (셀레니움) 스크롤(Scroll)

2021/01/01 - [개발자/파이썬] - 파이썬 (Selenium) 로딩까지 기다림 (feat. WebDriverWait)

2020/12/31 - [개발자/파이썬] - 파이썬 (Python) Selenium (기본, 네이버 로그인)

2020/12/30 - [개발자/파이썬] - 파이썬 웹스크래핑(web scraping)_2

2020/12/30 - [개발자/파이썬] - 파이썬 웹스크래핑(web scraping)

 

이전 글들에서 웹 스크래핑하는 방법들을 배웠다.

 

그래서 이번엔 이것들을 이용해 네이버금융에서 제무제표의 정보를 보고

내가 원하는 주식들을 뽑아서 엑셀에 저장하는 실습을 해보려고 한다.

 

먼저, 어떤 기준으로 주식을 뽑아낼지를 정해야겠지?

일단 코스피,코스닥 각각 시가총액 상위 750개의 기업들 중에서 선별하였고,

2019, 2020년 제무제표 기준으로 ROE가 10 이상이면서 PER가 25 이하인 기업들을 뽑아서 엑셀에 저장했다.

 

이때 2020년도의 정보가 없는 경우도 있어서,

2019년도 또는 2020년도 둘 중 하나의 제무제표에서 조건을 만족하면 뽑아내는 걸로 코드를 구현했다.

(이건 각자가 조건을 지정해서 데이터를 뽑을 수 있다. ex.부채비율, PBR, BPS 등등의 지표를 통해 )

 

import csv
import time
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome("각자의 chromedriver 경로")

soup = BeautifulSoup(browser.page_source, "lxml")
title = ["종목명","ROE_2019","PER_2019","ROE_2020","PER_2020","링크"]


f = open("내가찾는주식들.csv","w",encoding="utf-8-sig", newline="")
writer = csv.writer(f)

writer.writerow(title)

for i in range(0,2):
    for page in range(1,16):
        for num in range(0,50):
            url = "https://finance.naver.com/sise/sise_market_sum.nhn?sosok={}&page={}".format(i,page)
            browser.get(url)
            company = browser.find_elements_by_class_name("tltle")[num]
            name = company.text
            company.click()
            time.sleep(1)

            link = browser.current_url

            try:
                ROE = browser.find_element_by_xpath("//*[@id='content']/div[4]/div[1]/table/tbody/tr[6]").find_elements_by_tag_name("td")
            except:
                continue

            try:
                PER = browser.find_element_by_xpath("//*[@id='content']/div[4]/div[1]/table/tbody/tr[11]").find_elements_by_tag_name("td")
            except:
                continue

            r1 = (float)(ROE[2].text.replace(',','')) if len(ROE[2].text.strip())>0 else 0 
            r2 = (float)(ROE[3].text.replace(',','')) if len(ROE[3].text.strip())>0 else 0
            p1 = (float)(PER[2].text.replace(',','')) if len(PER[2].text.strip())>0 else 0
            p2 = (float)(PER[3].text.replace(',','')) if len(PER[3].text.strip())>0 else 0

            _list = [name,r1,p1,r2,p2,link]
            if ((r1>=10 or r2>=10) and (p1<=25 or p2<=25)):
                writer.writerow(_list)
            


browser.quit()

 

 

 

근데 여기서 약간 의문이 있다.

내가 구현을 해놓긴 했지만 이게 과연 최선일까...? 라는 생각이 들었다.

지금 내가 구현해놓은 것은, 총 1500개의 기업을 메인화면에서 하나하나 클릭해서 재무제표를 확인하는 방법인데

(ex. 메인화면에서 삼성전자 클릭 -> 삼성전자 재무제표 확인 -> 메인화면으로 복귀후 다음 SK하이닉스 클릭 -> SK하이닉스 제무제표 확인 -> ...... ) 

 

뭔가 왔다갔다 좀 비효율적이라는 생각이 든다.

 

 

 

여기서 한번 생각해본게 아래의 그림처럼

내가 코스피, 코스닥 각각 상위 750개 기업의 종목코드를 가져올 수 있다면,

url 조작만을 통해 더 효율적으로 할 수 있을 것 같다는 생각을 했다.

 

종목 페이지

 

 

일단 기존의 코드를 돌려놓고 '종목코드를 한번에 어떻게 가져올까?' 라는 고민을 하다보니, 

어느새 내 컴퓨터가 스크래핑 작업을 다 끝내놨더라.

 

결과물은 다음과 같다.

코드 실행 결과

 

내가찾는주식들.csv
0.04MB

 

 

결과물이 나오니까 그냥 "아~ 어차피 컴퓨터가 일하는데 나중에 생각하자~" 하고 이 고민을 미뤘다.

 

 

지금 글을 쓰며 생각난건데, 메인 페이지에서 각각 종목의 a태그에 걸려있는 href를 가져와 리스트에 한번에 넣어두고이를 이용해 메인페이지를 거치지않고, 바로 재무제표가 있는 종목페이지로 가는 방식이 훨씬 더 효율적일 것 같다는 생각이 든다.

즉, href를 리스트에 다 모아두고,

"삼성전자 종목페이지 -> SK하이닉스 종목페이지 -> LG화학 종목페이지 -> ....." 

 

HTML

 

지금은 귀찮고 나중에 함 해봐야겠다.

 

종목코드를 가져오는 방법으론, 증권사 API나 Dart API(?) 연결해서 가져오시는 분들을 본 것 같은데

나는 맥북이라, 증권사 API는 사용 못 할 것 같고, Dart API는 뭔지 모르겠지만 귀찮다....ㅎㅎㅎ

 

 

혹시 더 효율적으로 재무제표 정보를 필터링해서 가져오는 방법 아시는 분들은 알려주시면 참고해서 공부하겠습니다!