#python #anaconda #jupyter-notebook #visual-code #html #css #javascript #http

제목책에서 크롤링 예제를 그대로 따라해봤는데 오류가 생깁니다..2022-04-15 21:57
작성자

#2020년부터 지금까지 우리나라에 입국한 외국인 수 구하기

import os

import sys

import urllib.request

import datetime

import time

import json

import pandas as pd


ServiceKey = 'Yd1KzUHqtkeLw1sfuF4Nz41O5z3%2FdSwgvm2upCXhdYoHl5o7gQhHW%2FTkWNtmTksMDwj4%2BD%2Ft%2FFNaZqA6Y1MqzQ%3D%3D'


#[CODE 1]

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



#[CODE 2]

def getTourismStatsItem(yyyymm, national_code, ed_cd):

    service_url = "http://openapi.tour.go.kr/openapi/service/EdrcntTourismStatsService/getEdrcntTourismStatsList"

    

    parameters = "?_type=json&serviceKey=" + ServiceKey #인증키

    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):

    jsonResult = []

    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 = getTourismStatsItem(yyyymm, nat_cd, ed_cd)   #[CODE 2]

            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('-----------------------------------------------')

                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 = []

    

    print("<국내 입국한 외국인의 통계 데이터를 수집합니다.>")

    nat_cd = input('국가 코드를 입력하세요(중국: 112 / 일본: 130 / 미국: 275) : ')

    nStartYear = int(input('데이터를 몇 년도부터 수집할까요? : '))

    nEndYear = int(input('데이터를 몇 년도까지 수집할까요? : '))

    ed_cd = "E"   # E : 방한외래관광객, D : 해외출국


    jsonResult, result, natName, dataEND = getTourismStatsService(nat_cd, ed_cd, nStartYear, nEndYear)   #[CODE 3]

    

    #파일저장 1 : json 파일

    with open('./%s_%s_%d_%s.json' % (natName, ed, nStartYear, dataEND), 'w', encoding='ut48') as outfile:

        jsonFile = json.dumps(jsonResult, indent = 4, sort_keys = True, ensure_ascii = False)

        outfile.write(jsonFile)

    #파일저장 2 : csv 파일

    columns = ["입국자국가", "국가코드", "입국연월", "입국자 수"]

    result_df.to_csv('./%s_%s_%d_%s.csv' % (natName, ed, nStartYear, dataEND), index=False, encoding='cp949')



if __name__ == '__main__':

    main()


여기까지 짰는데 비주얼스튜디오에서 뜨는 오류메시지는 다음과 같습니다


NameError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_22276/933122399.py in <module> 97 98 if __name__ == '__main__': ---> 99 main() ~\AppData\Local\Temp/ipykernel_22276/933122399.py in main() 85 ed_cd = "E" # E : 방한외래관광객, D : 해외출국 86 ---> 87 jsonResult, result, natName, dataEND = getTourismStatsService(nat_cd, ed_cd, nStartYear, nEndYear) #[CODE 3] 88 89 #파일저장 1 : json 파일 ~\AppData\Local\Temp/ipykernel_22276/933122399.py in getTourismStatsService(nat_cd, ed_cd, nStartYear, nEndYear) 71 jsonResult.append({'nat_name': natName, 'nat_cd': nat_cd, 'yyyymm': yyyymm, 'visit_cnt': num}) 72 result.append([natName, nat_cd, yyyymm, num]) ---> 73 return (jsonResult, result, natName, ed, dataEND) 74 75 NameError: name 'ed' is not defined 

인터넷에 검색해서 ed 정의한 식 위에 global ed를 붙여보면 name 'ed' is not defined 라고 뜹니다ㅠㅠ 어떻게 해결해야 하나요 

댓글