본문 바로가기
  • 테크에 관한 모든 것.
IT

[python] 네이버 부동산 데이터 시각화 & 실시간 문자 알림 프로그램

by @TA 2024. 10. 16.

이번 포스팅에서는 네이버 부동산 데이터 크롤링 이후

데이터 시각화와 실시간 문자 알림까지 가능하도록 하는

프로그램 구현 방법에 대해 알아보겠습니다.


1. 부동산 데이터를 크롤링하는 이유

부동산 시장은 끊임없이 변화하기 때문에, 실시간으로 변동하는 매물 정보를 파악하는 것이 매우 중요합니다.

 

특히 가격 변화 및 거래 발생 여부와 같은 중요한 데이터를 빠르게 확인할 수 있어야 투자 기회를 놓치지 않을 수 있습니다.

 

이런 필요성을 느껴 '관심 매물의 데이터를 주기적으로 수집하고 분석하여 시각적으로 확인하며, 특정 조건이 발생할 때 실시간으로 알림을 받는 프로그램'을 만들어보고자 했습니다.


2. 네이버 부동산 데이터 크롤링 검토

2.1 웹 크롤링이란?

웹 크롤링은 특정 웹 페이지의 데이터를 자동으로 수집하는 프로세스를 말합니다. 이 과정은 사용자가 일일이 웹사이트를 방문해 데이터를 수동으로 수집하는 대신, 프로그램을 통해 자동으로 정보를 추출하고 정리할 수 있도록 합니다. 부동산 사이트에서는 매물 정보, 가격, 위치, 거래 상태와 같은 데이터를 수집할 수 있습니다.

2.2 필요한 도구와 환경 설정

웹 크롤링과 관련된 도구는 주로 Python BeautifulSoup(HTML 파싱), Selenium(동적 페이지 크롤링)을 사용합니다. 데이터 처리는 pandas를 통해 진행하며, 시각화와 알림 기능을 위해 추가 도구들을 활용할 예정입니다.

 

[설치가 필요한 주요 라이브러리]

pip install requests beautifulsoup4 selenium pandas matplotlib folium twilio

2.3 네이버 부동산 페이지 분석

네이버 부동산 페이지의 HTML 구조를 분석하여 크롤링 대상 요소를 찾아내는 것이 중요합니다. 매물의 가격, 위치, 거래 상태 등 데이터를 수집할 수 있는 HTML 요소를 확인한 후, 해당 정보를 자동으로 추출할 수 있도록 코드를 작성합니다.


3. 부동산 데이터 크롤링 구현

3.1 크롤링 코드 작성

크롤링을 위해 Selenium을 사용하여 네이버 부동산 사이트에 접속한 후, BeautifulSoup을 통해 원하는 정보를 추출합니다. 동적 웹사이트의 경우 Selenium으로 페이지 로딩 후 데이터를 처리할 수 있습니다.

from selenium import webdriver
from bs4 import BeautifulSoup
import time

# 네이버 부동산 페이지 접속
url = "https://land.naver.com/"
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
driver.get(url)

# 페이지 로딩 후 데이터 수집
time.sleep(3)  # 페이지 로딩 대기

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

# 매물 정보 크롤링
properties = soup.find_all('div', class_='property_class_name')  # 매물 정보가 담긴 HTML 클래스명
for property in properties:
    title = property.find('span', class_='title_class').text
    price = property.find('span', class_='price_class').text
    print(f'매물명: {title}, 가격: {price}')

driver.quit()

3.2 데이터 전처리

크롤링한 데이터를 pandas를 활용하여 정리합니다. 중복된 데이터 제거, 필요 없는 열 정리 등을 진행합니다.

import pandas as pd

# 데이터 정리 예시
data = {
    'title': ['매물 A', '매물 B', '매물 C'],
    'price': [50000, 60000, 55000]
}

df = pd.DataFrame(data)

# 가격 데이터 형식 변경
df['price'] = df['price'].astype(int)
print(df)

 

3.3 크롤링 중 발생할 수 있는 문제 해결

크롤링 중 IP 차단을 피하기 위해 User-Agent를 변경하거나, 요청 사이에 딜레이를 추가하여 자연스러운 트래픽을 생성합니다.

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

response = requests.get(url, headers=headers)

4. 데이터 시각화

4.1 데이터 시각화 도구 선택

시각화는 데이터를 보다 직관적으로 이해할 수 있도록 도와줍니다. matplotlib folium을 사용하여 가격 변동 그래프와 매물의 위치 분포를 시각화할 수 있습니다.

4.2 관심 매물의 가격 변화 그래프

가격 변동을 시간에 따라 시각화하여 추세를 확인할 수 있습니다.

import matplotlib.pyplot as plt

# 가격 변동 데이터 예시
dates = ['2024-01-01', '2024-02-01', '2024-03-01']
prices = [50000, 52000, 51000]

plt.plot(dates, prices)
plt.title('매물 가격 변동')
plt.xlabel('날짜')
plt.ylabel('가격(만원)')
plt.show()

4.3 지도 기반 매물 분포 시각화

folium을 사용하여 매물의 위치를 지도 위에 표시합니다.

import folium

# 지도 생성 및 매물 위치 표시
m = folium.Map(location=[37.5665, 126.9780], zoom_start=12)
folium.Marker([37.5665, 126.9780], tooltip='매물 A').add_to(m)
m.save('map.html')

5. 실시간 거래 알림 시스템 구현

5.1 문자 메시지 알림의 필요성

