使用puppeteer之全网页截图-第一个版本

免责声明:本人博客所有文章纯属学习之用,不涉及商业利益。不合适引用,自当删除!
先说一些废话:
因为是测试,没有给出项目的具体搭建流程。
Puppeteer是谷歌官方出品的一个通过DevTools协议控制headless Chrome的Node库。可以通过Puppeteer的提供的api直接控制Chrome模拟大部分用户操作来进行UI Test或者作为爬虫访问页面来收集数据。所以开发语言当然也就是js啦。
Github项目地址: puppeteer
API: puppeteer API,现在看的时候版本是1.7.0。
puppeteer的简单使用,大家可以参照官网上的demo,或者百度出来的文章,都会有相关的代码,但是似乎puppeteer用的人相对较少,所以真实资料也少很多。能找到的文章就是那么几篇。

至于puppeteer的安装就不累诉了,搜索一下,相信各位能找到,这里主要是针对使用puppeteer对访问网页后,对全网页进行截图(无对网页重出现的特殊场景进行处理,如:验证码、登录框等)。以https://www.jd.com为例。

注意点:需要翻页,否则页面加载不全,则截图时,展示不全。后续会有优化版。

上代码
无翻页版本,写到这里就简单的给出类似demo的例子:

// 导入包
const puppeteer = require('puppeteer');

(async () => {
    // 启动Chromium
    const browser = await puppeteer.launch({ignoreHTTPSErrors: true, headless:false, args: ['--no-sandbox']});
    // 打开新页面
    const page = await browser.newPage();
    // 设置页面分辨率
    await page.setViewport({width: 1920, height: 1080});

    let request_url = 'https://www.jd.com';

    // 访问
    await page.goto(request_url, {waitUntil: 'domcontentloaded'}).catch(err => console.log(err));
    await page.waitFor(1000);
    let title = await page.title();
    console.log(title);

    try {
        // 截图
        await page.screenshot({path: "jd.jpg", fullPage:true}).catch(err => {
            console.log('截图失败');
            console.log(err);
        });
        await page.waitFor(5000);

    } catch (e) {
        console.log('执行异常');
    } finally {
        await browser.close();
    }
})();

运行结果截图:
这里写图片描述
可以发现,图片缺失严重,不管你在代码中等待多久,都是没用的,需要对页面进行滚动,触发页面的滚动事件。
滚动版本,这个版本可以实现滚动,但是觉得代码写的不好,而且对个别一些网站不兼容,所以才成为第一个版本:

const puppeteer = require('puppeteer');

(async () => {
    // 启动Chromium
    const browser = await puppeteer.launch({ignoreHTTPSErrors: true, headless:false, args: ['--no-sandbox']});
    // 打开新页面
    const page = await browser.newPage();
    // 设置页面分辨率
    await page.setViewport({width: 1920, height: 1080});

    let request_url = 'https://www.jd.com';
    // 访问
    await page.goto(request_url, {waitUntil: 'domcontentloaded'}).catch(err => console.log(err));
    await page.waitFor(1000);
    let title = await page.title();
    console.log(title);

    // 网页加载最大高度
    const max_height_px = 20000;
    // 滚动高度
    let scrollStep = 1080;
    let height_limit = false;
    let mValues = {'scrollEnable': true, 'height_limit': height_limit};

    while (mValues.scrollEnable) {
        mValues = await page.evaluate((scrollStep, max_height_px, height_limit) => {

            // 防止网页没有body时,滚动报错
            if (document.scrollingElement) {
                let scrollTop = document.scrollingElement.scrollTop;
                document.scrollingElement.scrollTop = scrollTop + scrollStep;

                if (null != document.body && document.body.clientHeight > max_height_px) {
                    height_limit = true;
                } else if (document.scrollingElement.scrollTop + scrollStep > max_height_px) {
                    height_limit = true;
                }

                let scrollEnableFlag = false;
                if (null != document.body) {
                    scrollEnableFlag = document.body.clientHeight > scrollTop + 1081 && !height_limit;
                } else {
                    scrollEnableFlag = document.scrollingElement.scrollTop + scrollStep > scrollTop + 1081 && !height_limit;
                }

                return {
                    'scrollEnable': scrollEnableFlag,
                    'height_limit': height_limit,
                    'document_scrolling_Element_scrollTop': document.scrollingElement.scrollTop
                };
            }

        }, scrollStep, max_height_px, height_limit);

        await sleep(800);
    }

    try {
        await page.screenshot({path: "jd.jpg", fullPage:true}).catch(err => {
            console.log('截图失败');
            console.log(err);
        });
        await page.waitFor(5000);

    } catch (e) {
        console.log('执行异常');
    } finally {
        await browser.close();
    }

})();

