728x90
크롤링 오류
3 개의 사이트 (퀘이사존/뽐뿌/아카라이브)에 크롤링을 진행하여 사용자들이 올려주는 특가정보들을 한 페이지에 모아서 보여주는 것이 목표이기 때문에, node.js를 이용해 해당 크롤링을 진행했다.
개 중 아카라이브 사이트를 크롤링하던 도중 데이터를 가져오지 못하는 상황이 발생했다.
로직상 오류가 아닌것이, 테스트를 할 때마다 결과값이 달랐었다.
async scrapArcaDeal(url: string) : Promise<HotDeal[]> {
// 브라우저 실행
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
const web = await puppeteer.launch({
headless: true
});
const page = await web.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
const deals: HotDeal[] = await page.evaluate(() => {
const baseURL = 'https://arca.live';
const rows = document.querySelectorAll('.vrow.hybrid');
if (rows.length === 0) {
return [{ id: 0 ,site: 'Arca', title: 'No Data Found', link: '#', price: 'No Price', createAt: '-' }];
}
return Array.from(rows).map(row => {
const titleElement = row.querySelector('a.title.hybrid-title');
const timeElement = row.querySelector('span.vcol.col-time time');
const priceElement = row.querySelector('span.deal-price');
return {
id: 0,
title: titleElement?.textContent?.trim() ?? 'No Title',
link: titleElement?.getAttribute('href') ? baseURL + titleElement.getAttribute('href') : '#',
createAt: timeElement?.getAttribute('datetime') || 'No Time',
price: priceElement?.textContent?.trim() ?? 'No Price',
site: 'Arca'
};
});
});
await web.close();
return deals.map(deal => ({
...deal,
createAt: convertRelativeTimeToDate(deal.createAt)
}));
}
해당 로직을 사용해서 크롤링을 한 결과, 계속해서 No Data가 나왔다. 다른 사이트의 크롤링도 해당 로직을 이용하지만, 정상 출력되는데에 비해 아카라이브만 가끔씩 해당 현상을 보였다.
클라우드플레어가 자동으로 크롤링을 경계하는 것 같아 아래코드를 넣어주었다.
// ✅ arclive에서 크롤링할 경우 자주 발생하는 No Data Found 오류로 인한 User-Agent 설정
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
await page.setExtraHTTPHeaders({
'Accept-Language': 'en-US,en;q=0.9',
'Referer': 'https://www.google.com/',
'Upgrade-Insecure-Requests': '1',
});
setUserAgent, setExtraHTTPHeaders 를 이용해 실제 유저처럼 헤더를 추가하여 시도했더니 간헐적으로 생겼던 No Data 현상이 사라졌다.
→ 간혹 생김. 클라우드플레어의 영향인지 아카라이브 측에서 일부로 제외한 것 인지는 검증 필요
728x90
'사이드 프로젝트' 카테고리의 다른 글
perplexity 퍼플렉시티 api 사용법, postman 호출해보기 (2) | 2025.03.18 |
---|---|
Nest.js + React.js (Next.js) 사이드 프로젝트 : Repository extend (0) | 2025.03.17 |
Nest.js + React.js (Next.js) 사이드 프로젝트 : 페이징 구현하기 (1) (0) | 2025.03.12 |
nest.js 를 이용해 크롤링 해보기 (1) - puppeteer 동적 크롤링 (0) | 2025.03.07 |
Nest.js + React.js(Next.js) 사이드 프로젝트 : TypeORM save(), insert(), update() (0) | 2025.03.07 |