본문 바로가기

자동화/Selenium

아파트 경매 목록 자동화로 추출하여 엑셀에 저장하기

728x90

올해 집에 대해 관심이 더욱 많아지면서 부동산 관련 유투브나 뉴스를 많이 찾아보게 됩니다.

나만의 집을 구매하기 위해 돈을 모으면서 서울, 경기 등 수도권 지역 내 아파트들 시세를 검색하는데 그 중 경매로 넘어간 아파트들도 많이 찾아보게 됩니다.

(운만 좋으면 경매에서 좋은 아파트를 살 수 있기 때문!!)

 

그래서 요즘 생긴 하루 일과가 네이버 부동산 내 경매 목록을 매일 들어가게 되는데요.

자동화 공부 겸 이 데이터 목록을 추출해보면 어떨까 해서 구현을 해보았습니다.

 

추출하려고 하는 데이터는 네이버 부동산에서 뽑기 위해 부동산 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()

 

728x90