올해 집에 대해 관심이 더욱 많아지면서 부동산 관련 유투브나 뉴스를 많이 찾아보게 됩니다.
나만의 집을 구매하기 위해 돈을 모으면서 서울, 경기 등 수도권 지역 내 아파트들 시세를 검색하는데 그 중 경매로 넘어간 아파트들도 많이 찾아보게 됩니다.
(운만 좋으면 경매에서 좋은 아파트를 살 수 있기 때문!!)
그래서 요즘 생긴 하루 일과가 네이버 부동산 내 경매 목록을 매일 들어가게 되는데요.
자동화 공부 겸 이 데이터 목록을 추출해보면 어떨까 해서 구현을 해보았습니다.
추출하려고 하는 데이터는 네이버 부동산에서 뽑기 위해 부동산 URL을 사용하였습니다.
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get('https://auction1.land.naver.com/auction/ca_list.php')
엑셀에 추출하기 위해 자주 사용하였던 코드에서 목록 유형만 추가하였습니다.
URL 데이터는 네이버 부동산 코드가 onclick 형태로 되어있기도 하고 진입해보니 너무 URL 길이가 길어서 제외하고 나머지 데이터를 추출하기로 하였습니다.
# Workbook 생성
wb = Workbook()
# 시트 활성화
ws = wb.active
ws.append(['번호', '소재지', '감정가(원)', '최저입찰가(원)', '유찰횟수', '최저가%', '매각기일'])
저는 관심있는 유형이 아파트여서 아파트 유형을 체크하였는데 물건 종류 유형은 ID값이 각각 있기 때문에 원하시는 유형 값으로 변경하여 사용이 가능합니다.
# 아파트 유형 체크
driver.find_element(By.ID, 'sale_type2').click()
전체 목록 데이터를 추출하기 위해 하단 page 개수를 추출한 후 변수로 저장하였습니다.
코드를 살펴보니 활성화 되어 있는 페이지를 제외하고 모두 a 태그가 있는걸 확인하여 find_elements a 태그 개수로 page 개수를 체크하였습니다.
# 하단 page element
page_list = driver.find_element(By.CLASS_NAME, 'pagnavi').find_elements(By.TAG_NAME, 'a')
length = len(page_list)
페이지 수만큼 반복하기 위해 반복문으로 작성하였고 추출하려고 하는 데이터가 대부분 class_name으로 동일하게 되어있기 때문에 find_elements를 통해 데이터를 추출하였습니다.
# 하단 page 수 만큼 반복
while list_count <= length:
# 필요한 정보 추출
name_list = driver.find_elements(By.CLASS_NAME, 'area')
estimate_list = driver.find_elements(By.CLASS_NAME, 'num_type1')
min_list = driver.find_elements(By.CLASS_NAME, 'num_type2')
date_list = driver.find_elements(By.CLASS_NAME, 'date')
find_elements로 뽑은 항목들 중 list 길이가 동일한 데이터들을 한번에 엑셀에 저장하는 방식으로 구현하였습니다.
그 중 매각 기일 데이터는 제외해도 되는 데이터들은 과감하게 문자열 split 으로 제외하였습니다.
(데이터를 살펴보니 매각 기일 시간은 모두 10시로 되어있어서 10시 데이터를 제외)
또한 데이터 중 유찰횟수에만 class_name, id 등 데이터를 추출하기 위해 지정할 내용이 없어서 해당 부분만 xpath값으로 데이터를 추출하였습니다.
# list count가 동일한 내용들 같이 추출하여 엑셀에 저장
for s in name_list:
date = date_list[i].text.split('\n')
num = driver.find_element(By.XPATH, '//*[@id="tb"]/tr[' + str(i + 1) + ']/td[6]/p[1]')
ws.append([number, s.text, estimate_list[i].text, '', num.text, '', date[0]])
i = i + 1
number = number + 1
최저 입찰가와 최저가 % 데이터는 동일한 class_name으로 되어 있기 때문에 반복문 유형을 따로 구분하여 구현하였습니다.
(D열과 F열 특정 위치에 값을 넣는 방식으로 구현)
# 최저 입찰가, 최저가% 데이터 추출
for s in min_list:
if len(min_list) <= i:
break
ws['D' + str(count)] = min_list[i].text
ws['F' + str(count)] = min_list[i + 1].text
i = i + 2
count = count + 1
해당 페이지에서 모든 데이터를 추출하여 엑셀에 저장한 후 다음 페이지로 이동하기 위해 위에서 추출하였던 page_list 변수를 사용하였습니다.
그 다음 페이지로 이동한 이후에는 다시 활성화 되지 않은 페이지 a 태그가 달라지기 때문에 page_list를 구하는 코드를 다시 추가하였습니다.
# 다음 페이지로 이동
page_list[list_count].click()
list_count = list_count + 1
time.sleep(2)
# 활성화 된 페이지 외 a 태그가 있기 때문에 다시 element 추출
page_list = driver.find_element(By.CLASS_NAME, 'pagnavi').find_elements(By.TAG_NAME, 'a')
진행되는 코드를 보면 마지막 페이지 이후 한번 더 다음 페이지로 이동하려고 하는 시도가 있기 때문에 에러를 방지 하기 위해 조건문을 추가해 마지막 페이지에서는 다음 페이지로 이동하지 않게 구현하였습니다.
# 마지막 페이지까지 도달하였는지 체크
if list_count == length:
break
전체 코드입니다. 해당 코드 실행시 네이버 부동산 내 서울 아파트 경매 진행 목록 데이터를 추출한 후 엑셀에 저장할 수 있습니다.
제가 데이터를 뽑았을 때에는 서울 아파트 기준 191건을 확인할 수 있었습니다. 경기도도 재미로 한번 추출해봤는데 서울의 2배 정도 데이터가 나온걸 확인할 수 있었습니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time
from openpyxl import Workbook
# Workbook 생성
wb = Workbook()
# 시트 활성화
ws = wb.active
ws.append(['번호', '소재지', '감정가(원)', '최저입찰가(원)', '유찰횟수', '최저가%', '매각기일'])
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get('https://auction1.land.naver.com/auction/ca_list.php')
# 아파트 유형 체크
driver.find_element(By.ID, 'sale_type2').click()
count = 2
number = 1
time.sleep(2)
# 하단 page element
page_list = driver.find_element(By.CLASS_NAME, 'pagnavi').find_elements(By.TAG_NAME, 'a')
length = len(page_list)
list_count = 0
# 하단 page 수 만큼 반복
while list_count <= length:
# 필요한 정보 추출
name_list = driver.find_elements(By.CLASS_NAME, 'area')
estimate_list = driver.find_elements(By.CLASS_NAME, 'num_type1')
min_list = driver.find_elements(By.CLASS_NAME, 'num_type2')
date_list = driver.find_elements(By.CLASS_NAME, 'date')
i = 0
# list count가 동일한 내용들 같이 추출하여 엑셀에 저장
for s in name_list:
date = date_list[i].text.split('\n')
num = driver.find_element(By.XPATH, '//*[@id="tb"]/tr[' + str(i + 1) + ']/td[6]/p[1]')
ws.append([number, s.text, estimate_list[i].text, '', num.text, '', date[0]])
i = i + 1
number = number + 1
i = 0
# 최저 입찰가, 최저가% 데이터 추출
for s in min_list:
if len(min_list) <= i:
break
ws['D' + str(count)] = min_list[i].text
ws['F' + str(count)] = min_list[i + 1].text
i = i + 2
count = count + 1
# 마지막 페이지까지 도달하였는지 체크
if list_count == length:
break
# 다음 페이지로 이동
page_list[list_count].click()
list_count = list_count + 1
time.sleep(2)
# 활성화 된 페이지 외 a 태그가 있기 때문에 다시 element 추출
page_list = driver.find_element(By.CLASS_NAME, 'pagnavi').find_elements(By.TAG_NAME, 'a')
wb.save('/Users/user/Desktop/경매.xlsx')
print('엑셀에 저장 완료하였습니다.')
driver.close()
'자동화 > Selenium' 카테고리의 다른 글
버거킹 설문조사 exe 실행파일로 자동화 사용하기 (0) | 2023.01.14 |
---|---|
파파이스 설문조사 Selenium으로 자동화하기 (0) | 2023.01.09 |
설날 연휴 KTX 좌석 남아있는거 자동화로 확인하기 (0) | 2022.12.26 |
네이버부동산 특정날짜 주요뉴스 목록 추출하기 (0) | 2022.12.20 |
네이버 뉴스 기사 모든 댓글 자동화로 추출하여 엑셀로 저장하기 (0) | 2022.12.12 |