Javascript文档.querySelectorAll()不适用于无限滚动

Javascript文档.querySelectorAll()不适用于无限滚动,javascript,web-scraping,puppeteer,Javascript,Web Scraping,Puppeteer,我正在尝试建立一个简单的网页抓取工具。我正在尝试的数据有一个无限的卷轴。以下是我正在使用的函数: async function scrapeInfiniteScrollItems(page,extractItems,itemTargetCount,scrollDelay = 1000) { let items = []; try { let previousHeight; while (items.length < itemTargetCount)

我正在尝试建立一个简单的网页抓取工具。我正在尝试的数据有一个无限的卷轴。以下是我正在使用的函数:

async function scrapeInfiniteScrollItems(page,extractItems,itemTargetCount,scrollDelay = 1000) {
    let items = [];
    try {
      let previousHeight;
      while (items.length < itemTargetCount) {
        items = await page.evaluate(extractItems);
        previousHeight = await page.evaluate('document.body.scrollHeight');
        await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
        await page.waitForFunction(`document.body.scrollHeight > ${previousHeight}`);
        await page.waitFor(scrollDelay);
      }
    } catch(e) { console.log(e)}
    return items; ---> items.length is Always 42, It should be 482
}

正如你所看到的,我使用的是木偶演员库。在ScrapeInfiniteSrollItems函数返回后。items数组的长度始终为42。应该是482。有人能告诉我我做错了什么吗?

每次循环运行时,您似乎都在覆盖
数组,该行为:
项=等待页。评估(提取项)
。如果希望所有项目都在数组中,请使用
。按如下方式推送

let newItems = await page.evaluate(extractItems);
items.push(newItems);
或者尝试更实用的方法,如:

let newItems = await page.evaluate(extractItems);
items = [...items, newItems];

这样,当您返回数组时,所有项目都应该出现在数组中

不,它仍然在等待函数失败:超过超时30000ms我也得到了那个错误。。。那么您的循环可能只运行了一次。能否在循环中插入
console.log
语句并查看它打印了多少次?如果它仍然只返回42,那么我需要查看您试图刮取的页面,看看它的行为如何
let newItems = await page.evaluate(extractItems);
items = [...items, newItems];