ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬 크롤링, ETF 자산배분투자] 실시간 주가 확인 네이버 vs 다음 [2]
    자산배분 투자 2020. 3. 28. 09:00

    파이썬 크롤링으로 네이버와 다음에서 실시간 주가를 확인하려고 한다.

    12개 ETF 관심종목에 대해 2개의 포털 크롤링 속도를 비교하였다.

     

    네이버(naver)에서 크롤링을 수행한 결과, 41.4초가 걸렸다.
    그렇다면 다음(daum)에서는?

     

    소스 코드(ipynb)는 맨 아래에 있다.

     

     

     

    다음

    1. 코드 출처: thrufore
    2. 데이터 출처: 다음 금융
      • URL: 'http://finance.daum.net/api/charts/A{종목코드}/days?limit=5&adjusted=true'
    3. 적용: 이 코드의 결과물은 아래와 같은 경우에 종목별 매수량을 결정할 때 사용한다.
      • 추가금액을 투입할 때(매월1회)
      • 포트폴리오를 리밸런싱할 때
    4. 기초자료
      • 실시간으로 주가를 확인하고자 하는 관심종목 목록
        • 파일: 기초자료.xlsx 파일의 관심종목 시트
        • 관심종목 시트 항목: 종목명, 종목코드, 자산구분 등
    In [1]:
    import pandas as pd
    from pandas import Series, DataFrame
    from datetime import datetime, timedelta
    import matplotlib.pyplot as plt
    import requests
    import re
    from bs4 import BeautifulSoup
    import time
    import json
    
     

    기초자료 파일

    • 종목명, 종목코드를 포함한 정보가 들어 있다.
    In [2]:
    기초자료 = '기초자료.xlsx'
    pd.read_excel(기초자료)
    
    Out[2]:
      구분 종목명 종목코드 총보수비용비율 퇴직연금 개인연금 ISA
    0 선진국주식 TIGER 미국다우존스30 245340 0.0043 True False False
    1 신흥국주식 ARIRANG 신흥국MSCI(합성 H) 195980 0.0056 True True True
    2 한국국채 KOSEF 국고채10년 148070 0.0018 True True False
    3 현금성자산 TIGER 단기통안채 157450 0.0011 True True True
    4 선진국주식 KODEX 미국S&P500선물(H) 219480 0.0032 False True True
    5 선진국주식 TIGER 미국S&P500선물(H) 143850 0.0036 False True True
    6 대체투자 KODEX 골드선물(H) 132030 0.0075 False True True
    7 대체투자 TIGER 골드선물(H) 319640 0.0045 False True True
    8 한국국채 KOSEF 국고채10년레버리지 167860 0.0033 False False True
    9 해외국채 TIGER 미국채10년선물 305080 0.0037 False True True
    10 해외국채 KODEX 미국채10년선물 308620 0.0037 False True True
    11 현금성자산 KODEX 단기채권 153130 0.0017 False True True
    In [3]:
    url_다음 = 'http://finance.daum.net/api/charts/A{}/days?limit=5&adjusted=true'
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
        'Connection': 'keep-alive',
        'Cookie': 'GS_font_Name_no=0; GS_font_size=16; _ga=GA1.3.937989519.1493034297; webid=bb619e03ecbf4672b8d38a3fcedc3f8c; _ga=GA1.2.937989519.1493034297; _gid=GA1.2.215330840.1541556419; KAKAO_STOCK_RECENT=[%22A069500%22]; recentMenus=[{%22destination%22:%22chart%22%2C%22title%22:%22%EC%B0%A8%ED%8A%B8%22}%2C{%22destination%22:%22current%22%2C%22title%22:%22%ED%98%84%EC%9E%AC%EA%B0%80%22}]; TIARA=C-Tax5zAJ3L1CwQFDxYNxe-9yt4xuvAcw3IjfDg6hlCbJ_KXLZZhwEPhrMuSc5Rv1oty5obaYZzBQS5Du9ne5x7XZds-vHVF; webid_sync=1541565778037; _gat_gtag_UA_128578811_1=1; _dfs=VFlXMkVwUGJENlVvc1B3V2NaV1pFdHhpNTVZdnRZTWFZQWZwTzBPYWRxMFNVL3VrODRLY1VlbXI0dHhBZlJzcE03SS9Vblh0U2p2L2V2b3hQbU5mNlE9PS0tcGI2aXQrZ21qY0hFbzJ0S1hkaEhrZz09--6eba3111e6ac36d893bbc58439d2a3e0304c7cf3',
        'Host': 'finance.daum.net',
        'If-None-Match': 'W/"23501689faaaf24452ece4a039a904fd"',
        'Referer': 'http://finance.daum.net/quotes/',
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
    }
    
    In [4]:
    def get_bs(종목코드):
        """
        종목코드를 입력받아 bs를 출력
        """
        url = url_다음.format(종목코드)
        result = requests.get(url, headers=headers)
        bs = BeautifulSoup(result.content, "html.parser")
        return bs
    
    In [5]:
    def 현재가_조회_개별(종목코드):
        """
        종목코드 1개를 입력받아 현재가와 조회시간을 출력
        """
        bs = get_bs(종목코드)
        df = json.loads(bs.text)
        df = DataFrame(df['data'])
        df = df[['date', 'tradePrice', 'openingPrice', 'highPrice', 'lowPrice', 'tradeTime']]
        df['date'] = df['date'].map(lambda x: datetime.strptime(x, '%Y-%m-%d'))
        df['tradeTime'] = df['tradeTime'].map(lambda x: datetime.strptime(x, '%H%M%S').time())
        df.rename(columns={
            'date': '거래일',
            'tradePrice': '현재가',
            'openingPrice': '시가',
            'highPrice': '고가',
            'lowPrice': '저가',
            'tradeTime': '거래시간',
        }, inplace=True)
        df.거래일 = df.apply(lambda x: datetime.combine(x['거래일'], x['거래시간']), axis=1)
        df.drop('거래시간', axis=1, inplace=True)
        return (df.loc[df.index.max(), '현재가'], df.loc[df.index.max(), '거래일'])
    
    In [6]:
    def 현재가_조회_목록(기초자료):
        """
        종목코드 다수(xls)를 입력받아 현재가와 조회시간을 출력
        """
        종목 = pd.read_excel(기초자료, sheet_name='종목')
        종목['임시'] = 종목['종목코드'].map(현재가_조회_개별)
        종목['현재가'] = 종목['임시'].map(lambda x: x[0])
        종목['조회시간'] = 종목['임시'].map(lambda x: x[1])
        종목.drop('임시', axis=1, inplace=True)
        return 종목
    
     

    코드 실행 결과

    • 다음: 1.16초
    • 네이버: 45.9초
    In [7]:
    start = time.time()
    현재가 = 현재가_조회_목록('기초자료.xlsx')
    print('포털 다음에서 {}개의 종목을 조회하는데 {}초가 걸렸습니다.'.format(len(현재가), round(time.time() - start, 2)))
    현재가
    
     
    포털 다음에서 12개의 종목을 조회하는데 1.16초가 걸렸습니다.
    
    Out[7]:
      구분 종목명 종목코드 총보수비용비율 퇴직연금 개인연금 ISA 현재가 조회시간
    0 선진국주식 TIGER 미국다우존스30 245340 0.0043 True False False 13615.0 2020-03-27 15:30:30
    1 신흥국주식 ARIRANG 신흥국MSCI(합성 H) 195980 0.0056 True True True 8515.0 2020-03-27 15:30:30
    2 한국국채 KOSEF 국고채10년 148070 0.0018 True True False 125120.0 2020-03-27 15:30:30
    3 현금성자산 TIGER 단기통안채 157450 0.0011 True True True 100360.0 2020-03-27 15:18:58
    4 선진국주식 KODEX 미국S&P500선물(H) 219480 0.0032 False True True 12420.0 2020-03-27 15:30:08
    5 선진국주식 TIGER 미국S&P500선물(H) 143850 0.0036 False True True 30285.0 2020-03-27 15:30:28
    6 대체투자 KODEX 골드선물(H) 132030 0.0075 False True True 11675.0 2020-03-27 15:30:15
    7 대체투자 TIGER 골드선물(H) 319640 0.0045 False True True 12450.0 2020-03-27 15:30:30
    8 한국국채 KOSEF 국고채10년레버리지 167860 0.0033 False False True 138385.0 2020-03-27 15:30:30
    9 해외국채 TIGER 미국채10년선물 305080 0.0037 False True True 12750.0 2020-03-27 15:30:30
    10 해외국채 KODEX 미국채10년선물 308620 0.0037 False True True 12425.0 2020-03-27 15:30:30
    11 현금성자산 KODEX 단기채권 153130 0.0017 False True True 102095.0 2020-03-27 15:30:30

     

    기초자료.xlsx
    0.01MB
    현재가_조회_다음.ipynb
    0.02MB

     

    반응형
Designed by Tistory.