ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] 매 시간 주가 음성 안내 프로그램 만들기
    Python/파이썬과 주식 2022. 12. 9. 10:16
    반응형

    매 시간 특정 종목의 주가를 읽어주는 프로그램.

    이 프로그램에는 3가지 기능이 필요하다. 

    1. 매 시간 반복.
    2. 특정 종목 주가를 받아온다.
    3. 이것을 읽어준다.

     

    매 시간 반복되는 작업을 처리할 때

    1. 윈도우(OS)에는 스케줄러 기능이 있어 이를 이용해도 되지만,
    파이썬 코드 하나로 관리하는 게 일반적으로 더 선호된다. 

    2. 루프와 조건문을 이용해서 직접 코딩해도 되겠지만

    3. 스케줄러를 사용하면 다양한 조건을 설정할 수도 있고,
    어렵지 않으니 스케줄러를 이용하는 것이 좋을 것이다.... 

    구글에서 '파이썬 스케줄러'로 검색하면 
    schedule, apscheduler 두 가지가 많이 나오는 데
    이 번에는 apscheduler를 이용한다.

    공식 문서: https://apscheduler.readthedocs.io/en/3.x/userguide.html  
    https://apscheduler.readthedocs.io/en/3.x/modules/triggers/cron.html

    구글 검색 첫 번째 문서: https://hello-bryan.tistory.com/216

    $ pip install apscheduler
    import time
    from apscheduler.schedulers.blocking import BlockingScheduler
    
    
    def job():
        print(f'job: {time.strftime("%H:%M:%S")}')
    
    
    schedule = BlockingScheduler()
    schedule.add_job(job, 'cron', second='0')
    
    schedule.start()

     

    특정 종목 주가 받아오기

    1. 사용하고 있는 증권사의 API를 이용하거나,
    2. 네이버 증권 페이지를 크롤링 하는 방법 등이 있는데..

    이번에는 네이버 증권 페이지를 크롤링하는 방법을 이용한다. 
    파이썬에는 urllib라는 내장 라이브러리가 있다. 

    공식 문서 : https://docs.python.org/ko/3/howto/urllib2.html  

    # urllib.request를 사용하는 가장 간단한 방법은 다음과 같습니다:
    
    import urllib.request
    with urllib.request.urlopen('http://python.org/') as response:
       html = response.read()

    특정 종목의 주가만 가져올 것이기 때문에
    html을 파싱하지 않고
    원하는 text만 가져오자. 

     

    텍스트 읽기

    TTS 라고 하는 기능이다.
    '텍스트 투 스피치' 

    구글에서 '파이썬 TTS'로 검색하면 gTTS가 대부분이다. 
    gTTS는 구글의 API에 TEXT를 보내면,
    mp3 파일로 변환해 보내주는 방식이라,
    무겁고 불편하다.

    윈도우 내장 TTS API(SpVoice)를 파이썬에서 쓸 수 있으니 이걸 이용하자. 


    이에 대해서는 본인의 블로그에도 소개한 적 있다. 

    https://comdoc.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-MS-Windows-%EB%82%B4%EC%9E%A5-TTS-%ED%99%9C%EC%9A%A9    

    SpVoice 를 쓰기 위해서는 pywin32가 필요하다. 

    $ pip install pywin32
    import win32com.client
    speaker = win32com.client.Dispatch('SAPI.SpVoice')
    speaker.Speak('안녕하세요? Hello. 12:21')

     

    완성된 코드

    import urllib.request
    from datetime import datetime
    
    from apscheduler.schedulers.background import BlockingScheduler
    from win32com import client
    
    
    def job(code):
        url = f'https://finance.naver.com/item/main.naver?code={code}'
        resp = urllib.request.urlopen(url).read().decode('EUC-KR')
        title = resp.split('<title>')[1].split(' : ')[0]
        price = resp.split('<dd>현재가 ')[1].split(' ')[0]
        time = datetime.now().strftime('%H:%M')
        text = f'{title} {time} 현재: {price}원'
        print(text)
        speaker = client.Dispatch("SAPI.SpVoice")
        speaker.Speak(text)
    
    
    def main():
        job('005930')
        sched = BlockingScheduler()
        sched.add_job(job, 'interval', seconds=600, id='test', args=['005930'])
        sched.start()
    
    
    if __name__ == '__main__':
        main()

    모바일 알람이 필요하다면, 
    텔레그램 챗봇 API를 이용하면 된다. 

    반응형
Designed by Tistory.