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
반응형
'파이썬+VBA' 카테고리의 다른 글
파이썬 tkinter 이용해서 여러개 문자 변경가능한 메모장 만들기 (1) | 2023.12.21 |
---|---|
파이썬 판다스 pandas ... 모두 출력하기 max (1) | 2023.11.24 |
공공데이터포탈(관세청API) 이용하기 (0) | 2023.10.27 |
U-CYBOS가 서버에 접속되어 있지 않습니다. (0) | 2023.09.09 |
엑셀 누적 그래프 그리기 (0) | 2023.09.06 |