티스토리 뷰

반응형

앞선 포스팅 1~3에서 python을 이용하여 네이버 부동산 상가 매물 크롤링을 하기 위한 과정을 세번째 단계로 정리하여 포스팅 하였다. 하지만 이렇게 코드로는 사용성이 낮아지는 부분이 있어서, 상가매물 선택 시 GUI 로 제공하기 위한 포스팅을 진행하려고 한다. 

https://cocoabba.tistory.com/56

 

[PYTHON] 네이버 부동산 상가 매물 크롤링하기(1/4)

앞선 포스팅에 이어 약 1년이 지난 시점에 관련 질문이 있는 듯 하여 각 과정을 아래와 같은 단계로 포스팅하려고 합니다. https://cocoabba.tistory.com/42 [PYTHON] 네이버 부동산 상가 매물 크롤링하기 개

cocoabba.tistory.com

https://cocoabba.tistory.com/57

 

[PYTHON] 네이버 부동산 상가 매물 크롤링하기(1/6)

앞선 포스팅에 이어 약 1년이 지난 시점에 관련 질문이 있는 듯 하여 각 과정을 아래와 같은 단계로 포스팅하려고 합니다. https://cocoabba.tistory.com/42 [PYTHON] 네이버 부동산 상가 매물 크롤링하기 개

cocoabba.tistory.com

https://cocoabba.tistory.com/58

 

[PYTHON] 네이버 부동산 상가 매물 크롤링하기(1/4)

앞선 포스팅에 이어 약 1년이 지난 시점에 관련 질문이 있는 듯 하여 각 과정을 아래와 같은 단계로 포스팅하려고 합니다. https://cocoabba.tistory.com/42 [PYTHON] 네이버 부동산 상가 매물 크롤링하기 개

cocoabba.tistory.com

 

1. 개발자 도구를 활용한 웹페이지에 대한 분석 -> PC 웹 페이지에 대한 분석
2. 개발자 도구를 활용한 웹페이지에 대한 분석 -> 모바일 페이지에 대한 분석

3. 분석한 데이터를 활용한 페이지 요청 : 그룹(단지) 정보 / 물건정보 추출
4. Tkinter 를 활용한 GUI 프로그램 제작

우선 최종 결과 화면은 아래와 같다.

아래와 같이 원하는 ①지역명을 입력 ②상가 종류(상가, 상가주택, 사무실, 공장/창고, 건물, 토지, 지식산업센터)와

거래 유형(매매, 전세, 월세, 단기임대)를 선택 한 후 검색을 하면 표 형태로 검색 결과를 보여주며,

③"엑셀 저장" 기능을 통해 검색 결과를 엑셀로 추출 할 수 있다.

 

[그림 1] 상가 매물 검색 프로그램

"엑셀 저장" 시 추출되는 결과는 아래의 형태를 보인다.

[그림 2] 상가 검색 결과 엑셀 출력 형태

tkinter 를 활용한 절차는 아래와 같이 진행된다.

 

  1. 관련 라이브러리 추가

  2. 전체 레이아웃 구성

    2-1 : 3개의 큰 Frame 으로 검색 / 조건 선택 / 결과 출력 레이아웃 구분

    2-2 : 상단 Frame -> Entry, Button 추가

    2-3 : 중간 Frame -> CheckButton 레이아웃 추가

    2-4 : 하단 Frame -> ttk.Treeview 레이아웃(표 형태 레이아웃) 데이터 구성, scrollbar 설정

  3. "검색" 기능 구현

  : 1~3 포스팅에서 구현한 내용 수행하여, 하단 Frame 의 Treeview 에 데이터 insert

  4. "엑셀 저장" 기능 구현

    : openpyxl 의 workbook 라이브러리를 활용하여 엑셀 시트에 데이터 입력 후 추출

    : 3번 검색 기능 수행 시, 엑셀 시트에 데이터 append 수행


  1. 관련 라이브러리 추가

from tkinter import *
import tkinter.ttk
import tkinter.messagebox as msgbox
import requests, math
from bs4 import BeautifulSoup
import json
from openpyxl import Workbook
import datetime
  • tkinter 관련 라이브러리와 웹 크롤링을 위한 requests, Beautifulsoup, json 을 추가해준다.
  • openpyxl은 엑셀 작업을 위한 라이브러리이다.
  • tkinter.ttk 는 treeview는 결과 출력을 위한 테이블(표) 구성을 위한 라이브러리이다.

  2. 전체 레이아웃 구성

    2-1 : 3개의 큰 Frame 으로 검색 / 조건 선택 / 결과 출력 레이아웃 구분

