goodthings4me.tistory.com
juso 사이트의 검색란에 '고양시 아파트'처럼 키워드를 입력하여 우편주소, 도로명 주소, 도로명 영문주소, 지번 주소를 추출해보는 파이썬 크롤링 연습용 코드를 작성해봤다.
파이썬으로 juso 사이트에서 주소 추출하기
juso.go.kr의 검색란에 검색 키워드(예로, 고양시 아파트)를 입력하고 검색하면 도로명주소와 지번주소, 영문과 국문 변환, 우편번호 등을 확인할 수 있다.
여기서 도로명주소와 지번주소, 영문 도로명주소, 우편번호 등을 파이썬으로 크롤링해볼 것이다.
일단, 주소(URL)를 살펴보면,
https://www.juso.go.kr/support/AddressMainSearch.do?currentPage=1&countPerPage=10&&searchType=HSTRY&searchKeyword=고양시 아파트&firstSort=none&ablYn=N&synnYn=Y
- 페이지 번호와 페이지당 개수, 그리고 검색 키워드가 보인다.
- 페이지당 개수는 놔두고, 페이지 번호를 변경하면서 주소를 추출하면 된다

F12로 juso.go.kr의 html 소스를 보면,

- 도로명 주소 등의 추출 데이터는 <ol> 태그 밑에 <li> 태그로 되어있다.
- 각 페이지 내 <li> 태그 전체를 가져와서 하나씩 가져오면 주소 데이터를 추출할 수 있다.
- 도로명 주소는 class="subject1", 지번주소는 class="subject2", 도로명 영문주소는 그 하위 class="addrEngInfo", 우편번호는 class="addrWrap" 밑에 class="zipcode"에서 찾을 수 있다.
파이썬 크롤링 소스 코드
import time, random, re
import requests
from bs4 import BeautifulSoup
import openpyxl
def apt_juso(keyword, juso_cnt):
## 추출한 주소 저장할 엑셀 생성
workbook_name = 'juso_' + keyword + '.xlsx'
wb = openpyxl.Workbook()
ws = wb['Sheet']
ws.title = '주소추출'
wb.save(workbook_name)
theme_list = ['No', '우편번호', '도로명 주소', '도로명 영문주소', '지번 주소']
idx = 0
for col in range(1, len(theme_list) + 1):
ws.cell(1, col).value = theme_list[idx]
idx += 1
## 주소 추출하기
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
}
ext_cnt = int(juso_cnt//10) + 1
row = 2
for page in range(1, ext_cnt + 1):
url = f'https://www.juso.go.kr/support/AddressMainSearch.do?currentPage={page}&countPerPage=10&&searchType=\
TOTAL&searchKeyword={keyword}&firstSort=none&ablYn=Y&synnYn=N'
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
ol_lis = soup.select('#searchAddress > div.container.support_search_list > div.search_list > ol > li')
for li in ol_lis:
if juso_cnt == (row - 2):
break
try:
roed_juso = li.find('div', class_='subejct_1').find('span', class_='roadNameText').text
road = re.sub(' |\t|\r|\n', '', roed_juso).strip().replace(' ', ' ')
print(f'\n[{row-1}] 주소추출:\n{road}')
road_eng = li.find('div', class_='addrEngInfo').find('span', class_='addrEng').text
eng_roadname = re.sub(' |\t|\r|\n', '', road_eng).strip().replace(' ', ' ')
print(eng_roadname)
jibeon_juso = li.find('div', class_='subejct_2').find('span', class_='roadNameText').text
jibeon = re.sub(' |\t|\r|\n', '', jibeon_juso).strip().replace(' ', ' ')
print(jibeon)
zipcode = li.select_one('div.addrWrap > div.zipcode > div > strong').text
print(zipcode)
btn = li.find('button', class_='btn_dtaddr_on')
## 상세주소(동.층.호) 버튼이 있는 경우만 엑셀에 저장
if btn:
ws.cell(row, 1).value = row - 1
ws.cell(row, 2).value = zipcode
ws.cell(row, 3).value = road
ws.cell(row, 4).value = eng_roadname
ws.cell(row, 5).value = jibeon
wb.save(workbook_name)
row += 1
else:
continue
except Exception as e:
print(f'\nError: {e}\n')
err = f'Error: {keyword} - {e}\n'
with open('error.txt', 'a') as f:
f.write(err)
continue
time.sleep(random.uniform(0.5, 1))
juso_keyword = '고양시 아파트'
juso_cnt = 4
apt_juso(juso_keyword, juso_cnt)
- 추출할 주소를 저장할 엑셀 파일을 생성하고, 엑셀 각 열의 제목을 세팅했다.
- URL의 페이지는 입력받은 juso_cnt를 정수 나눗셈(몫)을 구하고 +1을 해주고 for 문을 통해 각 페이지를 대입했고,
- URL의 검색 키워드는 입력받은 keyword를 사용했다.
- juso.go.kr에서 아파트 주소 추출 시 상세주소(동ㆍ층ㆍ호) 보기 버튼이 있는 경우만 추출 대상으로 했다.
- 데이터 추출 중 오류 발생 시에도 멈추지 않고 그대로 추출토록 하고, 오류는 error.txt 파일에 저장되도록 했고,
- 추출 시 서버 영향을 줄이기 위해 time()과 random() 함수를 적용했다.
추출 결과
[1] 주소추출:
경기도 고양시 일산서구 경의로 867(덕이동, 철산아파트)
867, Gyeongui-ro, Ilsanseo-gu, Goyang-si, Gyeonggi-do
경기도 고양시 일산서구 덕이동 277-10 철산아파트
10233
[2] 주소추출:
경기도 고양시 일산서구 고양대로 631(일산동)
631, Goyang-daero, Ilsanseo-gu, Goyang-si, Gyeonggi-do
경기도 고양시 일산서구 일산동 955-2 동양아파트
10351
[3] 주소추출:
경기도 고양시 일산서구 고양대로 633(일산동, 동양아파트)
633, Goyang-daero, Ilsanseo-gu, Goyang-si, Gyeonggi-do
경기도 고양시 일산서구 일산동 955-2 동양아파트
10351
[4] 주소추출:
경기도 고양시 일산동구 고풍로 20(풍동, 에이스아파트)
20, Gopung-ro, Ilsandong-gu, Goyang-si, Gyeonggi-do
경기도 고양시 일산동구 풍동 385-1 에이스아파트
10308
# juso_cnt를 검색된 총건수인 453으로 할 경우, 고양시 아파트 주소 전체를 추출할 수 있음

juso.go.kr에서 "아파트" 검색 시 전체 30,809건인데,

이를 한 번에 추출하는 것보다는 juso_cnt를 5,000건씩 나누어서 숫자를 5000, 10000, 15000,...으로 변경하면서 추출하는 것이 좋은데, 주의할 점은 데이터를 저장한 파일명을 변경해줘야 한다는 것임
블로그 인기글
폐업 신고 절차와 부가가치세 신고하는 방법
폐업 신고 시 세무서 안 가고 온라인으로 신고하는 방법인 '국세청 홈택스를 이용하여 폐업 신고하는 절차와 폐업 후 해야 하는 부가가치세 신고, 인건비 저리, 종합소득세 신고 등에 대해 포스팅합니다. 폐업 신고 시 홈택스 이용하는 방법과 부가가치세 등 신고 절차 여러가지 사유로 폐업을 해야 할 때, 예전에는 세무서를 방문해야 했지만 국세청 홈택스가 생긴 이후에는 사업자 등록이나 폐업 등을 인터넷으로 할 수가 있게 되었습니다. 특히, 코로나 시국인 요즘은 더더욱 온라인 신청 업무가 더 활성화되었죠. 폐업을 한다는 것 자체가 우울한 일인데, 발품을 파는 것보다는 커피 한잔 하면서 인터넷으로 간단하게 처리하는 게 좋을 듯하여 그 절차를 올려봅니다. 폐업은 폐업 신고와 함께 폐업 후 절차까지 모두 마쳐야 불이익이..
goodthings4me.tistory.com
유튜브 영상 등의 URL 주소를 QR코드로 만들기
네이버 QR코드, makeQR, MUST QRcode, 무료 온라인 QRCode 생성기 등의 웹사이트에서 유튜브 영상 등의 URL을 입력하여 QR코드를 만들 수 있다. QR코드를 생성할 수 있는 사이트와 프로그램 URL 주소를 붙여넣기 한 후 "QR 코드 생성" 버튼을 클릭하면 큐알코드가 이미지로 생성되고, 다운로드도 할 수 있는 사이트 https://truedoum.com/useful/qrcode/ # 유튜브에서 동영상 URL을 복사하는 방법 유튜브에서 QR코드를 만들 동영상을 검색한다. 해당 동영상을 클릭한다. 동영상 위에서 마우스 우클릭 후 나오는 팝업창에서 “동영상 URL 복사”를 클릭하거나 영상 하단의 “공유”를 클릭하여 나온 창에서 URL를 복사한다. 아래의 웹사이트 중 하나를 선택한 후 복사..
goodthings4me.tistory.com
[국세청] 현금영수증가맹점으로 가입바랍니다. 메시지 해결방법(개인사업자)
▶ 현금영수증 가맹점 가입 메시지를 받고... 온라인 쇼핑몰 사업을 시작하려고 사업자등록증을 발급받고 난 후 얼마 안 있어서 국세청으로부터 어느 시점까지 '현금영수증 가맹점'으로 가입하라는 문자메시지가 받았었다. 그 메시지 기한이 오늘 도래했는데, 인터넷에서 찾아보니 홈택스에서 현금영수증 발급 사업자 신청을 할 수가 있었다. [관련내용] 홈>국세정책/제도>전자(세금)계산서/현금영수증/신용카드>현금영수증∙신용카드>가맹점가입 ▶ 홈택스 사이트에서 신청하는 절차는 다음과 같다. 우선, 홈택스에 로그인을 해야 합니다. 세상이 좋아져서 공인인증서 없이도 손쉽게 간편인증 로그인이 가능하다. 여러 인증방법 중 카카오톡 인증이 가장 편리한 거 같다. 간편인증 로그인 후 상단 '조회/발급' 탭 클릭 후 '현금영수증>현금..
goodthings4me.tistory.com
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
파이썬 pyshorteners 라이브러리로 단축 URL(단축 링크) 만들기 (0) | 2022.02.16 |
---|---|
juso.go.kr 도로명 주소, 엑셀로 분리하는 방법을 파이썬으로 해보기 (0) | 2022.02.09 |
파이썬으로 아파트 관련 기본 정보 추출해보기(공공데이터포털 API 사용법) (0) | 2022.01.24 |
공공데이터 포털 api 사용법 - 파이썬으로 아파트 단지 코드 추출 (0) | 2022.01.23 |
파이썬 사전 타입 OrderedDict()와 dict() 차이점, 그리고 변환 (0) | 2022.01.20 |
댓글