728x90
반응형
import pandas as pd
import openpyxl
import xlrd
import re

pd.set_option('display.max_columns',None)
pd.set_option('display.max_rows',None)
728x90
반응형
728x90
반응형

ex) 삼양식품 - 라면 - 강원도(원주), 경상남도(밀양), 전라남도(익산) 수출건수,수출금액 가져오기

main 함수

# 0.기업별
def samyang_trade(self):
    strdate = self.dateEdit_str.date() #.toString("yyyyMM")
    enddate = self.dateEdit_end.date() #.toString("yyyyMM")
    sido = ['51','48','45'] #강원도,경상남도,전라북도
    hscode = ['1902301010'] #라면

    self.ret_value = self.trade.get_tradeData(strdate,enddate,sido,hscode)
    if self.ret_value == 101:
        QMessageBox.about(self, "message", "시작과 종료의 조회기간은 1년이내 기간만 가능합니다.")
        return 0
    QMessageBox.about(self, "message", "삼양식품 크롤링 완료")
    pass
  • 데이터를 수집할 월 을 가져오기 
  • API는 합계 데이터 (ex.1~3월 합계 수출건수, 수출금액)을 가져와서 매 달 건수,금액 가져오는 코드 필요
  • 조회기간은 1년이내만 가능
  • 총 조회가능 건수는 100건.

class 만들기

class Tradedata():
    def __init__(self):
        api_key = '---개인별 key----'
        self.url = 'http://apis.data.go.kr/1220000/sidoitemtrade/getSidoitemtradeList'
        self.strYYmm = {}
        self.endYYmm = {}
        self.sido = {}
        self.hashcode = {}
        self.params = {
            'serviceKey': api_key,
            'strtYymm': f'{self.strYYmm}',
            'endYymm': f'{self.endYYmm}',
            'sidoCd': f'{self.sido}',
            'hsSgn': f'{self.hashcode}',
            }
        pass
  • init 준비
def get_tradeData(self,strdate,enddate,sido,hscode):
    # 매월 돌려야하므로 기간 내 해당하는 월을 추출
    i=0
    priodMonth = []
    while True:
        p_date= enddate.addMonths(-i)
        i = i + 1
        a=p_date.toString("yyyyMM")
        priodMonth.append(a)
        b=strdate.toString("yyyyMM")
        re = int(a) - int(b)
        if re == 0:
            break
    if len(priodMonth) > 12 :
        return 101 #기간이 1년 넘습니다.
    priodMonth.reverse()
  • 가저온 시작/마지막 날짜 데이터 (2023-01-01)을 202301로 바꾸어줌.
  • 12개월은 넘기면 안되므로 예외값 처리
  • priodMonth 리스트에 시작~마지막 달까지 데이터 삽입 -> 결과: [202309,202308,202307]
  • priodMonth 과거 데이터 부터 조회하기 위해 reverse  -> 결과: [202307,202308,202309]
self.df_tradeData = []
df_hs = pd.DataFrame()
for hs in range(len(hscode)):
    df_sido = pd.DataFrame()
    for si in range(len(sido)):
        # 각 월 수출량
        df_mon = pd.DataFrame(index=['기간', '수출건수', '수출금액'])
        for mon in range(len(priodMonth)):
            self.params.update({'strtYymm': priodMonth[mon], 'endYymm': priodMonth[mon], 'sidoCd': sido[si], 'hsSgn': hscode[hs]})
            self.df_tradeData = self.sub_get_tradeData(priodMonth[mon])
            df_mon[len(df_mon.columns)]=self.df_tradeData
        df_sido = df_sido._append(df_mon)
    df_hs=df_hs._append(df_sido)
  • 각 params 를 이용하여 데이터를 가져옴
  • 달, 시도, 해시코드별 for문 돌아서 원하는 데이터 가져오기
def sub_get_tradeData(self, priodMonth):
    res = requests.get(self.url, params=self.params, headers={"user-agent": user_agent}, verify=False)
    data = xmltodict.parse(res.content.decode('utf-8'))
    if data['response']['body']['items'] == None: #데이터가 없는경우 0으로 예외처리
        none_df = pd.DataFrame([[priodMonth, '0', '0']], columns=['기간', '수출건수', '수출금액'])
        none_df = none_df.transpose()
        return none_df
    sub_df = pd.DataFrame(data['response']['body']['items']['item'])
    #가져온 데이터 프레임에서 수출건수와 수출금액만을 가져와서 깔끔하게 정렬하기
    sub_df =sub_df[['expLnCnt', 'expUsdAmt']]  # hsSgn에서 상세 내역 추출
    sub_df.columns = ['수출건수', '수출금액']
    sub_df[['수출건수', '수출금액']] = sub_df[['수출건수', '수출금액']].apply(
        lambda x: x.str.replace('[\s,]', '', regex=True)).astype(int)
    sub_df = sub_df.transpose() #데이터 프레임의 행과 열을 바꿈
    col_list = list(sub_df.columns)
    for i in range(len(sub_df.columns)):
        col_list[i] = i
    sub_df.columns = col_list

    #  cmtrBlncAmt expLnCnt expUsdAmt impLnCnt impUsdAmt priodTitle   hsSgn     korePrlstNm
    #0      46,403    2,052    46,467    2,751        63         총계     NaN      NaN
    #1      46,403    1,052    46,467    2,751        63       2023  190230      그 밖의 파스타
    sub_df = sub_df.drop(1,axis='columns') #결과가 위와 같으니 하나만 가져옴. 어차피 한달내용만 필요.

    add_priod_df = pd.DataFrame([[priodMonth]], index=['기간'], columns=sub_df.columns)
    sub_df= pd.concat([sub_df.iloc[:0], add_priod_df, sub_df.iloc[0:]]) # 첫행에 날짜 추가

    # sub_df 결과값
    # 기간    202301
    # 수출건수     384
    # 수출금액   15249
    return sub_df
  • 가장최근달은 데이터가 없을수도 있으므로 0으로 하나의 데이터 프레임 생성.
  • 필요한 수출건수 수출내용만 추출

 

728x90
반응형

728x90
반응형

pywintypes.com_error: (-2147352567, '예외가 발생했습니다.', (0, None, 'U-CYBOS가 서버에 접속되어 있지 않습니다.', None, 0, -2147483638), None)

사용하시는 프로그램(엑셀, Visual Studio ) 실행시 개별적으로 관리자 권한으로 실행을 선택하여 실행합니다.

근데 엑셀2016을 어떻게 관리자로 실행하냔 말이지..

이거는 그때그때 권리자권한으로 실행하고 파일을 열어야되서 귀찮음..

방법1)레지스트리 편집기 이용

여기로 들어감

만든후 더블클릭해서 값을 0으로 만들기

컴퓨터 다시 시작

728x90
반응형

'파이썬+VBA' 카테고리의 다른 글

관세청API 이용하기  (0) 2023.10.31
공공데이터포탈(관세청API) 이용하기  (0) 2023.10.27
엑셀 누적 그래프 그리기  (0) 2023.09.06
엑셀에서 파이썬사용하기(xlwings)  (0) 2023.08.11
빈칸끌어올리기VBA  (0) 2023.06.19
728x90
반응형
728x90
반응형

+ Recent posts