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

목차

    2018. 11. 8. 06:30

    컴퓨터-하는-모습
    컴퓨터

    파이썬 이용해서 주식 배당주 데이터를 수집할 수 있습니다. 국내주식 배당주 데이터는 SEIBro에서 확인할 수 있는데요. 파이썬을 이용해서 리스트를 수집하면 이후에 2차 분석도 할 수 있어 좋습니다. 파이썬으로 배당주 종목을 수집하는 방법 알아보았습니다.

     

     

    연말이 되면 주식시장에서는 배당주에 관심을 갖습니다. 연말에 권리를 가진 주주에게 배당금을 지급하기 때문인데요. 이 맘 때면 고배당주에 대한 기사를 종종 보게 됩니다.

     

    1. 배당주 데이터 확인

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

     

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

     

     

    2. 파이썬 배당주 데이터 수집

    파이썬을 이용하면 해당 웹페이지의 데이터를 수집할 수 있습니다. 블로그의 내용이 복붙이 되지 않아, 코드는 포스팅 하단에 파일로 첨부하였습니다.

     

    해당 페이지를 파이썬으로 크롤링하기 위해 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은 브라우저를 컨트롤할 수 있는 라이브러리입니다.

     

     

    sellenium을 사용하기 위해서는 webdriver를 설치해야 하는데요. 웹드라이버 설치는 chrome 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

     

    상기 코드는 아래에 파일로 첨부합니다.

    파이썬-배당주-데이터-수집.py
    0.00MB

     

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