[๊ณต๊ณต๋ฐ์ดํฐ ํฌํธ API๋ฅผ ํ์ฉํ ์น ํฌ๋กค๋ง]
ใ API ์ค๋น ใ
โ ๊ณต๊ณต๋ฐ์ดํฐ ํฌํธ(https://www.data.go.kr/)์ ์ ์ํ์ฌ ํ์๊ฐ์ ์ ํ๋ค.
โก ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ํค์๋๋ฅผ ๊ฒ์ ํ ์คํ API ํ์ฉ์ ์ ์ฒญํ๋ค.
โข ํ์ฉ๋ชฉ์ ๋ฐ ์์ธ๊ธฐ๋ฅ์ ๋ณด๋ฅผ ์ ํ ํ ํ์ฉ ์น์ธ์ด ๋๋ฉด ๋ง์ดํ์ด์ง๋ฅผ ํตํด ์ธ์ฆํค / ์๋น์ค URL ํ์ธ ๊ฐ๋ฅ
โฃ ์์ธ์ ๋ณด ๋ฐ ํ์ฉ๊ฐ์ด๋.doc๋ฅผ ํตํด ์์ฒญ๋ณ์, ์ถ๋ ฅ ๊ฒฐ๊ณผ ๋ฐ ๋ค์ํ ์ ๋ณด ๋ฑ์ ํ์ธ ๊ฐ๋ฅ
ใ ์ฝ๋ ์์ฑ ใ
[ํจ์์ ์คํ ์์]
โ main()
โก getTourismStateService()
โข getTourismStateItem()
โฃ getRequestUrl()
[๋ชจ๋ ์ ์ธ๋ถ]
import requests # requests ๋ชจ๋ : http / https ์น์ ์์ฒญ์ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ
import urllib.request # urllib.request ๋ชจ๋ : URL์ด๋ HTTP๋ฅผ ์ฌ๋๋ฐ ๋์์ด ๋๋ ํจ์์ ํด๋์ค ์ ๊ณต
import json # JSON ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ชจ๋
import pandas as pd # ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ฐฐ์ด์ ๋ฐ์ดํฐํ๋ ์ํ ์ํค๊ณ csv ํ์ผ๋ก ์ ์ฅํ๊ธฐ ์ํ ๋ชจ๋
import datetime # ํ์ฌ ๋ ์ง/์๊ฐ์ ๋ฐํํด์ฃผ๋ ํจ์์ธ datetime.datetime.now() ํจ์ ์ฌ์ฉ
[ โ main() ]
def main():
result = []
natName = ''
print("ใ ๊ตญ๋ด ์
๊ตญ ์ธ๊ตญ์ธ์ ํต๊ณ ๋ฐ์ดํฐ ์์ง ใ")
nat_cd = input("๊ตญ๊ฐ ์ฝ๋๋ฅผ ์
๋ ฅํ์ธ์ (์ค๊ตญ: 112 / ์ผ๋ณธ: 130 / ๋ฏธ๊ตญ 275) : ")
nStartYear = int(input("๋ฐ์ดํฐ๋ฅผ ๋ช ๋
๋ถํฐ ์์งํ ๊น์? : "))
nEndYear = int(input("๋ฐ์ดํฐ๋ฅผ ๋ช ๋
๊น์ง ์์งํ ๊น์? : "))
ed_cd = "E" # E: ๋ฐฉํ ์
๊ตญ ์ธ๊ตญ์ธ, D : ํด์ธ ์ถ๊ตญ ์ธ๊ตญ์ธ
result, natName, ed, dataEND = getTourismStateService(nat_cd, ed_cd, nStartYear, nEndYear)
if(natName == ''): # URL ์์ฒญ์ ์ฑ๊ณตํ์์ผ๋ ๋ฐ์ดํฐ ์ ๋ฌ์ ์คํจํ ๊ฒฝ์ฐ
print("๋ฐ์ดํฐ๊ฐ ์ ์์ ์ผ๋ก ์ ๋ฌ๋์ง ์์์ต๋๋ค. ๊ณต๊ณต๋ฐ์ดํฐํฌํธ ์๋น์ค ์ํ๋ฅผ ํ์ธํ์ญ์์ค")
else:
# csvํํ๋ก ํ์ผ ์ ์ฅ
columns = ["์
๊ตญ ๊ตญ๊ฐ", "๊ตญ๊ฐ ์ฝ๋", "์
๊ตญ ์ฐ์", "์
๊ตญ์ ์"]
result_df = pd.DataFrame(result, columns = columns) # pandas ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๋ฐ์ดํฐํ๋ ์ ํ๋ณํ
result_df.to_csv("./%s_%s_%d_%s.csv"%(natName,ed, nStartYear, dataEND),
index=False, encoding="cp949")
[ โก getTourismStateService() ]
# getTourismStateService(๊ตญ๊ฐ ์ฝ๋, ์ถ/์
๊ตญ ์ฌ๋ถ, ์์์ผ์, ์ข
๋ฃ์ผ์) : ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ(์ ๋จ์ ํฌ๋งทํ
)
# ์ฝ์์ getTourismStateItem()์ ํตํด ์ ๋ฌ๋ฐ์ Json ๋ฐ์ดํฐ ๋ฌธ์์ด ๋ณํ ์ถ๋ ฅ,
# ๊ตญ๊ฐ๋ช
/์ฝ๋, ์ฐ๋, ๋ฐฉ๋ฌธ๊ฐ ์๊ฐ ์ ์ฅ๋ result ๋ฐฐ์ด, ๊ตญ๊ฐ๋ช
, ์ถ/์
๊ตญ ์ฌ๋ถ, ๋ฐ์ดํฐ์ ๋ ๋ฒ์ ๋ฐํ
def getTourismStateService(nat_cd, ed_cd, nStartYear, nEndYear):
result = []
natName = ''
# format() ํจ์ ์ฌ์ฉ dataEND ๊ฐ์ ๋ฒ์ ์ง์
# {0}{1:0>2} -> ์ฒซ๋ฒ์งธ {0}๋ {"nEndYear"}, ๋๋ฒ์จฐ {1:0>2}๋ {"12"}
# ์ด๋ {1:0>2} ๋ ๋น ๊ณต๊ฐ์ 0์ผ๋ก์ฑ์ฐ๊ณ ์ค๋ฅธ์ชฝ ์ ๋ ฌ์ด๋ผ๋ ์๋ฏธ
dataEND = "{0}{1:0>2}".format(str(nEndYear), str(12)) # ๋ฐ์ดํฐ ๋ ๋ฒ์ ์ด๊ธฐํ
isDataEnd = 0 # ๋ฐ์ดํฐ ๋ ํ์ธ์ฉ flag ์ด๊ธฐํ
for year in range(nStartYear, nEndYear + 1):
for month in range(1, 13):
if(isDataEnd == 1): # dateEnd๊ฐ ์ฐธ์ผ๊ฒฝ์ฐ break (๋ฐ์ดํฐ์ ๋์ ๋ง๋ ๊ฒฝ์ฐ)
break
yyyymm = "{0}{1:0>2}".format(str(year), str(month))
# getTourismStateItem() ํจ์๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ json ๊ฐ์ฒด ์ ๋ณด ์ ์ฅ
jsonData = getTourismStateItem(yyyymm, nat_cd, ed_cd)
# jsonData ์ฌ๊ฒ์ฆ json ๊ฐ์ฒด์ response.header.resultMSg == OK ์ธ๊ฒฝ์ฐ(์ ์ ์ ๋ฌ์ธ ๊ฒฝ์ฐ)
if(jsonData["response"]["header"]["resultMsg"] == "OK"):
# ์
๋ ฅ๋ ๋ฒ์๊น์ง ์์งํ์ง ์์์ง๋ง, ๋ ์ด์ ์ ๊ณต๋๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ง์ง๋ง ํญ๋ชฉ์ผ ๊ฒฝ์ฐ
if(jsonData["response"]["body"]["items"] == ""):
isDataEnd = 1 # isDataEnd ์ฐธ์ผ๋ก ์ค์
dataEND = "{0}{1:0>2}".format(str(year), str(month-1))
print("๋ฐ์ดํฐ ์์....\n ์ ๊ณต๋๋ ํต๊ณ ๋ฐ์ดํฐ๋ %s๋
%s์๊น์ง์
๋๋ค."%(str(year), str(month -1)))
break
# jsonData๋ฅผ JSON ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ์ถ๋ ฅ
# json.dumps(object, indent(๋ค์ฌ์ฐ๊ธฐ ๋ฒ์ ์ง์ ), sort_keys(์ ๋ ฌ ์ ๋ฌด), ensure_ascii=False(๋ฌธ์ ๊ทธ๋๋ก ์ถ๋ ฅ))
print(json.dumps(jsonData, indent=4, sort_keys=True, ensure_ascii=False))
natName = jsonData["response"]["body"]["items"]["item"]["natKorNm"]
natName = natName.replace(' ', '') # replace()๋ฅผ ํตํด ๊ณต๋ฐฑ ์ ๊ฑฐ
num = jsonData["response"]["body"]["items"]["item"]["num"] # ๋ฐฉ๋ฌธ๊ฐ ์
ed = jsonData["response"]["body"]["items"]["item"]["ed"] # ์ถ/์
๊ตญ ์ฌ๋ถ
print("[ %s_%s : %s ]" %(natName, yyyymm, num))
print("-----------------------------------------------------------")
# result ๋ฐฐ์ด์ ๊ตญ๊ฐ๋ช
, ๊ตญ๊ฐ์ฝ๋, ์ฐ๋, ๋ฐฉ๋ฌธ๊ฐ ์ ์ ์ฅ
result.append([natName, nat_cd, yyyymm, num])
# result๋ฐฐ์ด, ๊ตญ๊ฐ๋ช
, ์ถ/์
๊ตญ ์ฌ๋ถ, ๋ฐ์ดํฐ์ ๋ ๋ฒ์ ๋ฐํ
return(result, natName, ed, dataEND)
[ โข getTourismStateItem() ]
# getTourismStateItem(๊ธฐ์ค์ฐ๋, ๊ตญ๊ฐ์ฝ๋, ์ถ/์
๊ตญ ์ฌ๋ถ) : ์ ๋ฌ๋ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด url ์์ฑ ํ
# getRequestUrl() ํจ์๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ json ๊ฐ์ฒด ๋ฐํ
def getTourismStateItem(yyyymm, national_cd, ed_cd):
# API ์ผ๋ฐ ์ธ์ฆํค(Encoding)
ServiceKey = 'SkDEhhMCcC0eh%2BRvAs9gCyxU2UQG%2BIEpQ9Elj8qQ7bF6aVfRFgjFHWly2r%2F2RtnFV%2BkSQ6O6woik9%2B%2B8cTEioA%3D%3D'
# ์๋น์ค url
service_url = 'http://openapi.tour.go.kr/openapi/service/EdrcntTourismStatsService/getEdrcntTourismStatsList'
parameters = f'?_type=json&serviceKey={ServiceKey}&YM={yyyymm}&NAT_CD={national_cd}&ED_CD={ed_cd}'
# url์ service_url + ๊ฐ์ธ ์ธ์ฆํค + ์ป๊ณ ์ ํ๋ ์ ๋ณด์ ๋ฒ์ ์
๋ ฅ
# f`http://openapi.tour.go.kr/openapi/service/EdrcntTourismStatsService/getEdrcntTourismStatsList
# ?_type=json&serviceKey=${serviceKey}&YM=${yyyymm}&NAT_CD=${national_cd}&ED_CD={ed+cd}`
url = service_url + parameters
retData = getRequestUrl(url) # getRequestUrl() ํจ์ ํธ์ถ
if (retData == None):
return None
else:
return json.loads(retData)
[ โฃ getRequestUrl() ]
# getRequestUrl(url) : ์ ๋ฌ๋ฐ์ url์ ํตํด json ํํ์ ์๋ต ๊ฐ์ฒด ๋ฐํ
def getRequestUrl(url):
# urllib.request.Request() : ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ์ธ์ฝ๋ฉํ์ฌ ๋ฐ์ด๋๋ฆฌ ํํ๋ก ๋ณด๋. ์๋ ํ์ด์ง ์์ฒญ์ ์๋ฌ
req = urllib.request.Request(url)
try:
response = urllib.request.urlopen(req) # ์ ๋ฌํ url์ ํตํด ๋ฐํ๋ ๋ฐ์ดํฐ ์ ๋ณด ์ ์ฅ
if response.getcode()==200: # code==200์ธ ๊ฒฝ์ฐ : ์ ์ ๊ฒฝ๋ก๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ ๊ฒฝ์ฐ
print("[%s] Url Request Success" %datetime.datetime.now())
return response.read().decode('utf-8') # 'utf-8' ํ์์ผ๋ก ๋์ฝ๋ฉํ ๋ฐ์ดํฐ ๋ฐํ
except Exception as e: # ์๋ฌ ์ถ๋ ฅ ๊ตฌ๋ฌธ
print(e)
print("[%s] Error for URL : %s" %(datetime.datetime.now(), url))
return None
ใ ์ต์ข ํํ์ ์ฝ๋ ใ
import requests # requests ๋ชจ๋ : http / https ์น์ ์์ฒญ์ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ
import urllib.request # urllib.request ๋ชจ๋ : URL์ด๋ HTTP๋ฅผ ์ฌ๋๋ฐ ๋์์ด ๋๋ ํจ์์ ํด๋์ค ์ ๊ณต
import json # JSON ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ชจ๋
import pandas as pd # ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ฐฐ์ด์ ๋ฐ์ดํฐํ๋ ์ํ ์ํค๊ณ csv ํ์ผ๋ก ์ ์ฅํ๊ธฐ ์ํ ๋ชจ๋
import datetime # ํ์ฌ ๋ ์ง/์๊ฐ์ ๋ฐํํด์ฃผ๋ ํจ์์ธ datetime.datetime.now() ํจ์ ์ฌ์ฉ
def getTourismStateService(nat_cd, ed_cd, nStartYear, nEndYear):
result = []
natName = ''
dataEND = "{0}{1:0>2}".format(str(nEndYear), str(12))
isDataEnd = 0
for year in range(nStartYear, nEndYear + 1):
for month in range(1, 13):
if(isDataEnd == 1):
break
yyyymm = "{0}{1:0>2}".format(str(year), str(month))
jsonData = getTourismStateItem(yyyymm, nat_cd, ed_cd)
if(jsonData["response"]["header"]["resultMsg"] == "OK"):
if(jsonData["response"]["body"]["items"] == ""):
isDataEnd = 1
dataEND = "{0}{1:0>2}".format(str(year), str(month-1))
print("๋ฐ์ดํฐ ์์....\n ์ ๊ณต๋๋ ํต๊ณ ๋ฐ์ดํฐ๋ %s๋
%s์๊น์ง์
๋๋ค."%(str(year), str(month -1)))
break
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("-----------------------------------------------------------")
result.append([natName, nat_cd, yyyymm, num])
return(result, natName, ed, dataEND)
def getTourismStateItem(yyyymm, national_cd, ed_cd):
ServiceKey = 'Input Your Encoding key'
service_url = 'http://openapi.tour.go.kr/openapi/service/EdrcntTourismStatsService/getEdrcntTourismStatsList'
parameters = f'?_type=json&serviceKey={ServiceKey}&YM={yyyymm}&NAT_CD={national_cd}&ED_CD={ed_cd}'
url = service_url + parameters
retData = getRequestUrl(url)
if (retData == None):
return None
else:
return json.loads(retData)
def getRequestUrl(url):
req = urllib.request.Request(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
def main():
result = []
natName = ''
print("ใ ๊ตญ๋ด ์
๊ตญ ์ธ๊ตญ์ธ์ ํต๊ณ ๋ฐ์ดํฐ ์์ง ใ")
nat_cd = input("๊ตญ๊ฐ ์ฝ๋๋ฅผ ์
๋ ฅํ์ธ์ (์ค๊ตญ: 112 / ์ผ๋ณธ: 130 / ๋ฏธ๊ตญ 275) : ")
nStartYear = int(input("๋ฐ์ดํฐ๋ฅผ ๋ช ๋
๋ถํฐ ์์งํ ๊น์? : "))
nEndYear = int(input("๋ฐ์ดํฐ๋ฅผ ๋ช ๋
๊น์ง ์์งํ ๊น์? : "))
ed_cd = "E"
result, natName, ed, dataEND = getTourismStateService(nat_cd, ed_cd, nStartYear, nEndYear)
if(natName == ''):
print("๋ฐ์ดํฐ๊ฐ ์ ์์ ์ผ๋ก ์ ๋ฌ๋์ง ์์์ต๋๋ค. ๊ณต๊ณต๋ฐ์ดํฐํฌํธ ์๋น์ค ์ํ๋ฅผ ํ์ธํ์ญ์์ค")
else:
columns = ["์
๊ตญ ๊ตญ๊ฐ", "๊ตญ๊ฐ ์ฝ๋", "์
๊ตญ ์ฐ์", "์
๊ตญ์ ์"]
result_df = pd.DataFrame(result, columns = columns)
result_df.to_csv("./%s_%s_%d_%s.csv"%(natName,ed, nStartYear, dataEND),
index=False, encoding="cp949")
if __name__ == '__main__':
main()
ใ ์คํ ๊ฒฐ๊ณผ ใ