【问题标题】:Infinite scrolling with puppeteer when scraping抓取时使用 puppeteer 无限滚动
【发布时间】:2021-04-30 14:03:42
【问题描述】:

我有一个抓取程序可以访问 youtube 并获取每个缩略图的 img src。它的问题是即使程序导航到 src url 并记录它的工作 youtube 具有无限滚动功能,可确保客户端浏览器仅在用户将项目滚动到视图中时才获取项目。因此,为了处理无限滚动,我添加了一个滚动到可以在底部创建更多内容的页面部分和选择器,即document.querySelectorAll('.class_name').length,以检查是否生成了更多内容,但程序仍然没有处理无限滚动问题。我无法弄清楚我错过了什么。任何帮助表示赞赏。提前致谢。

async function scrape(url) {

  const browser = await puppeteer.launch({
    headless: false
  });
  const page = await browser.newPage();
  await page.goto(url, {
    timeout: 0
  });
  await page.setViewport({
    width: 1200,
    height: 800
  });

  const delay = 3000;
  let preCount = 0;
  let postCount = 0;
  do {
    preCount = await getCount(page);
    await scrollDown(page);
    await page.waitFor(delay);
    postCount = await getCount(page);
  } while (postCount > preCount);
  await page.waitFor(delay);

  const srcSelector = 'ytd-thumbnail > a > yt-img-shadow > #img'
  const ytSrcData = await page.$$eval(srcSelector, elems => elems.map(el => el.src).join('\n'))

  browser.close();

  console.log({
    ytTextData,
    ytSrcData
  })


}

async function getCount(page) {
  return await page.$$eval('.ytd-rich-item-renderer', a => a.length);
}

async function scrollDown(page) {
  await page.$eval('.ytd-rich-item-renderer:last-child', e => {
    e.scrollIntoView({
      behavior: 'smooth',
      block: 'end',
      inline: 'end'
    });
  });
}

【问题讨论】:

    标签: javascript puppeteer infinite-scroll


    【解决方案1】:

    不要滚动到可能存在或不存在的某个元素,只需滚动到页面底部即可。

    scrollTo(0,document.body.scrollHeight);
    

    像这样……

    async function scrollDown(page) {
      await page.evaluate(function(){
        scrollTo(0,document.body.scrollHeight);
      });
    }
    

    【讨论】:

    • 你的意思是这样的。 await page.scrollTo(0, document.body.scrollHeight);。 @我曾经和一只熊搏斗过。
    • @anon20010813 不,您不需要等待。 scrollTo 是同步的。
    • 我收到错误文档未定义。@我曾经和一只熊搏斗过。
    • @anon20010813 - 你在正确的上下文中调用它,对吧?查看我的更新。
    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 2012-09-13
    • 2023-03-08
    • 2023-01-16
    • 2019-04-21
    • 2021-11-01
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多