단지코드 단위 에너지소비량 local Dataset 구축

ewillwin·2023년 1월 12일
0

TSMtech Record

목록 보기
26/39
from urllib.request import urlopen
import requests as rq
from bs4 import BeautifulSoup as bs
from typing import final
from venv import create
import pandas as pd
from multiprocessing import Process
from typing import final
from venv import create
import requests
from decimal import Decimal
import re
import xml.etree.ElementTree as ET
import time


def get_kaptCode():
    url = "http://apis.data.go.kr/1613000/AptListService2/getTotalAptList"
    serviceKey = ""
    serviceKey = requests.utils.unquote(serviceKey)
    params = {'serviceKey': serviceKey, 'numOfRows': 18987}
    response = requests.get(url, params=params)
    return response.text

def get_energy(reqDate, kaptCode):
    url = "http://apis.data.go.kr/1611000/ApHusEnergyUseInfoOfferService/getHsmpApHusUsgQtyInfoSearch"
    serviceKey = ""
    serviceKey = requests.utils.unquote(serviceKey)
    params = {'serviceKey': serviceKey, 'kaptCode': kaptCode, 'reqDate': reqDate}
    while(True):
        try:
            response = requests.get(url, params=params)
            if response.status_code == 200:
                break
        except:
            time.sleep(2)
    return response.text

def energy_parsing(energy_type, response):
    pattern = "<"+energy_type+">"+"(-?[0-9]+)</"+energy_type+">"
    result = re.findall(pattern, response)
    return result

response_kaptCode = open("C:/Users/TSM/OneDrive/바탕 화면/kaptCode.txt", "r", encoding="cp949")
kaptCode_list = []
for line in response_kaptCode:
    kaptCode_list.append(line[:9])
response_kaptCode.close()

# src = open("C:/Users/TSM/OneDrive/바탕 화면/"+"202201"+"_pre.txt", "r", encoding="cp949")
# dest = open("C:/Users/TSM/OneDrive/바탕 화면/kapt/2022_kapt.txt", "w", encoding="cp949")
# for line in src:
#     newline = "202201," + line
#     dest.write(newline)
# src.close()
# dest.close()

stop = 1
stopidx = 10810 ### 에러 발생 시 이 부분 수정
reqDate = ["202204", "202205", "202206", "202207", "202208", "202209", "202210", "202211", "202212"] ### 에러 발생 시 이 부분 수정
for m in range(len(reqDate)):
    des = open("C:/Users/TSM/OneDrive/바탕 화면/kapt/"+reqDate[0][:4]+"_kapt.txt", "a", encoding="cp949")
    if stop == 0:
        for x in range(len(kaptCode_list)):
            while(True):
                response = get_energy(reqDate[m], kaptCode_list[x])
                kaptCode_energy = [kaptCode_list[x]]
                energy_type = ["helect", "hgas", "hheat", "hwaterCool", "hwaterHot"]
                for i in range(len(energy_type)):
                    kaptCode_energy.append(energy_parsing(energy_type[i], response))
                print(kaptCode_energy)
                if not kaptCode_energy[1]: #값이 제대로 들어가지 않은 경우
                    continue
                else:
                    str = reqDate[m] + ',' + kaptCode_energy[0] + ','
                    for j in range(1, len(kaptCode_energy)):
                        if len(kaptCode_energy[j]) != 1:
                            str += ' '
                        str += kaptCode_energy[j][0] + ','
                    str += '\n'
                    des.write(str)
                    break
    elif stop == 1:
        for x in range(stopidx, len(kaptCode_list)):
            while(True):
                response = get_energy(reqDate[m], kaptCode_list[x])
                kaptCode_energy = [kaptCode_list[x]]
                energy_type = ["helect", "hgas", "hheat", "hwaterCool", "hwaterHot"]
                for i in range(len(energy_type)):
                    kaptCode_energy.append(energy_parsing(energy_type[i], response))
                print(kaptCode_energy)
                if not kaptCode_energy[1]: #값이 제대로 들어가지 않은 경우
                    continue
                else:
                    str = reqDate[m] + ',' + kaptCode_energy[0] + ','
                    for j in range(1, len(kaptCode_energy)):
                        if len(kaptCode_energy[j]) != 1:
                            str += ' '
                        str += kaptCode_energy[j][0] + ','
                    str += '\n'
                    des.write(str)
                    break
        stop = 0
    des.close()

get_kaptCode()

  • 전국 단지코드 목록 한번에 받기

get_energy()

  • Request parameter: kaptCode, reqDate
  • energy_parsing()의 input parameter를 통해 해당 함수를 호출하여 helect, hgas, hheat, hwaterCool, hwaterHot의 값들을 parsing하여 가져옴
  • response.status_code가 200인 경우에만 (서버로부터 정상적으로 응답을 받은 경우에만) 값을 반환하도록 구현
  • 왜인진 모르겠지만, 사용량이 음수인 경우도 있어서 pattern을 "<"+energy_type+">"+"(-?[0-9]+)</"+energy_type+">"와 같이 정의함 (? 앞의 문자가 있을 수도 있고 없을 수도 있다)

Algorithm

  • kaptCode_list는 그냥 local에 저장된 txt 파일을 읽어서 모든 kaptCode들을 list 형식으로 저장함
  • 일단 reqDate list로 2022년 1월부터 12월까지 순회할 수 있도록 구현
  • kaptCode_enery list가 하나의 단지코드에 해당하는 에너지 소비량 데이터들의 list
    -> [kaptCode, [helect], [hgas], [hheat], [hwaterCool], [hwaterHot]] 형식
  • 가끔씩 요청을 제대로 못받는 경우가 있는데, 그 경우는 stop flag와 stopidx 변수를 이용해 수동으로 해결
  • 이유는 모르겠으나 status_code가 200이어도 값을 제대로 못받는 경우가 있음
    -> 무한루프 돌면서 list가 empty인 경우 continue/ 그렇지 않으면 필요한 코드 실행하고 break
  • 운영계정 등록해서 하루 traffic limit을 100,000회로 늘려놓음
  • timeout error는 try, except문으로 time.sleep(2)하여 일시정지 시키고 다시 try 하도록 구현하여 해결
  • 확인 차 한 줄씩 print하도록 코드 짰는데 어차피 한줄 한줄 api 요청 받아야하는거니까 syscall에 의한 성능 저하는 없을듯
profile
Software Engineer @ LG Electronics

0개의 댓글