매물의 가격이 특정 금액 이하로 떨어지거나 거래가 발생했을 때 문자 알림을 받으면, 즉시 반응할 수 있습니다.

5.2 문자 메시지 발송 API 연동

Twilio API를 활용하여 알림 메시지를 전송합니다.

from twilio.rest import Client

account_sid = 'your_account_sid'
auth_token = 'your_auth_token'
client = Client(account_sid, auth_token)

message = client.messages.create(
    body="관심 매물 거래가 발생했습니다.",
    from_='+1234567890',
    to='+0987654321'
)

print(message.sid)

5.3 조건부 알림 설정

매물의 가격이 특정 기준을 충족할 때만 알림을 발송하는 로직을 추가할 수 있습니다.

# 특정 가격 이하로 떨어질 때 알림 발송
if current_price < 50000:
    message = client.messages.create(
        body="관심 매물의 가격이 5천만원 이하로 떨어졌습니다.",
        from_='+1234567890',
        to='+0987654321'
    )

6. 최종 코드 통합 및 실행

6.1 전체 코드 통합

크롤링, 데이터 처리, 시각화, 문자 알림 기능을 하나로 통합하여 주기적으로 실행될 수 있도록 설정합니다.

6.2 주기적인 크롤링 및 알림 시스템 자동화

cron(리눅스) 또는 Windows Task Scheduler를 사용하여 일정 주기마다 크롤링과 알림을 실행할 수 있습니다.

# 리눅스 크론탭 예시 (매일 9시에 크롤링 실행)
0 9 * * * /usr/bin/python3 /path/to/crawling_script.py

6.3 프로그램 실행 후 결과 확인

프로그램을 실행한 후, 시각화된 데이터를 확인하고, 거래가 발생할 때 문자 메시지 알림을 받아볼 수 있습니다.


7. 결론: 직접 만든 부동산 데이터 분석 도구의 활용

이 프로그램을 통해 실시간 부동산 매물 데이터를 추적하고 시각화할 수 있습니다. 향후에는 머신러닝을 도입하여 가격 예측 모델을 구축하거나, 더 복잡한 데이터를 분석하는 기능을 추가할 수 있습니다.


[추가]

1) 데이터 크롤링 예시

부동산 매물 정보를 수집하여, 매물명과 가격 변동을 크롤링했다고 가정합니다. 여기서 매물의 가격이 시간이 지남에 따라 어떻게 변동했는지를 시각화합니다.

import pandas as pd

# 가상의 부동산 매물 데이터
data = {
    '날짜': ['2024-01-01', '2024-02-01', '2024-03-01', '2024-04-01', '2024-05-01'],
    '매물명': ['강남 아파트', '강남 아파트', '강남 아파트', '강남 아파트', '강남 아파트'],
    '가격(만원)': [150000, 152000, 153500, 151000, 149000]
}

df = pd.DataFrame(data)
print(df)

 

[출력 화면]

           날짜        매물명    가격(만원)
0  2024-01-01   강남 아파트  150000
1  2024-02-01   강남 아파트  152000
2  2024-03-01   강남 아파트  153500
3  2024-04-01   강남 아파트  151000
4  2024-05-01   강남 아파트  149000

2) 가격 변동 그래프 그리기

이 데이터를 바탕으로 매물 가격의 시간에 따른 변동을 한글로 표시된 그래프에 시각화해 보겠습니다.

import matplotlib.pyplot as plt

# 가격 변동 그래프
dates = ['2024-01-01', '2024-02-01', '2024-03-01', '2024-04-01', '2024-05-01']
prices = [150000, 152000, 153500, 151000, 149000]

plt.plot(dates, prices, marker='o', linestyle='-', color='b')
plt.title('강남 아파트 가격 변동 추이', fontsize=15)
plt.xlabel('날짜', fontsize=12)
plt.ylabel('가격 (만원)', fontsize=12)
plt.grid(True)
plt.xticks(rotation=45)
plt.show()

3) 지도 기반 매물 위치 표시 (서울 강남구 예시)

지도 위에 매물의 위치를 한글로 표시합니다. 지도에는 매물 위치가 핀으로 표시되어 있으며, 매물명과 가격이 툴팁으로 나타납니다.

import folium

# 서울 강남구 위치의 매물 지도 표시
m = folium.Map(location=[37.4979, 127.0276], zoom_start=13)

# 강남구 매물 추가
folium.Marker(
    location=[37.4979, 127.0276], 
    popup='강남 아파트: 15억원', 
    tooltip='강남 아파트'
).add_to(m)

# 지도 저장
m.save('gangnam_map.html')

4) 문자 알림

매물이 특정 조건에 맞아 거래가 발생했을 때 실시간 문자 알림을 발송하는 코드 예시입니다. 가격이 15억원 이하로 떨어지면 문자 알림을 발송하도록 설정합니다.

from twilio.rest import Client

# Twilio API 계정 정보
account_sid = 'your_account_sid'
auth_token = 'your_auth_token'
client = Client(account_sid, auth_token)

# 매물 가격 조건 설정
current_price = 149000  # 만원 단위
if current_price < 150000:
    message = client.messages.create(
        body="관심 매물 강남 아파트의 가격이 15억원 이하로 떨어졌습니다. 현재 가격: 14억 9천만원",
        from_='+1234567890',
        to='+0987654321'
    )
    print(f"문자 메시지 발송: {message.sid}")

 

이러한 방식으로 실제 네이버 부동산 데이터를 크롤링한 것처럼 매물 가격을 시각화하고 문자 알림을 설정할 수 있습니다.

반응형