셀레니움을 이용한 네이버 증권 상장사 재무정보 크롤링
셀레니움을 이용한 네이버 증권 상장사 재무정보 클롤링
네이버 증권에서 재무제표를 수집하는 파이썬 스크립트이다. 전체 내용은 https://shinminyong.tistory.com/15의 코드를 사용했다.
내가 추가 한 부분은 모든 종목을 루프를 돌려가면서 재무제표를 저장하는 것과 재무제표가 없는 기업에 대해 예외 처리를 하는 것이다.
실제 돌려보면 에러나 발생하면서 루프가 중단이 된다.
그 이유까지는 확인을 못 했다.
종목 리스트는 FinanceDatareader 패키지를 이용해서 다운 받은 자료를 사용했다.
아직 iframe내에 접근하는 방법에 대해서는 제대로 이해를 못 했다.
단지 아래의 코드를 사용해서 필요한 자료를 구할 수는 있었다.
import requests # 웹 페이지 소스를 얻기 위한 패키지(기본 내장 패키지이다.)
from bs4 import BeautifulSoup # 웹 페이지 소스를 얻기 위한 패키지, 더 간단히 얻을 수 있다는 장점이 있다고 한다.
from datetime import datetime # (!pip install beautifulsoup4 으로 다운받을 수 있다.)
import pandas as pd # 데이터를 처리하기 위한 가장 기본적인 패키지
import time # 사이트를 불러올 때, 작업 지연시간을 지정해주기 위한 패키지이다. (사이트가 늦게 켜지면 에러가 발생하기 때문)
import urllib.request #
from selenium.webdriver import Chrome
import json
import re
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import datetime as dt
def stock_crawler(code):
#code = 종목번호
name = code
base_url = 'https://finance.naver.com/item/coinfo.nhn?code='+ name + '&target=finsum_more'
browser.get(base_url)
#frmae구조 안에 필요한 데이터가 있기 때문에 해당 데이터를 수집하기 위해서는 frame구조에 들어가야한다.
browser.switch_to_frame(browser.find_element_by_id('coinfo_cp'))
#재무제표 "연간" 클릭하기
browser.find_elements_by_xpath('//*[@class="schtab"][1]/tbody/tr/td[3]')[0].click()
browser.implicitly_wait(1)
html0 = browser.page_source
html1 = BeautifulSoup(html0,'html.parser')
#기업명 뽑기
title0 = html1.find('head').find('title').text
print(title0.split('-')[-1])
html22 = html1.find('table',{'class':'gHead01 all-width','summary':'주요재무정보를 제공합니다.'})
#date scrapy
thead0 = html22.find('thead')
tr0 = thead0.find_all('tr')[1]
th0 = tr0.find_all('th')
date = []
for i in range(len(th0)):
date.append(''.join(re.findall('[0-9/]',th0[i].text)))
#columns scrapy
tbody0 = html22.find('tbody')
tr0 = tbody0.find_all('tr')
col = []
for i in range(len(tr0)):
if '\xa0' in tr0[i].find('th').text:
tx = re.sub('\xa0','',tr0[i].find('th').text)
else:
tx = tr0[i].find('th').text
col.append(tx)
#main text scrapy
td = []
for i in range(len(tr0)):
td0 = tr0[i].find_all('td')
td1 = []
for j in range(len(td0)):
if td0[j].text == '':
td1.append('0')
else:
td1.append(td0[j].text)
td.append(td1)
td2 = list(map(list,zip(*td)))
return pd.DataFrame(td2,columns = col,index = date)
krx_code_list = pd.read_csv('KRX_stock_list.csv')
# KRX_stock_list.csv는 finance-datareader 를 통해서 다운 받았다.
#
for i in krx_code_list['Symbol']:
code = str(i).zfill(6)
browser = Chrome(executable_path="/home/park/Downloads/chromedriver")
browser.maximize_window()
try:
fin_data = stock_crawler(code)
fin_data.to_csv(code + '_fin_data_fr_naver.csv')
except:
print("페이지를 찾을 수 없습니다.")
finally:
browser.quit()
Written on November 14, 2019