使用PhantomJS和Node.js可以完成网页截屏快照的功能,下面是详细的攻略。
1. 准备工作
首先需要在本地安装PhantomJS(可以通过官网下载),安装好后需要将其加入环境变量中。
然后使用npm安装依赖的模块,包括phantom和fs:
npm install phantom --save
npm install fs --save
2. Node.js代码
在Node.js中,可以使用child_process模块创建子进程并运行PhantomJS。这里以使用Promise方式实现一个截屏快照的函数:
const phantom = require('phantom');
const fs = require('fs');
/**
* 使用PhantomJS对网页进行截屏
* @param {string} url 网页地址
* @param {string} savePath 图片保存路径
* @returns {Promise<void>}
*/
async function screenshot(url, savePath) {
// 创建phantom实例
const instance = await phantom.create();
const page = await instance.createPage();
// 设置页面大小,以截取整个页面
await page.property('viewportSize', { width: 1280, height: 800 });
// 打开网页
const status = await page.open(url);
// 如果网页打开失败,则抛出异常
if (status !== 'success') {
throw new Error(`Cannot load the page: ${url}`);
}
// 等待页面加载完成
await new Promise(resolve => setTimeout(resolve, 2000));
// 对页面进行截图
await page.render(savePath);
// 关闭phantom实例
await instance.exit();
}
// 使用示例
screenshot('https://www.example.com', 'example.png')
.then(() => console.log('截图完成'))
.catch(err => console.error(err));
使用该函数可以将指定网页截屏并保存为PNG图片。
3. 示例说明
下面展示两个使用PhantomJS和Node.js截屏快照的示例。
3.1 截取HTML为图片
可以使用PhantomJS将HTML内容渲染为图片。下面是一个使用Express框架实现的示例:
const express = require('express');
const phantom = require('phantom');
const fs = require('fs');
const app = express();
app.get('/screenshot', async (req, res) => {
const { html } = req.query;
// 创建phantom实例
const instance = await phantom.create();
const page = await instance.createPage();
// 设置页面大小为A4纸张
await page.property('paperSize', { format: 'A4', orientation: 'portrait' });
// 将HTML内容写入页面
await page.setContent(html, '');
// 对页面进行截图
const imageBuffer = await page.renderBase64('PNG');
// 关闭phantom实例
await instance.exit();
// 将图片以base64编码方式返回
res.send(`<img src="data:image/png;base64,${imageBuffer}">`);
});
app.listen(3000, () => console.log('服务已启动'));
该示例创建了一个Express应用,可以通过访问http://localhost:3000/screenshot?html=...
进行截屏快照。html
参数为要截屏的HTML内容,响应结果将以图片形式返回。
3.2 同时截取多个页面
有时候需要同时截取多个页面,可以使用Promise.all实现并发处理。下面是一个示例代码:
const phantom = require('phantom');
const fs = require('fs');
/**
* 使用PhantomJS对网页进行截屏
* @param {string} url 网页地址
* @param {string} savePath 图片保存路径
* @returns {Promise<void>}
*/
async function screenshot(url, savePath) {
// 创建phantom实例
const instance = await phantom.create();
const page = await instance.createPage();
// 设置页面大小,以截取整个页面
await page.property('viewportSize', { width: 1280, height: 800 });
// 打开网页
const status = await page.open(url);
// 如果网页打开失败,则抛出异常
if (status !== 'success') {
throw new Error(`Cannot load the page: ${url}`);
}
// 等待页面加载完成
await new Promise(resolve => setTimeout(resolve, 2000));
// 对页面进行截图
await page.render(savePath);
// 关闭phantom实例
await instance.exit();
}
// 要截屏的网页列表
const urls = [
'https://www.baidu.com',
'https://www.google.com',
'https://cn.bing.com'
];
// 同时截屏所有网页
Promise.all(urls.map((url, i) => screenshot(url, `page${i}.png`)))
.then(() => console.log('所有网页截图完成'))
.catch(err => console.error(err));
该示例创建了一个要截屏的网页列表,并通过Promise.all方法同时截取所有网页的截屏快照。在命令行中执行该脚本即可截取所有网页的截屏快照。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Phantomjs和Node完成网页的截屏快照的方法 - Python技术站