이번에 자동화 해 볼 내용은 지역 아파트 순위 목록 추출하여 엑셀에 저장하기 입니다.
부동산에 관심이 많아서 아파트를 많이 보게되는데 이부분을 자동화 공부하면 좋을 거 같아서 시도해보았습니다.
다음 부동산에는 지역 아파트 인기순위를 확인할 수 있는 기능이 있는데 스크롤을 하여 전체 목록을 확인할 수 있는데 이부분을 자동화 해보았습니다.
자동화 시나리오는 아래와 같습니다.
- 다음 부동산에서 특정 지역 목록 URL 진입 (예: 서울 구로구, 경기 부천시)
- 우측에 노출되는 아파트 목록 자동화로 추출
- 추출한 내용 엑셀에 저장
특정 지역 아파트 검색결과를 바로 확인할 수 있는 URL로 진입한 후 sleep 함수를 사용하여 모든 데이터가 노출될 때까지 기다립니다.
(wait 기능을 이용할 수 있지만 간헐적으로 모든 데이터를 불러오지 못하고 코드가 끝나는 경우가 있어서 sleep을 사용했습니다.)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get('https://realty.daum.net/home/apt/locals/11530/danjis?order=viewCount&title=%EA%B5%AC%EB%A1%9C%EA%B5%AC%20%EC%9D%B8%EA%B8%B0%EB%8B%A8%EC%A7%80&type=local&ad_region_v1_id=11530&school_id=11530&latitude=37.4954330864&longitude=126.887505315&zoom=6')
time.sleep(3)
네이버나 다음 부동산, 지도 코드를 보면 class_name이 상당히 복잡하게 되어있거나 동일한 class_name을 전체적으로 사용하여 데이터를 뽑기가 어려운 경우가 많습니다.
이번 케이스와 같은 경우에는 큰 틀에 있는 div > class_name으로 먼저 find_element로 찾은 후 그 하위에 있는 데이터를 find_elements를 통해 데이터를 추출하였습니다.
forms = driver.find_element(By.CLASS_NAME, 'css-1dbjc4n.r-150rngu.r-eqz5dr.r-16y2uox.r-1wbh5a2.r-11yh6sk.r-1rnoaur.r-1sncvnh')
elements = forms.find_elements(By.CLASS_NAME, 'css-1563yu1')
find_elements로 추출한 데이터가 아파트명 -> 지역명/세대수 -> 아파트 순위 순으로 추출되기 때문에
for문을 통해 한번에 3개 데이터를 엑셀에 저장하는 코드를 반복할 수 있게 구현하였습니다.
for i in range(0, len(elements), 3):
ws.append([count, elements[i].text, elements[i+1].text, elements[i+2].text])
count = count + 1
전체 코드입니다. 간단하게 구현하여 짧은 코드로 특정 지역 아파트 목록 순위를 빠르게 확인할 수 있습니다.
저의 경우에는 서울 구로구 데이터를 추출하여 엑셀에 저장하였습니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
from openpyxl import Workbook
wb = Workbook() # Workbook 생성
ws = wb.active # 시트 활성화
ws.title = 'home' # 시트 타이틀 설정
ws.append(['번호', '아파트명', '지역명 / 세대수', '순위']) # 첫 행에 저장할 데이터 항목 추가
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get('https://realty.daum.net/home/apt/locals/11530/danjis?order=viewCount&title=%EA%B5%AC%EB%A1%9C%EA%B5%AC%20%EC%9D%B8%EA%B8%B0%EB%8B%A8%EC%A7%80&type=local&ad_region_v1_id=11530&school_id=11530&latitude=37.4954330864&longitude=126.887505315&zoom=6')
time.sleep(3)
forms = driver.find_element(By.CLASS_NAME, 'css-1dbjc4n.r-150rngu.r-eqz5dr.r-16y2uox.r-1wbh5a2.r-11yh6sk.r-1rnoaur.r-1sncvnh')
elements = forms.find_elements(By.CLASS_NAME, 'css-1563yu1')
count = 1
for i in range(0, len(elements), 3):
ws.append([count, elements[i].text, elements[i+1].text, elements[i+2].text])
count = count + 1
wb.save('/Users/user/Desktop/guroHome.xlsx')
print('Excel Complete!!!')
driver.close()
'자동화 > Selenium' 카테고리의 다른 글
Selenium으로 밴드웹 자동 로그인 해보기 (0) | 2024.02.02 |
---|---|
Selenium 대기 방식 실행 시간 비교해보기 (Wait, Sleep) (0) | 2024.02.01 |
Selenium Element Click이 실패할 때 사용할 수 있는 대안 방법들 (1) | 2023.03.13 |
네이버 메모에 짧은 내용 자동화로 작성해서 올리기 (0) | 2023.03.09 |
간단한 네이버 메일 자동화로 보내기 (With Selenium, Python) (0) | 2023.03.07 |