[그림 3] 상가 매물 검색 프로그램 전체 레이아웃

    2-2 : 상단 Frame -> Entry, Button 추가

root = Tk()
root.title("부동산 상가 매물 검색 프로그램")

#검색 프레임 (entry, 검색버튼, 엑셀 버튼)
search_frame = Frame(root)
search_frame.pack(expand=True, pady=10,fill="both")

#검색 입력 창
entry = Entry(search_frame)
entry.pack(side="left",fill="both", expand=True)
entry.insert(0, "검색할 지역명 검색 (예: 서울시 강서구)")
entry.configure(state='disabled')

#entry에 클릭했을 때 on_forcus_in 함수 실행 
x_focus_in = entry.bind('<Button-1>', lambda x: focus_in(entry)) #<Button-1> 왼쪽버튼 클릭
x_focus_out = entry.bind('<FocusOut>', lambda x: focus_out(entry, '검색할 지역명 검색 (예: 서울시 강서구)')) #<FocusOut> 위젯선택 풀릴 시 (다른 곳 클릭 or tab)

#검색버튼
btn_search = Button(search_frame, text="검색", padx=5, pady=5, command = btnsearchcmd)
btn_search.pack(side="left", padx=5, fill="both")

#엑셀 저장 버튼
btn_exportexcel = Button(search_frame, text="엑셀 저장",  padx=5, pady=5, command = btnexportexcel, state=DISABLED)
btn_exportexcel.pack(side="left", padx=5,fill="both")

#프로그램 종료 버튼
btn_exit = Button(search_frame,  text="프로그램 종료", padx=5, pady=5, command = btnexit)
btn_exit.pack(side="left", padx=5,fill="both")
  • focus_in(entry), focus_out(entry) 함수 기능
    • in : 현재 위젯 상태가 "disabled" 인지 확인 후 상태를 "normal" 로 변경 후, 입력되어 있는 정보 삭제
    • out : entry 위젯의 값을 불러와서 공백인 경우에 비활성화 처리 한 후, hint(=placeholder) 값을 세팅
  • 각 위젯 별로 pack() 할 시 fill="both" 처리하여 layout 의 양쪽으로 채움

    2-3 : 중간 Frame -> CheckButton 레이아웃 추가

# 상가 구분 프레임
sg_condition_frame = Frame(root)
sg_condition_frame.pack(side="top", pady=20,fill="both")

# 큰 프레인 안에 좌:"상가 구분", 우:"거래 유형" 으로 레이아웃 쪼개기
# LableFrame 을 활용하여, checkbutton 을 묶어서 제목:"상가 구분" 붙이기
frame_middle_left = LabelFrame(sg_condition_frame, text="상가 구분")
frame_middle_left.pack(side="left", fill="both", expand=True)

sg_chk1 = IntVar()
sg_chk1_box = Checkbutton(frame_middle_left, text="상가", variable = sg_chk1)# 상가
sg_chk1_box.pack(side="left")
sg_chk1_box.select()

sg_chk2 = IntVar()
sg_chk2_box = Checkbutton(frame_middle_left, text="상가주택", variable = sg_chk2)# 상가주택
sg_chk2_box.pack(side="left")

....

# 거래 유형 프레임
frame_middle_right = LabelFrame(sg_condition_frame, text="거래유형")
frame_middle_right.pack(side="right", fill="both", expand=True)

tr_type1 = IntVar()
tr_type1_box = Checkbutton(frame_middle_right, text="매매", variable = tr_type1)# 매매 
tr_type1_box.pack(side="left")
tr_type1_box.select()

....
  • 체크버튼을 활용하는 경우에는 variable 을 확인 후 결과값(int 값: 체크(1), 비체크(0))을 검사하여, 해당 상가 구분 및 거래 유형 사항을 포함하도록 요청 메시지를 구성해야 함.

   

2-4 : 하단 Frame -> ttk.Treeview 레이아웃(표 형태 레이아웃) 데이터 구성, scrollbar 설정

# 결과 출력 프레임
result_print_frame = LabelFrame(root, text = "검색 결과")
result_print_frame.pack(side="top", fill="both")

list_frame  = Frame(result_print_frame)
list_frame.pack(side="top", fill="both")

scrollbar = Scrollbar(list_frame)
scrollbar.pack(side="right", fill = "y")

