内容简介:您可以在浏览器中手动执行的大多数操作都可以使用生成页面的屏幕截图和抓取
1、 puppeteer 是什么?
官方介绍:
您可以在浏览器中手动执行的大多数操作都可以使用 Puppeteer 完成!
生成页面的屏幕截图和 PDF 。
抓取 SPA 并生成预渲染内容(即“ SSR ”)。
自动化表单提交, UI 测试,键盘输入等。
创建最新的自动化测试环境。使用最新的 JavaScript 和浏览器功能直接在最新版本的 Chrome 中运行测试。
捕获时间线跟踪 您的网站,以帮助诊断性能问题。
测试 Chrome 扩展程序。
2、爬取网站生成 PDF
2.1 安装 puppeteer
// 安装 puppeteer // 可能会因为网络原因安装失败,可使用淘宝镜像 // npm install -g cnpm --registry=https://registry.npm.taobao.org npm i puppeteer # or "yarn add puppeteer"
2.2 《 React.js 小书》简介
《 React.js 小书》简介
这是⼀本关于 React.js 的⼩书。
因为⼯作中⼀直在使⽤ React.js ,也⼀直以来想总结⼀下⾃⼰关于 React.js 的⼀些
知识、经验。于是把⼀些想法慢慢整理书写下来,做成⼀本 开源、免费、专业、简单
的⼊⻔级别的⼩书,提供给社区。希望能够帮助到更多 React.js 刚⼊⻔朋友。
下图是《 React.js 小书》部分截图:
《`React.js` 小书》部分截图
2.3 一些可能会用到的 puppeteer API
// 新建 reactMiniBook.js, 运行 node reactMiniBook.js 生成pdf
const puppeteer = require('puppeteer');
(async () => {
// 启动浏览器
const browser = await puppeteer.launch({
// 无界面 默认为true,改成false,则可以看到浏览器操作,目前生成pdf只支持无界面的操作。
// headless: false,
// 开启开发者调试模式,默认false, 也就是平时F12打开的面版
// devtools: true,
});
// 打开一个标签页
const page = await browser.newPage();
// 跳转到页面 http://huziketang.mangojuice.top/books/react/
await page.goto('http://huziketang.com/books/react/', {waitUntil: 'networkidle2'});
// path 路径, format 生成pdf页面格式
await page.pdf({path: 'react.pdf', format: 'A4'});
// 关闭浏览器
await browser.close();
})();
知道这启动浏览器打开页面关闭浏览器主流程后,再来看几个 API 。
const args = 1;
let wh = await page.evaluate((args) => {
// args 可以这样传递给这个函数。
// 类似于 setTimeout(() => {console.log(args);}, 3000, args);
console.log('args', args); // 1
// 这里可以运行 dom操作等js
// 返回通过dom操作等获取到的数据
return {
width: 1920,
height: document.body.clientHeight,
};
}, args);
// 设置视图大小
await page.setViewport(wh);
// 等待2s
await page.waitFor(2000);
// 以iPhone X执行。
const devices = require('puppeteer/DeviceDescriptors');
const iPhone = devices['iPhone X'];
await page.emulate(iPhone);
2.4 知道了以上这些 API 后,就可以开始写主程序了。
简单说下:实现功能和主流程。从上面 React.js小书 截图来看。
0. React 小书 目录.pdf
2、跳转到 1. React.js 简介 页面,获取左侧所有的导航 a 链接的 href ,标题。
3、用获取到的 a链接数组 进行 for 循环,这个循环里主要做了如下几件事:
pdf
3.2 给 React.js简介 等标题 加上序号,便于查看
3.3 设置 docment.title 加上序号, 便于在页眉中使用。
3.4 隐藏 传播一下知识也是一个很好的选择 这一个模块(因为页眉页脚中设置了书的链接等信息,就隐藏这个了)
3.5 给 分页 上一节,下一节加上序号,便于查看。
3.6 最末尾声明下该 pdf 的说明,仅供学习交流,严禁用于商业用途。
3.7 返回宽高,用于设置视图大小
3.8 设置视图大小,创建生成 pdf
4、关闭浏览器
具体代码:可以查看这里 爬虫生成《React.js小书》的 pdf 每一小节的代码
// node 执行这个文件 // 笔者这里是: node src/puppeteer/reactMiniBook.js
即可生成如下图:每一小节(0-46小节)的 pdf
每一小节(0-46小节)的`pdf`
生成这些后,那么问题来了,就是查看时总不能看一小节,打开一小节来看,这样很不方便。
于是接下来就是合并这些 pdf 成为一个 pdf 文件。
3、合并成一个PDF文件 pdf-merge
起初,我是使用在线网站 Smallpdf ,合并 PDF 。合并的效果还是很不错的。这网站还是其他功能。比如 word 转 pdf 等。
后来找到社区提供的一个 npm package pdf merge 。 (毕竟笔者是写程序的,所以就用代码来实现合并了)
这个 pdf-merge 依赖 pdftk
安装 PDFtk
Windows
笔者安装后,重启电脑才能使用。
Debian, Ubuntu 安装
笔者在Ubuntu系统安装后,即可使用。
apt-get install pdftk
使用例子
const PDFMerge = require('pdf-merge');
const files = [
`${__dirname}/1.pdf`,
`${__dirname}/2.pdf`,
];
// Buffer (Default)
PDFMerge(files)
.then((buffer) => {...});
// Stream
PDFMerge(files, {output: 'Stream'})
.then((stream) => {...});
// 笔者这里使用的是这个
// Save as new file
PDFMerge(files, {output: `${__dirname}/3.pdf`})
.then((buffer) => {...});
知道这些后,可以开始写主程序了。
简单说下主流程
1、读取到生成的所有 pdf 文件路径,并排序(0-46)
2、判断下输出文件夹是否存在,不存在则创建
3、合并这些小节的 pdf 保存到新文件 React小书(完整版)-作者:胡子大哈-时间戳.pdf
具体代码:可以查看这里 爬虫生成《React.js小书》的 pdf 合并 pdf 的代码
最终合并的 pdf 文件在这里 React小书(完整版)-作者:胡子大哈 ,可供下载。
本想着还可以加下书签和页码,没找到合适的生成方案,那暂时先不加了。如果读者有好的方案,欢迎与笔者交流。
关于
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript DOM高级程序设计
Jeffrey Sambells、Aaron Gustafson / 李松峰、李雅雯 / 人民邮电出版社 / 2008-7 / 59.00元
本书注重理论与实践的结合,全面讲述高级的DOM 脚本编程。全书分为3 个部分:第一部分“深入理解DOM 脚本编程”,涉及W3C DOM 规范的各方面,包括非标准的浏览器支持和不支持的内容;第二部分“浏览器外部通信”,以Ajax 和客户端—服务器端通信为主题;第三部分“部分高级脚本编程资源”,集中介绍了一批第三方脚本编程资源,包括库和API。同时,每部分的最后一章都为案例研究,将学到的内容应用于实践......一起来看看 《JavaScript DOM高级程序设计》 这本书的介绍吧!
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
URL 编码/解码
URL 编码/解码