import { NaverRealEstate } from "./src/services/naver.service"; import prisma from "./src/lib/prisma"; async function main() { const realtorId = "a7062525"; const naver = new NaverRealEstate({ realtorId: realtorId, }); try { console.log("활성 매물 목록 가져오는 중..."); // DB에서 isActive가 true이고 realtorId가 일치하는 매물 가져오기 const activeArticles = await prisma.realEstateArticle.findMany({ where: { isActive: true, realtorId: realtorId, }, select: { articleNumber: true, }, }); console.log(`총 ${activeArticles.length}개의 활성 매물 발견`); if (activeArticles.length === 0) { console.log("처리할 매물이 없습니다."); return; } // 각 매물의 상세 정보 가져오기 let successCount = 0; let failCount = 0; for (let i = 0; i < activeArticles.length; i++) { const article = activeArticles[i]; if (!article) { continue; } console.log( `\n[${i + 1}/${activeArticles.length}] ${ article.articleNumber } 처리 중...` ); try { // 상세 정보 HTML 가져오기 (프록시 사용) const detailHtml = await naver.getArticleDetailWithProxy( article.articleNumber ); // HTML에서 JSON 데이터 추출 const detailData = naver.parseArticleDetailFromHtml(detailHtml); if (detailData) { // DB에 상세 정보 저장 await naver.saveArticleDetailToDB(article.articleNumber, detailData); successCount++; console.log(`✅ 저장 완료`); } else { failCount++; console.log(`❌ 데이터 파싱 실패`); } // 요청 간격 (1~2초 랜덤) const waitTime = 1000 + Math.floor(Math.random() * 1000); console.log(`${waitTime}ms 대기...`); await new Promise((resolve) => setTimeout(resolve, waitTime)); } catch (error) { failCount++; console.error(`❌ 오류 발생:`, error); // 오류 발생 시 더 긴 대기 await new Promise((resolve) => setTimeout(resolve, 3000)); } } console.log("\n=== 처리 완료 ==="); console.log(`성공: ${successCount}개`); console.log(`실패: ${failCount}개`); } catch (error) { console.error("오류 발생:", error); } } // 실행 main();