tableview = tkinter.ttk.Treeview(list_frame, columns=["rletTpNm","tradTpNm","prc","spc1","spc2","hanPrc","rentPrc", "rate"],\
                     displaycolumns=["rletTpNm","tradTpNm","prc","spc1","spc2","hanPrc","rentPrc", "rate"], height=20, yscrollcommand=scrollbar.set)
tableview.pack(fill="both")

# 각 컬럼 설정. 컬럼 이름, 컬럼 넓이, 정렬 등
tableview.column("rletTpNm", width=80,anchor="center")
tableview.heading("rletTpNm", text="상가 구분")

tableview.column("tradTpNm", width=80, anchor="center")
tableview.heading("tradTpNm", text="거래 유형", anchor="center")

....

#스크롤바를 움직일 때 표도 같이 이동할 수 있도록 적용
scrollbar.config(command=tableview.yview)
  • tkinter 에서 Listbox, Treeview와 같이 데이터의 양이 동적으로 변화할 수 있는 위젯을 사용하는 경우는 scrollbar 를 사용해야 하며, 적용해야 하는 layout 에 scrollbar를 생성할 수 있음
scrollbar = Scrollbar(list_frame)
  • 스크롤바를 움직일 때 연결되어 있는 위젯도 같이 반응할 수 있도록 적용 필요(scrollbar.config)

3. "검색" 기능 구현

  : 1~3 포스팅에서 구현한 내용 수행하여, 하단 Frame 의 Treeview 에 데이터 insert

def btnsearchcmd():
    maximum_count = 0
    keyword = entry.get()

    url = "https://m.land.naver.com/search/result/{}".format(keyword)
    res = requests.get(url, headers=headers)
    res.raise_for_status()
    
    ....
    
    # 표에 삽입될 데이터
    tablelist = [str(rletTpNm), str(tradTpNm), str(format(prc, ','))+" 만원", str(spc1),
                str(spc2),str(hanPrc)+" 만원", str(format(rentPrc,',') +" 만원"),"7%"]
                
    tableview.insert("", 'end', values=tablelist)
    
    ....
    #엑셀시트에 데이터 append
    ws.append([str(rletTpNm), str(tradTpNm), str(prc * 10000), str(spc1),
                str(spc2),
                str(hanPrc), str(rentPrc * 10000),
                str(flrInfo),str(tagList),
                str(rltrNm), detaild_information])
    ....
    
    
    #검색 완료 후 엑셀 저장 버튼 활성화
    btn_exportexcel.config(state="active")

  4. "엑셀 저장" 기능 구현

    : openpyxl 의 workbook 라이브러리를 활용하여 엑셀 시트에 데이터 입력 후 추출

    : 3번 검색 기능 수행 시, 엑셀 시트에 데이터 append 수행

def btnexportexcel():

    now = datetime.datetime.now()
    nowDatetime = now.strftime('%Y%m%d_%H%M%S')
    keyword = entry.get()

    file_name = keyword+"_"+nowDatetime+".xlsx"
    wb.save("./"+file_name)
    
    msgbox.showinfo("파일 저장", "'"+file_name+"' 파일로 정상적으로 추출되었습니다.")

이상으로 python을 활용하여 네이버 부동산 상가 매물 크롤링하기란 주제로 4번의 포스팅을 통해 개발자모드에서 어떤 데이터를 확인해야 하는지, 웹 -> 모바일 상에 데이터의 모습을 확인하였고, 여기에서 확인된 데이터를 얻는 과정을 알게되었다. 

이 과정의 결과물로 나올 수 있는 값을 python 의 tkinter 라이브러리를 활용하여 단순 텍스트가 아닌 GUI 형태의 프로그램을 제작하여, 검색을 용이하게하여 결과도 바로 excel 로 추출할 수 있도록 구현하였다. 

 

모든 포스팅을 보신분이면 하시겠지만, https://cocoabba.tistory.com/58 자료를 통해 거의 핵심이 되는 대부분의 소스코드도 포함해두었으니, 비슷한 기능을 하시는 분들께 도움이 되었으면 좋겠습니다.

 

[PYTHON] 네이버 부동산 상가 매물 크롤링하기(3/4)

앞선 포스팅에서 python을 이용하여 네이버 부동산 상가 매물 크롤링을 하기 위한 두번째 단계로 개발자도구를 활용하여 PC가 아닌 모바일 웹 페이지에 접근하여 PC에서 요청 시 발생하는 정보보

cocoabba.tistory.com

이 글을 읽어주시는 분들 모두 원하는 작업을 더 쉽게 하시는 데 도움이 되었으면 좋겠습니다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함