【发布时间】:2019-03-09 03:35:15
【问题描述】:
我在使用 puppeteer 抓取用户时间线上的所有推文 URL 时遇到问题。
对于 puppeteer,脚本应该在 scrollToEnd 函数中的 while 循环的每次迭代中向下滚动时间线,直到它到达底部。为了监控进度,我让脚本输出了previousHeight 变量的值,即每次执行滚动前评估的document.body 的当前scrollheight。
但是,一旦输出值变为 285,834,滚动就会停止。令人费解的是,脚本既没有跳出while循环,也没有page.waitForFunction方法抛出超时错误。
我应该如何重写scrollToEnd 函数或脚本的任何其他部分,以便函数正确结束?
这是我的代码的 sn-p。为简洁起见,省略了不相关的功能。
const puppeteer = require('puppeteer');
var UserUrls = ['https://twitter.com/someuser'];
// more functions here
async function scrollToEnd(
page,
ScrollDelay = 1000
) {
try {
let previousHeight = 0;
let notEnd = await page.waitForFunction(`document.body.scrollHeight > ${previousHeight}`);
while (notEnd) {
previousHeight = await page.evaluate('document.body.scrollHeight');
await page.evaluate('window.scrollBy(0, document.body.scrollHeight)');
await page.waitFor(ScrollDelay);
notEnd = await page.waitForFunction(`document.body.scrollHeight > ${previousHeight}`);
console.log(previousHeight)
};
return;
} catch (e) {
return;
};
};
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
var tweetUrls = [];
for (let UserUrl of UserUrls) {
await page.goto(UserUrl);
await page.evaluate((async () => {
await scrollToEnd(page);
})());
await page.screenshot({ path: 'PageEnd.png' });
tweetUrls = await getTweetUrls(page, extractItems, 100);
};
await browser.close();
console.log(tweetUrls);
})();
【问题讨论】:
标签: javascript node.js twitter web-scraping puppeteer