파이썬으로 배당주 데이터 수집하기

2018. 11. 8. 06:30

다사다년했던 2018년도 이제 두 달 밖에 남지 않았다. 이제 한 해를 마무리하고 새해를 준비해야 할 시기가 온 것이다. 주식시장에서는 배당주의 시기가 왔다. 년말에 권리를 가진 주식에 대해 배당을 하기 때문에, 이 맘 때면 고배당주에 대한 기사를 종종 보게 된다. 

오늘은 파이썬으로 배당주 종목들을 수집하는 방법에 대해서 알아보도록 하겠다.

 

파이썬_배당주_데이터_수집

 

 

배당주 데이터를 수집하기 위해 배당금액을 제공하는 싸이트나 API를 찾아보았다. 찾기 어려울 듯 했으나 증권정보포털인 SEIBro에서 배당주에 대한 데이터를 제공하는 것을 확인할 수 있었다. SEIBro는 한국예탁결제원에서 운영하는 증권정보제공 포탈 싸이트이다.

 

SEIBro싸이트

(SEIBro싸이트 바로가기)

 

API로도 데이터를 제공하지만, 개인회원은 사용이 불가하다. API활용신청시 사업자번호를 입력해야 한다. 개인회원도 API를 사용할 수 있게 빨리 오픈되었으면 하는 바람이다. 배당주에 대한 데이터는 [주식]-[배당정보]-[배당순위]에서 찾을 수 있다. 조회기간 2017년으로 꽤 많은 배당정보를 확인할 수 있다. 페이지수 기준으로 약 100페이지 정도 조회가 된다.

 

해당 페이지를 파이썬으로 크롤링하기 위해 urllib 라이브러리를 이용하여 url을 읽어왔지만, 해당 정보는 javascript로 작성되어 아래와 같이 테이블 정보를 불러오지 못한다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ko" xmlns="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:w2="http://www.inswave.com/websquare" xmlns:xf="http://www.w3.org/2002/xforms">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<!--<meta http-equiv="X-UA-Compatible" content="IE=Edge" />-->
<meta content="IE=9, chrome=1" http-equiv="X-UA-Compatible"/>
<title>  SEIBro  </title>
<script src="javascript.wq?q=/bootloader" type="text/javascript"></script>
<script type="text/javascript">

window.onload = init;
function init() {
try{
WebSquare.startApplication();
} catch(e) {
alert(e.message);
}
}
var _visibleHelper = function( htmlStr ) {
var obj = document.getElementById("visDiv");
obj.innerHTML = htmlStr;
}
</script>
</head>
<body>
<div id="visDiv"></div>
<script type="text/javascript"></script>
</body>
</html>

(페이지 정보를 불러오지 못한다)

 

 

javascript로 작성된 페이지의 경우에는 selenium을 이용하여 크롤링을 할 수 있다. 크롤링을 할 때는 고스트 모드를 이용해서 실제 브라우저의 모습을 보지 않고 사용하기도 하지만, 개인 목적으로 크롤링하는 것으로 브라우저가 보여도 상관없다. 참고로 selenium은 브라우저를 컨트롤할 수 있는 라이브러리로 이를 이용해 네이버 자동로그인도 구현했었다.
(참조: 파이썬 selenium 이용 네이버 자동로그인 하기)

 

sellenium을 사용하기 위해서는 webdriver를 설치해야 한다. webdriver설치는 이전에 작성한 포스팅을 참조하도록 하자. get(url)함수를 이용하여 크롤링하고자 하는 페이지로 이동하고, 페이지 소스는 page_source파라미터를 이용하여 불러온다. 이후에는 urllib라이브러리를 이용한 것과 동일한 방법으로 table 태그에 있는 내용을 불러와 dataframe으로 만들면 된다.

> browser = webdriver.Chrome('/Users/open/Documents/chromedriver/chromedriver')
> url="http://www.seibro.or.kr/websquare/control.jsp?w2xPath=/IPORTAL/user/company/BIP_CNTS01042V.xml&menuNo=286#"
> browser.get(url)
>

#브라우저에서 조회기간을 2017년으로 선택한다
> search_btn=browser.find_element_by_id("image1")
> search_btn.click()
>
> result = browser.page_source
>
> soup = BeautifulSoup(result, 'html.parser')
>
> content = soup.findAll("table")
> p=parser.make2d(content[0])
> df_final=pd.DataFrame(p[2:],columns=p[1])

 

이제 페이지를 넘어가면서 크롤링을 해야 한다. url에 파라미터를 넘겨서 페이지를 이동할 수 있으면 쉽게 작성할 수 있겠지만, javascript로 되어 있어 매개변수를 찾기가 쉽지 않다. 예전에는 html을 다 뒤져가며 파라미터를 찾아보았겠지만, sellenium이 있으니 다음 버튼을 클릭하여 페이지를 이동하고 크롤링 한다.

> for lk in range(2,200):
>    lk_button = browser.find_element_by_id("cntsPaging01_next_btn")
>    lk_button.click()

>    result = browser.page_source

>    soup = BeautifulSoup(result, 'html.parser')
>    content = soup.findAll("table")
>
>    if previous_source==content:
>       break
>
>    p=parser.make2d(content[0])
>    df=pd.DataFrame(p[2:],columns=p[1])
>    df_final = pd.concat([df_final,df],0)
>    previous_source = content
>
>    time.sleep(4)

 

페이지 로드 시간이 있어 time.sleep(4)으로 4초 뒤에 크롤링을 하는 것으로 작성했다. 시작시에 다음 버튼을 얼마나 눌러야 할 지 몰라서, 이전 소스와 비교해서 같으면 종료시키는 부분을 추가하였지만, 어찌된 이유인지 잘 작동하지 않는다. 위와 같이 웹크롤링을 하여 아래와 같이 배당주 데이터를 수집할 수 있었다.

 

> df_final.head()
> Out[183]: 
>  순위    종목코드             종목명 주식종류    시장구분   주당배당금  시가배당율  액면가배당율    액면가 결산월
>  0  1  033660           아주캐피탈  보통주  유가증권시장   1,653  20.40   33.06  5,000  12
>  1  2  000650            천일고속  보통주  유가증권시장  15,300  15.30  306.00  5,000  12
>  2  3  155900    바다로19호선박투자회사  보통주  유가증권시장       0  12.40    7.00  5,000  12
>  3  4  153360  하이골드오션3호선박투자회사  보통주  유가증권시장       0  12.00    4.52  5,000  12
>  4  5  219550            엠피한강  보통주   코스닥시장     189   9.29  189.00    100  12

 

오늘은 이렇게 파이썬으로 배당주 데이터를 수집해보았다. SEIBro 싸이트를 통해서 배당주 데이터를 확인할 수 있고, javascript로 이루어진 페이지라 selenium을 이용하여 크롤링하였다. 수집된 데이터에 추가데이터를 더 결합된다면 꽤 쓸만한 자료가 되지 않을까 한다.

 

 

오픈API를 사용하면 다양한 재미있는 일들을 해 볼 수 있다. 파이썬을 활용한 오픈API 사용이 궁금하다면 아래 글을 참조해보자.
(참조: 오픈API를 활용한 사례는 어떤 것들이 있을까?)

 

파이썬을 이용하면 주가 데이터도 쉽게 수집할 수 있다. 데이터를 수집하는 자세한 방법은 아래 포스팅을 참조해보자.
( 참조: 나만 모르는 파이썬 주식데이터 수집하는 방법 TOP3는? )

 

 

 

이 글 공유하기

 

태그 :

댓글()