무한스크롤의 페이지를 크롤링하기 위해 드래그를 맨 밑으로 내려서 div, a 등 태그들은 로딩이 됐지만 이미지는 해당 위치로 이동을 해야 로딩되는 방식이어서 img src를 받을 수 없었다.
그래서 setInterval
로 시간초마다 일정 높이를 드래그하여 이미지 전체를 로딩받은 다음, src를 받아 저장하는 기능을 구현했는데 다음과 같은 에러가 발생했다.
Error: Protocol error (Runtime.evaluate): Session closed. Most likely the page has been closed.
at CDPSession.send
런타임 중 프로토콜 에러가 발생했는데.. 세션은 닫혔고 CDP세션.send에서 페이지가 닫혔을 가능성이 높다..
원인은 정확하지 않지만 작업이 진행되고 있는 도중 await page.close()
을 해서 그런듯..하다 해결하지 못하면 서버가 종료된다.
비동기함수호출을 제대로 이해하지 못하고 사용한 것 같다.
기존코드
const pageDown = async page => {
async function imageLoading(currentScroll, previousHeight) {
const interval = setInterval(async function () {
previousHeight = await page.evaluate(`document.body.scrollHeight`);
currentScroll += 50;
await page.evaluate(`window.scrollTo(0, ${currentScroll})`);
console.log("페이지 다운")
if (currentScroll >= previousHeight) {
clearInterval(interval);
return (1);
}
}, 50);
}
await imageLoading(0, 0).then((value) => {
console.log("이미지 로딩 end" + value)
});
return (1);
};
수정코드
async function infiniteScroll(page) {
let previousHeight = await page.evaluate(`document.body.scrollHeight`);
let currentScroll = 0;
while (currentScroll <= previousHeight) {
currentScroll += 50;
previousHeight = await page.evaluate(`document.body.scrollHeight`);
await page.evaluate(`window.scrollTo(0, ${currentScroll})`);
delay(50);
}
return (1);
}
클라우드서비스에서 퍼펫티어수행시 해당 에러가 발생했다.
클라우드내 크로미움이 제대로 설치되지 않은 듯하다.
sudo apt-get install chromium-browser
로 설치하고 각 크롤러 browser.launch 설정에 다음을 추가한다.
const browser = await puppeteer.launch({
executablePath: '/usr/bin/chromium-browser'
});