IT - 코딩/트레이딩 관련

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

조기정 2023. 5. 22. 14:24

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

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초에 한번 갱신하게 만들기 위해 구성하였습니다.