반응형
네이버 부동산 매물정보를 실시간 수집해 주는 파이썬 코드를 작성해 보자.
네이버에서 부동산 정보를 가져올 때 API를 호출한다. 따라서 동일한 방식으로 API를 이용하면 동일한 결과를 가져올 수 있다.
1. 네이버 부동산 들어가기
2. F12 개발자 도구 - Newwork탭 - Fetch/XHR 에서 입출력 데이터 확인하기
(1) Payload 입력값 확인
(2) 출력값 확인
3. 정보 수집 파이썬 코드 작성하기 -
(1) copy cURL (bash)
(2) Conver curl 사이트(https://curlconverter.com/)에 url정보를 붙여넣기한 후 파이썬 코드로 변환하기
(3) LLM (claude나 chatgpt)에 코드 완성 요청하기
출력 유형도 지정하여 부동산 매물정보 데이터 수집 프로그램을 만들어 달라고 요청한다.
import requests
cookies = {
'NAC': 'ZJKPBUQKJE5r',
'NNB': 'OAHWWQYBGDSGM',
'nstore_session': '/ia4c1BC77FamzAb3rateo8J',
....
}
headers = {
'accept': '*/*',
'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IlJFQUxFU1RBVEUiLCJpYXQiOjE3MzgzODk3NDUsImV4cCI6MTczODQwMDU0NX0.AY-nNR5huRC1TgRObS7zT2-YWCY8Jf_fH7fsA0wGS_g',
# 'cookie': 'NAC=ZJKPBUQKJE5r; NNB=OAHWWQYBGDSGM; nstore_session=/ia4c1BC77FamzAb3rateo8J; nstore_pagesession=i2G1HlqWoNyOclsnyfh-346631; m_loc=ddd0726a75d108211a108f4955324bbce9a02c6ed8e3e1fc1e8b20e9b32bb317; NV_WETR_LOCATION_RGN_M="MDkyMDA1OTA="; NV_WETR_LAST_ACCESS_RGN_M="MDkyMDA1OTA="; tooltipDisplayed=true; NFS=2; NACT=1; SRT30=1738389719; SRT5=1738389719; nhn.realestate.article.rlet_type_cd=A01; nhn.realestate.article.trade_type_cd=""; nhn.realestate.article.ipaddress_city=1100000000; _fwb=171MlqbbWUUcWDRgwN5oMrc.1738389721868; landHomeFlashUseYn=Y; realestate.beta.lastclick.cortar=1120000000; _fwb=171MlqbbWUUcWDRgwN5oMrc.1738389721868; REALESTATE=Sat%20Feb%2001%202025%2015%3A02%3A25%20GMT%2B0900%20(Korean%20Standard%20Time); BUC=9n5lD7HfUveZp-PM7v9tRb-zlkd2Vtr2SPsCs2zcDdE=',
'priority': 'u=1, i',
'referer': 'https://new.land.naver.com/complexes/2977?ms=37.555408,127.0369511,17&a=APT&b=A1&e=RETAIL',
'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"',
......
}
response = requests.get(
'https://new.land.naver.com/api/articles/complex/2977?realEstateType=APT&tradeType=A1&tag=%3A%3A%3A%3A%3A%3A%3A%3A&rentPriceMin=0&rentPriceMax=900000000&priceMin=0&priceMax=900000000&areaMin=0&areaMax=900000000&oldBuildYears&recentlyBuildYears&minHouseHoldCount&maxHouseHoldCount&showArticle=false&sameAddressGroup=false&minMaintenanceCost&maxMaintenanceCost&priceType=RETAIL&directions=&page=2&complexNo=2977&buildingNos=&areaNos=&type=list&order=rank',
cookies=cookies,
headers=headers,
)
# print(response.text)
============
{
"articleNo": "2504409914",
"articleName": "서울숲한신더휴",
"articleStatus": "R0",
"realEstateTypeCode": "APT",
"realEstateTypeName": "아파트",
"articleRealEstateTypeCode": "A01",
"articleRealEstateTypeName": "아파트",
"tradeTypeCode": "A1",
"tradeTypeName": "매매",
},
==========
응답값을 참고하여 파이썬 코드를 완성해주세요. 이때 csv 파일로 부동산 호가 데이터를 저장해주세요.
한글이 깨지지 않게해줘.
url에 page값이 있습니다. 1부터 10페이지까지 수집되도록 수정해주세요.
(4) 완성된 코드
import requests
import csv
import json
from datetime import datetime
import codecs
import time
def get_real_estate_data(complex_no, page=1):
cookies = {
'NAC': 'ZJKPBUQKJE5r',
'NNB': 'OAHWWQYBGDSGM',
'nstore_session': '/ia4c1BC77FamzAb3rateo8J',
'nstore_pagesession': 'i2G1HlqWoNyOclsnyfh-346631',
'm_loc': 'ddd0726a75d108211a108f4955324bbce9a02c6ed8e3e1fc1e8b20e9b32bb317',
'NV_WETR_LOCATION_RGN_M': '"MDkyMDA1OTA="',
'NV_WETR_LAST_ACCESS_RGN_M': '"MDkyMDA1OTA="',
'tooltipDisplayed': 'true',
'NFS': '2',
'NACT': '1',
'SRT30': '1738389719',
'SRT5': '1738389719',
'nhn.realestate.article.rlet_type_cd': 'A01',
'nhn.realestate.article.trade_type_cd': '""',
'nhn.realestate.article.ipaddress_city': '1100000000',
'_fwb': '171MlqbbWUUcWDRgwN5oMrc.1738389721868',
'landHomeFlashUseYn': 'Y',
'realestate.beta.lastclick.cortar': '1120000000',
'REALESTATE': 'Sat%20Feb%2001%202025%2015%3A02%3A25%20GMT%2B0900%20(Korean%20Standard%20Time)',
'BUC': '9n5lD7HfUveZp-PM7v9tRb-zlkd2Vtr2SPsCs2zcDdE=',
}
headers = {
'accept': '*/*',
'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IlJFQUxFU1RBVEUiLCJpYXQiOjE3MzgzODk3NDUsImV4cCI6MTczODQwMDU0NX0.AY-nNR5huRC1TgRObS7zT2-YWCY8Jf_fH7fsA0wGS_g',
'priority': 'u=1, i',
'referer': f'https://new.land.naver.com/complexes/{complex_no}?ms=37.555408,127.0369511,17&a=APT&b=A1&e=RETAIL',
'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
}
url = f'https://new.land.naver.com/api/articles/complex/{complex_no}'
params = {
'realEstateType': 'APT',
'tradeType': 'A1',
'tag': '::::::::',
'rentPriceMin': '0',
'rentPriceMax': '900000000',
'priceMin': '0',
'priceMax': '900000000',
'areaMin': '0',
'areaMax': '900000000',
'showArticle': 'false',
'sameAddressGroup': 'false',
'priceType': 'RETAIL',
'page': str(page),
'complexNo': str(complex_no),
'type': 'list',
'order': 'rank'
}
response = requests.get(url, params=params, cookies=cookies, headers=headers)
return response.json()
def save_to_csv(all_data, filename):
# 한글 필드명 정의
fieldnames = [
('articleNo', '매물번호'),
('articleName', '단지명'),
('realEstateTypeName', '부동산 유형'),
('tradeTypeName', '거래 유형'),
('floorInfo', '층수'),
('dealOrWarrantPrc', '거래가격'),
('areaName', '면적명'),
('area1', '공급면적'),
('area2', '전용면적'),
('direction', '방향'),
('articleConfirmYmd', '확인일자'),
('articleFeatureDesc', '특징설명'),
('buildingName', '동'),
('realtorName', '부동산'),
('latitude', '위도'),
('longitude', '경도')
]
# Excel에서 한글을 올바르게 표시하기 위해 BOM을 추가하여 파일 생성
with codecs.open(filename, 'w', encoding='utf-8-sig') as csvfile:
writer = csv.writer(csvfile)
# 한글 헤더 작성
writer.writerow([field[1] for field in fieldnames])
# 데이터 작성
for article in all_data:
row = []
for field in fieldnames:
value = article.get(field[0], '')
# None 값 처리
if value is None:
value = ''
row.append(value)
writer.writerow(row)
def main():
complex_no = 2976 # 단지 번호
current_date = datetime.now().strftime('%Y%m%d')
filename = f'real_estate_data_{complex_no}_{current_date}.csv'
try:
all_articles = [] # 전체 페이지의 데이터를 저장할 리스트
# 1페이지부터 10페이지까지 수집
for page in range(1, 11):
print(f"{page}페이지 데이터 수집 중...")
# API에서 데이터 가져오기
data = get_real_estate_data(complex_no, page)
# 페이지의 매물 목록 가져오기
articles = data.get('articleList', [])
# 매물이 없으면 반복 중단
if not articles:
print(f"{page-1}페이지까지 수집 완료 (더 이상 데이터가 없습니다)")
break
# 전체 리스트에 추가
all_articles.extend(articles)
# 서버 부하를 줄이기 위한 딜레이
time.sleep(1)
# 전체 데이터를 CSV로 저장
save_to_csv(all_articles, filename)
print(f"전체 {len(all_articles)}개의 매물 데이터가 {filename}에 저장되었습니다.")
except Exception as e:
print(f"오류가 발생했습니다: {str(e)}")
if __name__ == "__main__":
main()
3. 프로그램 실행 결과 확인
아파트 매물정보 csv파일이 생성된다. 매매정보를 한눈에 볼 수 있고 정기적으로 데이터를 수집해 가격 변동을 확인하는 등 다양한 정보로 이용할 수 있다.
4. GUI나 streamlit 홈페이지 형태로 확장하기
역시 LLM에 GUI나 Streamlit 홈페이지 형태로 UI를 함께 구축하게 할 수 있다. 데이터 관리 및 보기가 훨씬 좋아진다.
**** 다음 유튜브 영상을 참고해 작성하였습니다. : https://youtu.be/V4tjbUQ46Uw?si=PtLVIk-f-DP-mN5H
반응형
'코드리뷰 > chatGPT(Python)코드' 카테고리의 다른 글
광화문 맛집 찾기 10분 만에 만들기 - DeepSeek, Cluade, ChatGpt 이용 (3) | 2025.02.02 |
---|---|
파이썬 코드로 네이버 뉴스기사 요약하기 -DeepSeek ChatGPT Claude (0) | 2025.01.30 |
네이버 API 이용해 헤드라인 뉴스 기사 가져오기 (0) | 2025.01.27 |
댓글