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

+ Recent posts