크롤러 무한스크롤 에러

수박·2020년 11월 14일
1

nodejs

목록 보기
19/19

크롤러 무한스크롤 관련 에러 및 해결

  • 무한스크롤의 페이지를 크롤링하기 위해 드래그를 맨 밑으로 내려서 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);
}

GCP 크롤러 에러

Error: Failed to launch the browser process puppeteer

클라우드서비스에서 퍼펫티어수행시 해당 에러가 발생했다.

클라우드내 크로미움이 제대로 설치되지 않은 듯하다.

sudo apt-get install chromium-browser 로 설치하고 각 크롤러 browser.launch 설정에 다음을 추가한다.

const browser = await puppeteer.launch({
  executablePath: '/usr/bin/chromium-browser'
});

0개의 댓글