크롤링 한 데이터를 json으로 변환해서 로컬에 저장한 후, 그 데이터를 다시 파싱해서 db에 넣었다.
그렇게 한 이유는 일단 크롤링 한 데이터들이 db에 들어가기전 제대로 정제된 상태인지 눈으로 확인하고싶었고, 만약 db에 저장했을때 잘못된 정보가 있다면 수정하기 위해서 이 방법을 이용했다.
현재는 굳이 데이터를 json파일로 만들고, 그걸 다시 파싱해서 db에 넣고.. 너무 비효율적이라 수정할 계획이다.
일단 여태까지 삽질한 코드들을 블로그에 올리려 한다.
fs를 이용해 path에 있는 파일을 읽고 json으로 파싱한다.
async readJson(path: string, files: string[]) {
const postPromises = files.map(async (file) => {
const data = await fs.readFile(`${path}/${file}`);
return JSON.parse(data.toString());
});
return Promise.all(postPromises);
}
데이터를 db에 넣는 함수
async saveWebNoveltToDb(datas: any) {
console.log('통과');
console.log(datas[0]);
for (let i = 0; i < datas.length; i++) {
const { url, rank, isAdult } = datas[i];
const { title, dsc, img, author, keyword, genre, pubDate } =
datas[i].webContent[0];
const platformName = 'Ridi';
const platform = {}; // 빈 객체 생성
platform[platformName] = url; // 동적 속성 할당
const datePart = pubDate.split('\n')[0];
const [year, month, day] = datePart.split('.');
const data = new Date(`${year}-${month}-${day}`);
const rankNum = +rank;
const rrank = {}; // 빈 객체 생성
rrank[platformName] = rankNum;
// console.log(datas[8].webContent[0].dsc[0]);
const a = genre.join(', ');
const b = keyword.join(', ');
const c = author.join(', ');
const d = dsc.join(', ');
if (isAdult === false) {
await this.webContentRepository.save({
contentType: ContentType.WEBNOVEL,
rank: rrank,
title: title,
desc: d,
image: img,
author: c,
keyword: b,
category: a,
platform,
pubDate: data,
});
} else {
await this.webContentRepository.save({
contentType: ContentType.WEBNOVEL,
isAdult: 1,
rank: rrank,
title: title,
desc: d,
image: img,
author: c,
keyword: b,
category: a,
platform,
pubDate: data,
});
}
}
return console.log('저장완료');
}
리뷰를 db에 넣는 함수
async saveReviewToDb(datas: any) {
for (let i = 0; i < datas.length; i++) {
console.log(datas.length);
const { contentTitle, reviewsData } = datas[i];
const webContentId = await this.webContentRepository.findOne({
where: { title: contentTitle[0] },
});
for (let j = 0; j < 30; j++) {
const { writer, content, likeCount, date } = datas[i].reviewsData[j];
if (datas[i].reviewsData[j].isSpoiler) {
await this.PReviewsRepository.save({
content: content,
likeCount: likeCount,
isSpoiler: true,
writer: writer,
createdAt: date,
webContentId: webContentId.id,
});
} else {
await this.PReviewsRepository.save({
content: content,
likeCount: likeCount,
writer: writer,
createdAt: date,
webContentId: webContentId.id,
});
}
}
}
return console.log('저장완료');
}
그저 한번 넣고 말 데이터라면 이렇게까지 함수를 나눠가며 할 필욘 없었겠지만, 하루에 한번 웹툰, 웹소설 컨텐츠를 백개씩 긁어모은다 생각하고 코드를 작성했다.
이번에는 퍼펫티어를 이용해 크롤링을 했지만.. 시간 소요를 너무 많이 하고 알게된건데 axios를 이용해 api를 직접 따온다면 훨씬 빠르게 데이터를 모을 수 있는걸 알게됐다. 나중에 시간이 남는다면 그런식으로 리팩토링 해 볼 예정이다.
'프로젝트' 카테고리의 다른 글
Nest.js, SSE(server sent event)를 이용해 알림띄우기(해결안됨) (0) | 2024.04.22 |
---|---|
api를 이용한 스크래핑 성능 개선 (0) | 2024.04.15 |
퍼펫티어를 이용한 크롤링(1) (0) | 2024.04.11 |
최종프로젝트 (0) | 2024.04.09 |
db 선택 (0) | 2024.03.27 |