티스토리 뷰

안녕하세요 정말 오랜만에 글을 쓰는 거 같습니다.
이런저런 일이 있으면서 글을 안 쓰다 보니 점점 더 게을러지는 거 같네요....😓😓
다시 정신 차리고 열심히 살아보겠습니다.
최근에 이탈리아로 여행을 가게 되었는데 유럽 환율이 어질어질하더라고요.... (저는 1,435원 정도에 환전을 했는데 이탈리아 여행 중에는 1,470원을 넘더라고요😮)
1원이라도 아끼고 싶은 마음이 생겨 환율 사이트를 찾고 시간 날 때마다 접속하여 유럽 환율을 체크하였는데
시간이 흐르니 유럽 환율을 확인하는 과정도 귀찮아지더라고요...
그래서 일정 시간이 되면 유럽 환율을 알려주는 프로그램을 만들어야겠다고 생각을 하게 되었습니다.
프로세스의 변화는 아래와 같습니다.

프로그램 개발 전 프로세스는 즐겨찾기나 인터넷만 종료하지 않으면 프로세스가 더 간단해질 수 있지만 의식하고 직접 찾는다는 거(수동)와 누군가가 알려주어 인지하느냐(자동)가 큰 차이점이라고 생각합니다.

 

프로그램에서 제일 중요한 포인트는 아래와 같습니다.(글쓴이 생각)

  1. 지속적으로 데이터 수집이 가능한 사이트 선정 및 데이터 수집
  2. 수집한 데이터를 사용자에게 알려 줄 수 있는 플랫폼 

이제 본격적으로 크롤링을 진행해 보겠습니다.
사이트는 Investing로 선정하였습니다.
그 이유로는 실시간으로 변화하는 환율을 제공받아야 하는데, 그 포인트를 충족하는 사이트가 Investing이었고, 사이트 서치 시 제일 먼저 눈에 들어왔기 때문입니다.(다른 사이트를 찾았으면 그걸 했을 거예요.)

크롤링 사이트 주소는 https://kr.investing.com/currencies/eur-krw 입니다. 

사이트 접속시 위와 같은 UI를 제공해 주는데 저는 빨간 박스에 있는 데이터만 수집 하겠습니다. 

import requests
import time
from bs4 import BeautifulSoup
from datetime import datetime
import slack_sdk

ex_change = []
def exchange_rate_information(nation1, nation2):
    ex_datetime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    headers = {
        'User-Agent': 'Mozilla/5.0',
        'Content-Type': 'text/html; charset=utf-8'
        }
    while True:
        response = requests.get("https://kr.investing.com/currencies/{}-{}".format(nation1, nation2), headers=headers)
        print(response)
        content = BeautifulSoup(response.content, 'html.parser')
        containers = content.find('span', {'data-test': 'instrument-price-last'})
        datetime_now = str(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        ex_change.append(containers.text)
        if len(ex_change) <=1 :
            real_text = '현재시간 : {num}, 한국 돈 -> 유럽 돈 : {gen}'.format(num=datetime_now, gen=containers.text)
            client.chat_postMessage(channel='#eur_info', text= real_text)
        else :
            c = round((float(ex_change[1].replace(',','')) - float(ex_change[0].replace(',',''))) / float(ex_change[0].replace(',','')) * 100,2)
            real_text = '현재시간 : {num}, 한국 돈 -> 유럽 돈 : {gen}, 증가율 : {rate}'.format(num=datetime_now
                                                                                  ,gen=containers.text
                                                                                 ,rate = c)
            client.chat_postMessage(channel='#eur_info', text= real_text)
            del ex_change[0]
        
        time.sleep(600)
        

if __name__ == '__main__':
    try:
        slack_token = 'Slack 토큰 입력'
        client = slack_sdk.WebClient(token=slack_token)
        exchange_rate_information('eur', 'krw')

라이브러리는 requests, BeautifulSoup을 활용하였고, 크롤링 알고리즘을 함수화 시켜 10분이 될 때마다 원하는 환율을 받을 수 있게 구성해 보았습니다.
ex_change 리스트에서 환율 데이터를 받고 리스트 수가 1개 일 때는 환율 만 전달하지만 2개 이상 일 때는 증가율을 같이 보여주게 만들었습니다.
그리고 지속적으로 과거 데이터를 삭제 되게 구축하였습니다.
코드는 문제없이 잘 돌아갔고 이제 지속적으로 받는 데이터를 사용자에게 알려주는 플랫폼을 선정하겠습니다.
과거에 Slack이라는 업무 협업 툴 api를 활용하여 챗봇을 만든 경험이 있어 Slack을 활용해 보겠습니다.
슬랙 api 할당받는 방법을 따로 올리거나 혹은 다른 분들이 올린 거 보시고 따라 하시면 될 거 같습니다.

slack 에서 받은 api를 slack_token 변수에 입력하여 저장하여 활용 하였습니다.

최종적으로 slack 에서 잘 작동 되는지 보겠습니다. 

MSG_Bot이 열심히 10분마다 유럽 환율과 증가율을 알려주는 걸 볼 수 있습니다.
이 기능을 중심으로 airflow나 다른 라이브러리를 활용하여 스케줄링을 걸 수도 있고, UI를 이쁘게 꾸며서 활용할 수 있다고 생각합니다.
이 프로그램 덕분에 저는 환율을 실시간으로 확인할 수 있었고 만족하는 가적에 구매를 할 수 있었습니다.
다음에도 다른 재미있는 일로 뵙겠습니다~👍

그리고 글이 문제 될 시 삭제하겠습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함