본문 바로가기
IT - 코딩/트레이딩 관련

환전소 금액 1초마다 크로링

by 조기정 2023. 5. 22.

먼저 전체 코드와 아웃풋 그림입니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import time
import datetime

import pandas as pd


import telegram #pip install python-telegram-bot
import requests
import pprint
import json


def Telegramchat(text):
    telegram_token = '5106829469:AAGc-XqcK67mDADEuJERXFXgazI68dcO_x0'
    telegram_chat_id = '5257112430'
    bot = telegram.Bot(token = telegram_token)

#     text = "김프알람"
    url = 'https://api.telegram.org/bot'+telegram_token+'/sendMessage?chat_id='+telegram_chat_id+'&text='+text
    return requests.get(url)

def word_preprocess(word):
    symbols = [" ", '\n', "\t"]  # make your own list
    for symbol in symbols:
        word = word.replace(symbol, '')
    return word

def Data_Processing(text_data):
    start_point = 0
    data_2 = []
    data_2_append = data_2.append

    for i, v in enumerate(text_data):
        try:
            float(v)
        except:

            end_point = i
            a = text_data[start_point:end_point] # 이 부분 어찌 깔끔하게..?

            try: # 환전소 명이 숫자로 변하지 않을테니 숫자로 변하지 않는다면
                int(a[0][:4])

            except: # 환전소명(a)의 값이 4개 이상이면 data 2에 붙인다

                if len(a) >= 2: # 2개 이상의 데이터는 있어야 정상적인 환전 데이터라서
                    # print(a)
                    data_2_append(a)

            start_point = end_point
            pass
    return data_2



while True:
    try: # 문제가 생겨 코드가 종료 될 경우 텔레그램으로 재실행을 위한 알람이 보내짐
        while True:
            now = datetime.datetime.now()
            to_day = str(now.year) + "_" + str(now.month) + "_" + str(now.day)

            if (now.weekday() != 6 or now.weekday() != 7) and (9 <= now.hour and now.hour <= 18):
                pass
            else:
                time.sleep(3600)

            # 이전 환전 데이터를 가져옮 (서버나 어떠한 문제로 재 실행 했을 경우 문제 없게 하기 위해서 오늘 멈췄으면 오늘 날짜로 데이터 계속 쓰게 함.)
            # 즉 날짜가 변하면 새로운 날로 파일을 씀(csv 파일 최대한 안넘게 하기 위해)
            data_File_name = "currency_exchange_data"+ "_" +to_day +".csv"
            try: # 오늘 날짜와 같지 않은 데이터 명의 경우.. 새 파일을 만들어야함.
                dic_data_dataFrame = pd.read_csv(data_File_name)
            except:
                try:
                    del dic_data_dataFrame
                except:
                    pass
                pass

            html = urlopen("https://www.mibank.me/exchange/saving/index.php?currency=USD")
            bsObject = BeautifulSoup(html, "html.parser")
            # =============== 크롤링 부분
            td_data = []
            td_data_append = td_data.append
            for data in bsObject.body.find_all('td'):
                td_data_append(data.text)


            text_data = []
            for line in td_data:
                # print(line)
                word = word_preprocess(line)
                if len(word) > 2:  # ("]" in line) == False and
                    text_data.append(word)
            # =============== 크롤링 부분

            del text_data[0]
            # ==== 데이터 전처리
            data_2 = Data_Processing(text_data) # 데이터 저장하기 쉽게 가공. @ 이 부분 속도 빠르게 개선 가능해 보임
            # ====csv 저장
            dic_data = {}

            dic_data["time"] = now.strftime('%Y-%m-%d %H:%M:%S')

            for v in data_2:
                dic_data[v[0]] = v[1]

                new_dic_data_dataFrame = pd.DataFrame(dic_data, index=[0])
            try: # concat 시도로 새로운 파일 만듦
                dic_data_dataFrame = pd.concat([dic_data_dataFrame, new_dic_data_dataFrame], axis=0)  # 수익 데이터 저장
            except: # 같지 않은 파일을 만들 경우에
                dic_data_dataFrame = new_dic_data_dataFrame

            # 환전 데이터를 가지고 저장함.
            data_File_name = "currency_exchange_data"+ "_" +to_day +".csv"
            dic_data_dataFrame.to_csv(data_File_name, index=False, encoding="utf-8-sig")

            time.sleep(2)
    except Exception as e:
        send_text = "환전소 크롤링 파일 종료 됨 원인 확인 할것."+str(e)
        response = Telegramchat(send_text)

아웃풋

    html = urlopen("https://www.mibank.me/exchange/saving/index.php?currency=USD")
    bsObject = BeautifulSoup(html, "html.parser")

    td_data = []
    td_data_append = td_data.append
    for data in bsObject.find_all('td'):
        td_data_append(data.text)

 

7~8 번째 줄은 주소 불러오고 bs4로 html데이터 가져오는 부분입니다.

    td_data = []
    td_data_append = td_data.append
    for data in bsObject.find_all('td'):
        td_data_append(data.text)

10~13번째 줄은 <td> ~~data~~ </td> 의 내용들만 가져온것입니다.

    def word_preprocess(word):
        symbols = [" ", '\n', "\t"]  # make your own list
        for symbol in symbols:
            word = word.replace(symbol, '')
        return word

15~19번째는 띄어쓰기 된 값들과 엔터 빈칸 데이들은 없애는 function입니다.

    text_data= [] 
    for line in td_data:
        # print(line)
        word = word_preprocess(line)
        if len(word)>2 : # ("]" in line) == False and
            text_data.append(word)
            
    del text_data[0]

21~26줄에서는 단어가 2개 이상인 값들만 가지고 와서 처리하는 모습이고요. 

    statuses = (text_data
                )
    if (len(statuses) != 0):
        clear_output(wait=True)
        display(statuses)

30~34번째 줄은 노트북 사용시 아웃풋을 한번만 보여주기 위해서 저렇게 구성하였습니다. 데이터를 저장하고 싶으면 여기서 text_data만 바꾸어주면 되겠습니다.

 

마지막 36번째 줄은 1초에 한번 갱신하게 만들기 위해 구성하였습니다.