1

我正在寻找一个页面作为学习 phantomjs 的练习,但是我目前遇到了一个问题。图像加载被推迟,所以我试图弄清楚如何让 phantom js 向下滚动并等待图像加载。滚动到页面底部不起作用,所以我想每 3 秒滚动 100 像素,直到它到达页面底部。我将如何实现这一目标?

const phantom = require('phantom');

(async function() {

  const instance = await phantom.create();
  const page = await instance.createPage();

  await page.on('onResourceRequested', function(requestData) {
    console.info('Requesting', requestData.url);
  });

  await page.open(<URL>);

  const js = await page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js');

  const data = await page.evaluate(function() {
    // Do something
  });

  page.render('test.pdf');  

  await page.close();
  await instance.exit();
})();
4

3 回答 3

1

PhantomJS 确实支持“滚动”,有一个页面属性scrollPosition可能可以像这样使用:

await page.property('scrollPosition', { top: 300, left: 0 });

您可以scrollPosition动态更改,在一段时间内增加它,这应该会触发负责图像加载的回调。

这是原始 PhantomJS 脚本中的一个示例,展示了沿着 Twitter 的时间线走下去的技术。

于 2018-01-09T09:31:13.667 回答
0
const phantom = require('phantom');

// Scrolls the page till new content is available
async function scrollPage(page) {
    const currentContentLength = (await page.property('content')).length;
    await page.evaluate(function () {
        window.document.body.scrollTop = document.body.scrollHeight;
    });
    await wait(Math.max(5000, 10000 * Math.random()));
    const nextContentLength = (await page.property('content')).length;
    if (currentContentLength != nextContentLength) {
        console.log("Scrolling page:", await page.property('url'), "for more content");
        await scrollPage(page);
    }
}

// Scrolls the page and gets the page content using PhantomJS
async function getPageData(pageUrl, shouldScrollPage) {
    const instance = await phantom.create();
    const page = await instance.createPage();
    await page.open(pageUrl);
    if (shouldScrollPage) {
        await scrollPage(page);
    }
    const pageContent = await page.property('content');
    await page.close();
    await instance.exit();
    return pageContent;
};
于 2019-10-07T16:25:06.527 回答
0

您也可以使用基于 phantom.js 的node-webshot来渲染 pdf。它有很多配置。你需要的一个是renderDelay来延迟截图和shotOffset来滚动你想要的地方。

于 2018-01-04T10:34:53.177 回答