빅데이터 김교수의 "AI노마드연구소" AI로 열어가는 노마드 세상!

빅데이터 김교수의 "AI노마드연구소" AI로 열어가는 노마드 세상입니다. AI 코딩작성, SNS 분석, AI업무자동화 컨설팅 0507-1419-0222

자세히보기

교육/파이썬빅데이터분석교육

[파이썬 실습] 공공데이터 API 연동하여 출입국 정보 가져오기

빅데이터 김교수 2022. 6. 8. 13:29

ch05 파이썬 크롤링 - API 이용.pdf
1.65MB

1. 공공데이터 가져오기 소스(Json 파일 형태로)

# 공공 출입국통계 데이터 크룰링
import os
import sys
import urllib.request
import datetime
import time
import json
import pandas as pd

ServiceKey=" 각자 코드"



#[CODE 1]
def getRequestUrl(url):    
    req = urllib.request.Request(url)  #get방식으로 만들어진 URL(파라메타)  
    try: 
        response = urllib.request.urlopen(req)
        if response.getcode() == 200: # 
            print ("[%s] Url Request Success" % datetime.datetime.now())
            return response.read().decode('utf-8')
    except Exception as e:
        print(e)
        print("[%s] Error for URL : %s" % (datetime.datetime.now(), url))
        return None


#[CODE 2]
def getTourismStatsItem(yyyymm, national_code, ed_cd):    
  #                http://openapi.tour.go.kr/openapi/service/EdrcntTourismStatsService/getEdrcntTourismStatsList
    service_url = "http://openapi.tour.go.kr/openapi/service/EdrcntTourismStatsService/getEdrcntTourismStatsList"
    parameters = "?_type=json&serviceKey=" + ServiceKey   #인증키 Get방식 획득
    parameters += "&YM=" + yyyymm
    parameters += "&NAT_CD=" + national_code
    parameters += "&ED_CD=" + ed_cd
    url = service_url + parameters
    
    retData = getRequestUrl(url)   #[CODE 1]
    
    if (retData == None):
        return None
    else:
        return json.loads(retData)

#[CODE 3]
def getTourismStatsService(nat_cd, ed_cd, nStartYear, nEndYear): # 파라메타
# nat_cd, ed_cd, nStartYear, nEndYear : 아규먼트 
    jsonResult = []
    result = []
    natName=''
    dataEND = "{0}{1:0>2}".format(str(nEndYear), str(12)) #데이터 끝 초기화 01, 02
    isDataEnd = 0 #데이터 끝 확인용 flag 초기화    
    
    for year in range(nStartYear, nEndYear+1):        
        for month in range(1, 13):
            if(isDataEnd == 1): break #데이터 끝 flag 설정되어있으면 작업 중지.

            yyyymm = "{0}{1:0>2}".format(str(year), str(month))            
            jsonData = getTourismStatsItem(yyyymm, nat_cd, ed_cd) #[CODE 2]
            
            if (jsonData['response']['header']['resultMsg'] == 'OK'):               
                # 입력된 범위까지 수집하지 않았지만, 더이상 제공되는 데이터가 없는 마지막 항목인 경우 -------------------
                if jsonData['response']['body']['items'] == '': 
                    isDataEnd = 1 #데이터 끝 flag 설정
                    dataEND = "{0}{1:0>2}".format(str(year), str(month-1))
                    print("데이터 없음.... \n 제공되는 통계 데이터는 %s년 %s월까지입니다."                          
                          %(str(year), str(month-1)))                    
                    break                
                #jsonData를 출력하여 확인......................................................
                print (json.dumps(jsonData, indent=4, 
                         sort_keys=True, ensure_ascii=False))          
                natName = jsonData['response']['body']['items']['item']['natKorNm']
                natName = natName.replace(' ', '')
                num = jsonData['response']['body']['items']['item']['num']
                ed = jsonData['response']['body']['items']['item']['ed']
                print('[ %s_%s : %s ]' %(natName, yyyymm, num))
                print('----------------------------------------------------------------------')                
                jsonResult.append({'nat_name': natName, 'nat_cd': nat_cd,
                                 'yyyymm': yyyymm, 'visit_cnt': num})
                result.append([natName, nat_cd, yyyymm, num])
    return (jsonResult, result, natName, ed, dataEND)

#[CODE 0]
def main():
    jsonResult = []#변수 초기화
    result = []#
    natName=''#
    print("<< 국내 입국한 외국인의 통계 데이터를 수집합니다. >>")
    nat_cd = input('국가 코드를 입력하세요(중국: 112 / 일본: 130 / 미국: 275 /아프카니스탄:101 ) : ')
    nStartYear =int(input('데이터를 몇 년부터 수집할까요? : '))
    nEndYear = int(input('데이터를 몇 년까지 수집할까요? : '))
    ed_cd = "E"     #E : 방한외래관광객, D : 해외 출국
    
    jsonResult, result, natName, ed, dataEND =getTourismStatsService(nat_cd,
                                            ed_cd, nStartYear, nEndYear) #[CODE 3]

    if (natName=='') : #URL 요청은 성공하였지만, 데이터 제공이 안된 경우
        print('데이터가 전달되지 않았습니다. 공공데이터포털의 서비스 상태를 확인하기 바랍니다.')
    else:
        #파일저장 1 : json 파일       
        with open('./%s_%s_%d_%s.json' % (natName, ed, nStartYear, dataEND), 'w', 
                    encoding='utf8') as outfile:
            jsonFile  = json.dumps(jsonResult, indent=4, sort_keys=True, ensure_ascii=False)
            outfile.write(jsonFile)
        #파일저장 2 : csv 파일   
        columns = ["입국자국가", "국가코드", "입국연월", "입국자 수"] # 2번문제.. 항목추가
        result_df = pd.DataFrame(result, columns = columns)
        result_df.to_csv('/content/drive/MyDrive/%s_%s_%d_%s.csv' % (natName, ed, nStartYear, dataEND),
                    index=False, encoding='utf8')
    
if __name__ == '__main__':   
     main()

2. JSON파일을 엑셀파일로 변환

import json
import csv

# Specify the path to the input and output files
con = input("국가명")
input_path = "/content/미국_방한외래관광객_2017_202212.json"
output_path = f"{con}.csv"

# Load the JSON data from the input file
with open(input_path) as input_file:
    data = json.load(input_file)

# Open the output file in write mode
with open(output_path, "w", newline="") as output_file:
    # Create a CSV writer object
    writer = csv.writer(output_file) #to_csv

    # Write the header row
    writer.writerow(data[0].keys())

    # Write each row of data
    for row in data:
        writer.writerow(row.values())

# Print a message indicating that the conversion is complete
print("Conversion complete.")

위 내용을 참고해서 출입국 현황을 엑셀로 저장해 보세요!

 

과제) 위 내용을 참고하여 https://www.data.go.kr/data/15057511/openapi.do 아파트 실시간 거래 정보를 크룰링하여 그래프로 나타내는 파이썬 코드를 작성한후 소스코드를 제출하세요!

 제출 주소 : https://classroom.google.com/c/NTYzMDY3NzI3NzI4/a/NTU0MTcwMjM5NTQy/details