본문 바로가기
데이터활용

[데이터]주소데이터 수집2 행안부 주소API/주소검색솔루션 활용 데이터 수집하기

by 황금웃음만두 2020. 1. 12.

행안부 주소검색솔루션을 사용하여 주소를 수집하는 방법입니다

 

주소검색 솔루션 다운로드는 아래 링크에 설명되어있습니다

https://gimmotti.tistory.com/9

 

[데이터]주소데이터 수집1 행안부 주소API/주소검색솔루션 사용하기

이 포스팅에서는 DB에서 텍스트 주소(지번 또는 도로명)만 가지고 있으며, 행정구역코드, 우편번호가 없어 해당 DB를 추가 수집하고자 하는 방법을 설명하고자 합니다 행안부에서는 주소 데이터를 제공하고 있으며..

gimmotti.tistory.com

 

 

프로그램을 실행시키면 화면에서도 주소를 검색할 수 있지만 아래 경로를 통해 JSON, XML로 주소를 받을수도 있습니다

 

 

http://127.0.0.1:8983/app/search/addrSearchApi.do?

 

파라메터는 다음과 같습니다

resultType = Json , xml 

countPerPage = 결과의 개수 (* 검색결과가 여러개 있을 수 있습니다 1이라고 기재하면 첫번째 결과를 가져옵니다)

keyword = 검색어

 

http://127.0.0.1:8983/app/search/addrSearchApi.do?resultType=xml&countPerPage=1&keyword=강원도 태백시 황지동 123

 

 

위 경로의 검색결과입니다(XML)

http://127.0.0.1:8983/app/search/addrSearchApi.do?resultType=json&countPerPage=1&keyword=강원도 태백시 황지동 123

 

위 경로의 검색결과입니다(json)

 

 

 

 

이를 활용하면 여러 건의 주소 데이터를 키워드를 통해 검색하는 프로그램을 만들 수 있습니다

 

 

제가 해본 방법은 다음과 같습니다

1. 수집할 key, keyword를 가지는 목록 파일 추출

2. 목록파일을 읽어 위 경로를 호출하고, 결과를 저장하는 프로그램 작성

3. 주소검색솔루션 서버 startup

4. 주소 검색&수집 프로그램 동작

5. 수집된 목록 획득

 

 

아래는 파이썬으로 호출하는 프로그램 예입니다

 

 

function.py

import pandas as pd
import xml.etree.ElementTree as ET
import os
import time
from urllib.request import urlopen
from urllib import parse
from app.Module.logger import logger
base_dir = os.path.dirname( os.path.abspath( __file__ ) )



def searchJuso(param):
    #local juso api server url
    url = "http://127.0.0.1:8983/app/search/addrSearchApi.do?resultType=xml&countPerPage=1&keyword="+param
    response = urlopen(url).read().decode("utf-8")
    return response


def makeOutput(InputFileNm,OutputFileNm):
    logger.info("Start Juso Extract-makeOutput")
    df = pd.read_excel(InputFileNm, sheet_name='Sheet1')

    header = ""
    header_strings =["no"
                    ,"key"
                    ,"keyword"
                    ,""
                    ,""
                    ,"totalcount"
                    ,"currentpage"
                    ,"countperpage"
                    ,"errorcode"
                    ,"errormessage"
                    ,""
                    ,"roadAddr"
                    ,"roadAddrPart1"
                    ,"roadAddrPart2"
                    ,"jibunAddr"
                    ,"engAddr"
                    ,"zipNo"
                    ,"admCd"
                    ,"rdMgtSn"
                    ,"bdMgtSn"
                    ,"detBdNmList"
                    ,"bdNm"
                    ,"siNm"
                    ,"sggNm"
                    ,"emdNm"
                    ,"liNm"
                    ,"rn"
                    ,"buldMnnm"
                    ,"buldSlno"
                    ,"lnbrMnnm"
                    ,"lnbrSlno"
                    ,"bdKdcd"
                    ,"udrtYn"
                    ,"mtYn" ]

#make header
    for i in header_strings:
        header = header + i + "\t"


    f = open(OutputFileNm, mode='wt', encoding='utf-8')
#write header
    f.write(header)
    f.write("\n")

    start_time = "start time : " + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    logger.info(start_time)
    end_time = ''

    for c in df.index:
        time.sleep(0.007) # 요청 주기를 조정하지 않으면 서버에서 오류발생
        key = str(df.loc[c, "key"])
        keyword = str(df.loc[c, "keyword"])
        root = ET.fromstring(searchJuso(parse.quote(keyword, encoding='utf-8')))
        result = ''
        result += str(c) + "\t" + str(key) + "\t" + str(keyword) + "\t"
        for child in root.iter():
            result += str(child.text) + "\t"
        logger.info(result)
        f.write(result)
        f.write("\n")

    end_time = "end time : " + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    f.write(start_time)
    f.write("\n")
    f.write(end_time)

    # end Write result
    f.close()
    logger.info("End Juso Extract")

 

main.py

 * function.py의 makeOutput 함수를 사용하여 결과를 만듭니다

import os
from app.Module import functions
from app.Module.logger import logger


def main():

    #log = logger.GetLogger()
    base_dir = os.path.dirname(os.path.abspath(__file__))

    # read Xlsx
    InputFileNm = base_dir + "\Files\INPUT.xlsx"
    logger.info("input file : "+InputFileNm)

    # setting result file
    OutputFileNm = base_dir + "\Files\OUTPUT.txt"
    logger.info("output file : "+OutputFileNm)

    try:
        functions.makeOutput(InputFileNm, OutputFileNm)
    except Exception as ex:
        logger.info(ex)
        logger.info(ex.with_traceback())


if __name__ == "__main__":
    main()

 

 

아래는 input 파일의 예시입니다

 키워드는 지번주소입니다. 키워드는 다양하게 만들 수 있습니다

 

 

아래는 프로그램을 돌려서 나온 output 파일입니다

txt 파일로 출력했으며 구분자는 tab입니다. 이 경우 엑셀에서도 불러올 수 있습니다

 

 

 

 

INPUT 파일의 keyword로 사용한 것은 지번주소이며, 지번 주소를 통해 도로명 주소를 수집하고 

 

아래의 추가데이터까지 모두 수집이 가능합니다

 

데이터 영문명 데이터 한글명 데이터타입
roadFullAddr 전체 도로명주소 String
roadAddrPart1 도로명주소(참고항목 제외) String
roadAddrPart2 도로명주소 참고항목 String
jibunAddr 지번 주소 String
engAddr 도로명주소(영문) String
zipNo 우편번호 String
admCd 행정구역코드 String
rnMgtSn 도로명코드 String
bdMgtSn 건물관리번호 String
bdNm 건물명 String
bdKdcd 공동주택여부 String
siNm 시도명 String
sggNm 시군구명 String
emdNm 읍면동명 String
liNm 법정리명 String
rn 도로명 String
udrtYn 지하여부 String
buldMnnm 건물본번 Number
buldSlno 건물부번 Number
mtYn 산여부 String
lnbrMnnm 지번본번(번지) Number
lnbrSlno 지번부번(호) Number

 

 

키워드가 리턴되지 않을 경우 

 

리턴된 결과에 totalcount가 0으로 찍힙니다 이떄는 키워드를 보완하여 재수집을 해야 합니다

 

 

 

 

 

이상으로 포스팅을 마칩니다

댓글