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];