티스토리 뷰
앞선 포스팅 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 프로그램 제작 |
우선 최종 결과 화면은 아래와 같다.
아래와 같이 원하는 ①지역명을 입력 시 ②상가 종류(상가, 상가주택, 사무실, 공장/창고, 건물, 토지, 지식산업센터)와
거래 유형(매매, 전세, 월세, 단기임대)를 선택 한 후 검색을 하면 표 형태로 검색 결과를 보여주며,
③"엑셀 저장" 기능을 통해 검색 결과를 엑셀로 추출 할 수 있다.
"엑셀 저장" 시 추출되는 결과는 아래의 형태를 보인다.
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 으로 검색 / 조건 선택 / 결과 출력 레이아웃 구분
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.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
이 글을 읽어주시는 분들 모두 원하는 작업을 더 쉽게 하시는 데 도움이 되었으면 좋겠습니다.
'개발 > 파이썬(PYTHON)' 카테고리의 다른 글
Django - 에러 해결 방안 __str__ returned non-string (type int) (0) | 2023.06.05 |
---|---|
[PYTHON] 네이버 중고나라(joonggonara) 물건 크롤링하기-엑셀 추출 (1) | 2023.04.25 |
[PYTHON] 네이버 부동산 상가 매물 크롤링하기(3/4) (38) | 2023.04.04 |
[PYTHON] 네이버 부동산 상가 매물 크롤링하기(2/4) (3) | 2023.04.03 |
[PYTHON] 네이버 부동산 상가 매물 크롤링하기(1/4) (0) | 2023.04.03 |
- Total
- Today
- Yesterday
- pandas
- REST API
- 네이버쇼핑
- 크몽
- DICTIONARY
- 네이버 주식
- 크롤링
- 네이버 부동산
- 매물
- 아파트
- 평형정보
- beautifulsoup
- 파이썬
- eum.go.kr
- json
- tkinter
- 대항력있는 임차인
- cortarNo
- 경매
- 네이버
- 상가
- 경제적 자유
- 부동산
- 단지정보
- 개발자도구
- pyplot
- Excel
- PYTHON
- Export
- matplotlib
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |