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
'교육 > 파이썬빅데이터분석교육' 카테고리의 다른 글
[파이썬]선형회귀분석 t-검증을 이용한 와인 품질 등급 예측하기 (0) | 2022.07.04 |
---|---|
[파이썬]정적크룰링교안 (0) | 2022.06.16 |
[파이썬]네이버API이용한 크룰링 활용 (0) | 2022.06.07 |
[파이썬]공공데이터API 출입국정보크룰링 소스 (0) | 2022.06.02 |
[파이썬]8.1 DNA 프로젝트 (0) | 2022.05.30 |