안녕하세요:) 개발자 우디입니다! 아래 내용 관련하여 작업 중이신 분들께 도움이되길 바라며 글을 공유하니 참고 부탁드립니다😊
(이번에 벨로그로 이사오면서 예전 글을 옮겨적었습니다. 이 점 양해 부탁드립니다!)
Puppeteer 는 Headless Chrome 혹은 Chromium 를 제어하도록 도와주는 라이브러리. 필요한 데이터가 JavaScript에 의해 동적으로 생성되는 경우에 유용함.
puppeteer.launch() 활용하여 브라우저 생성.
browser.newPage() 활용하여 새 페이지 생성.
setViewport() 활용하여 페이지 크기 설정.
streamDetailUrl 로 이동 원하는 URL 구성
goto() 활용하여 원하는 URL로 이동.
content() 활용하여 페이지에서 콘텐츠 받아오기.
페이지 콘텐츠에 restricted 가 포함되었는지를 통해 에러 발생 여부 파악.
실제 코드 적용
const browser = await puppeteer.launch();
const streamDetailPage = await browser.newPage();
await streamDetailPage.setViewport({
width: 1366,
height: 768,
});
const streamDetailUrl = `https://twitchtracker.com/${streamerLoginId}/streams/${streamId}`;
...
await streamDetailPage.goto(streamDetailUrl, {
waitUntil: 'load',
});
const streamDetailPageContent = await streamDetailPage.content();
// when access restricted (error 429)
if (streamDetailPageContent.includes('restricted')) { //
finalCategoryResult = {
// { name: 'Project Zomboid', endTime: 22980, startTime: 5880 }
data: '',
twitchTrackerUrl: streamDetailUrl,
error: 'Error occurs while getting category info: Access restricted (Error 429)',
};
return finalCategoryResult;
}
cheerio는 Node.js에서 HTML을 파싱하여 스크래핑 하기 위한 라이브러리.
앞서 puppeteer에서 받아온 페이지 콘텐츠를 cheerio.load() 활용하여 로드한 후, 원하는 방식으로 데이터 가공함.
실제 코드 적용
const $streamDetailPage = cheerio.load(streamDetailPageContent);
const chartLabels = $streamDetailPage('span.highcharts-plot-line-label');
let chartLabelTextArr = [];
chartLabels.each(function (idx, label) {
chartLabelTextArr.push($streamDetailPage(label).text());
});