//延时函数
function sleep(delay) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            try {
                resolve(1)
            } catch (e) {
                reject(0)
            }
        }, delay)
    })
}

截图效果:
这里写图片描述
可以看到,效果还是可以的,至于等待时间,需要根据你的网络环境进行延时。当然,此版本只是为了大家学习。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 可以使用以下代码来点击第五个 `li` 标签: ``` const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); // 点击 class 为 "but" 的第五个 li 标签 await page.evaluate(() => { document.querySelector('.but li:nth-child(5)').click(); }); await browser.close(); })(); ``` 上面的代码首先使用 `puppeteer.launch()` 函数打开浏览器,然后使用 `newPage()` 函数创建一个新的页面。接着使用 `page.goto()` 函数转到给定的 URL。 然后使用 `page.evaluate()` 函数执行 JavaScript 代码,在这里使用了 `document.querySelector()` 函数来获取 class 为 "but" 的第五个 `li` 标签,并使用 `click()` 函数来点击它。 最后,使用 `browser.close()` 函数关闭浏览器。 ### 回答2: 使用Puppeteer库进行网页自动化,点击class为"but"的元素下的第五个li标签可以按照以下步骤实现: ```javascript const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); // 1. 打开目标网页 await page.goto('http://example.com'); // 2. 等待class为"but"的元素出现 await page.waitForSelector('.but'); // 3. 获取所有符合条件的class为"but"的元素 const buttons = await page.$$('.but'); // 4. 点击第五个li标签 const lis = await buttons[0].$$('li'); await lis[4].click(); await browser.close(); })(); ``` 在上述代码中,我们首先用puppeteer库启动一个浏览器实例并打开目标网页。然后使用`page.waitForSelector()`方法等待页面上的class为"but"的元素加载完成。接下来,使用`page.$$()`方法获取所有符合条件的class为"but"的元素。在这个例子中,我们假设只有一个符合条件的元素,所以我们直接取第一个元素。接着,使用`$$(selector)`方法获取button元素下所有的li元素,然后通过索引的方式选择第五个li元素,并使用`click()`方法模拟点击操作。 最后,关闭浏览器实例,释放资源。以上就是使用Puppeteer点击class为"but"的元素下的第五个li标签的实现过程。 ### 回答3: 使用Puppeteer点击class="but"下的第五个li标签可以通过以下步骤实现: 1. 首先,我们需要引入Puppeteer库并创建一个浏览器实例: ```javascript const puppeteer = require('puppeteer'); const url = 'http://example.com'; (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(url); // 等待页面加载完成 await page.waitForSelector('.but'); // 获取class为"but"的元素 const element = await page.$('.but'); // 点击第五个li标签 await element.$$eval('li', (lis, index) => { lis[index].click(); }, 4); await browser.close(); })(); ``` 2. 上述代码中,我们使用`page.waitForSelector('.but')`等待页面中的`.but`元素加载完成。 3. 然后,使用`page.$('.but')`获取`.but`元素。 4. 最后,使用`element.$$eval('li', (lis, index) => { lis[index].click(); }, 4)`实现点击第五个li标签的功能。其中,`$$eval`函数是对获取到的元素执行函数的快捷方式,其中的第一个参数是要执行函数的选择器,第二个参数是要执行的函数,其中的`lis`表示选择器选择到的元素集合,`index`表示要点击的li标签的索引,`4`代表第五个li标签。 5. 最后,使用`browser.close()`关闭浏览器实例。 这样就实现了使用Puppeteer点击class="but"下的第五个li标签的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向往的生活Life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值