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()
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에 의한 성능 저하는 없을듯