Files
ranking/fetch-detail-disabled.ts
2025-11-12 02:58:36 +09:00

89 lines
2.4 KiB
TypeScript

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();