前端使用puppeteer 爬虫生成《React.js 小书》PDF并合并

前端也可以爬虫,写于2018年08月29日,现在发布到微信公众号申明原创。

掘金@若川 本文章链接:https://juejin.im/post/5b86732451882542af1c8082

1、 puppeteer 是什么?

puppeteer: Google 官方出品的 headless Chrome node
puppeteer github仓库
puppeteer API

官方介绍:

您可以在浏览器中手动执行的大多数操作都可以使用 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 小书》部分截图:

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小书截图来看。
1、打开浏览器,进入目录页,生成 0.React小书目录.pdf
2、跳转到 1.React.js简介页面,获取左侧所有的导航 a链接的 href,标题。
3、用获取到的 a链接数组进行 for循环,这个循环里主要做了如下几件事:

3.1 隐藏左侧导航,便于生成 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

生成这些后,那么问题来了,就是查看时总不能看一小节,打开一小节来看,这样很不方便。
于是接下来就是合并这些 pdf成为一个 pdf文件。

3、合并成一个PDF文件 pdf-merge

起初,我是使用在线网站Smallpdf,合并 PDF。合并的效果还是很不错的。这网站还是其他功能。比如 wordpdf等。
后来找到社区提供的一个 npm packagepdf merge。(毕竟笔者是写程序的,所以就用代码来实现合并了)

这个 pdf-merge依赖 pdftk

安装 PDFtk
Windows
下载并安装
笔者安装后,重启电脑才能使用。

Debian, Ubuntu 安装
笔者在Ubuntu系统安装后,即可使用。
apt-getinstall 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文件可供下载。百度网盘链接: https://pan.baidu.com/s/107WNpJqHbBPxAGsXS51u5A 提取码: m4nd。github下载链接:React小书(完整版)-作者:胡子大哈。

本想着还可以加下书签和页码,没找到合适的生成方案,那暂时先不加了。如果读者有好的方案,欢迎与笔者交流。

小结

1、 puppeteerGoogle 官方出品的 headless Chrome node库,可以在浏览器中手动执行的大多数操作都可以使用 Puppeteer完成。总之可以用来做很多有趣的事情。
2、用 puppeteer 生成每一小节的 pdf,用依赖 pdftkpdf-merge npm包, 合并成一个新的 pdf文件。或者使用Smallpdf等网站合并。
3、《 React.js小书》,推荐给大家。爬虫生成 pdf,应该不会对作者@胡子大哈有什么影响。作者写书服务社区不易,尽可能多支持作者。

最后推荐几个链接,方便大家学习 puppeteer
puppeteer入门教程
Puppeteer 初探之前端自动化测试
爬虫生成ES6标准入门 pdf
大前端神器安利之 Puppeteer
puppeteer API中文文档

关于

作者:常以若川为名混迹于江湖。前端路上 | PPT爱好者 | 所知甚少,唯善学。
个人博客 https://lxchuan12.cn/posts 使用 vuepress重构了,阅读体验可能更好些
https://github.com/lxchuan12/blog,相关源码和资源都放在这里,求个 star^_^~

微信交流群,加我微信lxchuan12,注明来源,拉您进前端视野交流群

下图是公众号二维码:若川视野,一个可能比较有趣的前端开发类公众号,目前前端内容不多

往期文章

工作一年后,我有些感悟(写于2017年)

高考七年后、工作三年后的感悟

面试官问:JS的继承

学习 jQuery 源码整体架构,打造属于自己的 js 类库

学习underscore源码整体架构,打造属于自己的函数式编程类库

学习 lodash 源码整体架构,打造属于自己的函数式编程类库

学习 sentry 源码整体架构,打造属于自己的前端异常监控SDK

由于公众号限制外链,点击阅读原文,或许阅读体验更佳,觉得文章不错,可以点个在看呀^_^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蜘蛛与佛的故事

最近闭关,空面四壁,窗外层峦叠嶂,窗台上只有一盆花每日陪着我,朋友们都说我要成佛了,想想也是! 于是在闭关即将结束的时候找了一篇佛的故事送给自己,希望自己能够顿悟一些"禅"机。 从前,有一座圆音寺,每天都…

信息安全管理与评估_计算机工程学院教师参加“信息安全管理与评估赛项”说明会...

看了就要关注我,喵呜~2019年3月15日下午,2019年陕西省高等职业院校技能大赛“信息安全管理与评估赛项说明会”在咸阳职业技术学院举行。出席本次会仪的有咸阳职业技术学院教务处长杨新宇、神州数码范永强经理、神州数码信息安全工程师高峰和各院校指导教…

haproxy概念和负载均衡

https://pan.baidu.com/s/1Sq2aJ35zrW2Xn7Th9j7oOA //软件百度网盘连接 在80.100虚拟机上 systemctl stop firewalld //关闭防火墙 setenforce 0 //关闭监控 yum install lrz* -y //安装上传软件 tar xf haproxy-1.5.15.tar.gz -C /opt/ //解压压缩包到/opt/ cd /op…

PHP用户注册邮箱验证激活帐号

转载链接:http://www.helloweba.com/view-blog-228.html 本文将结合实例,讲解如何使用PHPMysql完成注册帐号、发送激活邮件、验证激活帐号、处理URL链接过期的功能。 业务流程 1、用户提交注册信息。 2、写入数据库,此时帐号状态未激活。 …

知乎问答:一年内的前端看不懂前端框架源码怎么办?

知乎问答:一年内的前端看不懂前端框架源码怎么办?以下是我的回答,阅读量 1000。现在转载到微信公众号中。链接:https://www.zhihu.com/question/350289336/answer/910970733其他回答的已经很好了。刚好最近在写学习源码整体架构系…

帮自己发个求职简历

帮自己发个求职简历 发个求职信息。本人擅长Web开发,尤其擅长Flex,愿从事Web开发,最好是Web前端开发,下面是我的详细个人简历: 个人信息: 姓名:伍国耀 年龄:23 性别:男 专…

python函数 global_**Python的函数参数传递 和 global

函数的参数到底是传递的一份复制的值,还是对内存的引用?我们看下面一段代码:a []def fun(x):x.append(1)fun(a)print(a)想想一下:如果传递的是一份复制的值,那么列表a应该是不会变化的,还是空列表&#xf…

冷启动问题:如何构建你的机器学习组合?

作为即将告别大学的机器学习毕业狗的你,会不会有种迷茫的感觉?你知道 HR 最看重的是什么吗?在求职季到来之前,毕业狗要怎么做,才能受到 HR 的青睐、拿到心仪的 Offer 呢?负责帮助应届生找到机器学习工作的 …

JavaScript 对象所有API解析【2020版】

写于 2017年08月20日,虽然是2017年写的文章,但现在即将2020年依旧不过时,现在补充了2019年新增的ES10 Object.fromEntries()。发到公众号申明原创。若川顺便在此提前祝大家:2020年更上一层楼。近日发现有挺多人对对象基础API不熟悉…

javascript操作符之new 也疯狂 (2)

JavaScript本是一种基于原形的(prototypal)语言,但它的“new”操作符看起来有点像经典语言。这迷惑了广大程序员们,并导致了很多使用上的问题。 在JavaScript中,不要用到new Object()这种操作,该用{ }来代替…

python中if语句缺省else_9_【Python学习分享文章】_if(条件语句)

【Python学习分享文章】_if(条件语句)_logicalJudgement介绍及基本操作综述计算机的“条件语句”和生活中的“条件成立”是不一样的。一个生活中的例子如果被计算机执行则是如下段子:老婆让程序员老公去买苹果,说:“去水果店买5个苹果&#x…

PHP生成各种验证码和Ajax验证

转载链接:http://www.helloweba.com/view-blog-191.html 验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和登录、论坛恶意灌水等。本文将通过实例讲解使用PHP生成各种常见的验证码包括数字验证码、数字字母验证码、中文…

若川的2019年度总结,波澜不惊

从2014年开始写年度总结至今已经六个年头了。正如孔子所说:逝者如斯夫,不舍昼夜。2019年的年度总结写得比较晚,都快农历新年了,此刻在家里继续写完这篇文章。往年基本是元旦之后几天就写完了。我的年度总结尽量写得非技术人员也能…

如何正确选择仓储物流供应商?

如何正确选择仓储物流供应商? 以前有做电商的朋友向我咨询过怎么去选择优质的仓储物流供应商?有哪些能做作为关键问题进行参考。作为一个优秀的合作伙伴是可以为客户提供超乎预期的服务的,上海维佳供应链服务专业提供物流外包解决仓储物流供应…

在虚机上安装WIN2003

Moss2-turn on-WM;SJY;SJYM;666666备注:计算机名在网络上必须是唯一的。姓名:WP; 单位:SJY; 计算机名称:SJYP; 密码:666666server 2003 R2版 MDGJK-PF6YQ-PD8DJ-RFQVM-7WKWG在“网络设置”页面上,单击“典型…

python字典获取关联值_【Python实战12】使用字典关联数据

现在我的手里有了新的一组数据,数据内容如下:james.txt:James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2-01,2.01,2:16julie.txt:Julie Jones,2002-8-17,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21,3.01…

Sending HTML content in an email using PHP

转载链接&#xff1a;http://code.web-max.ca/misc_htmlemail.php 发送一个HTML格式的电子邮件&#xff0c;主要在邮件的头信息中定义邮件正文的类型&#xff1a; Content-Type:text/html;charset"utf-8"。 示例&#xff1a; <?php// Example $HTML …

Realtime Ray Tracing RenderMan Point Cloud

这里演示的是演示的是光线与包围盒测试。在装备Winfast 8800GT 512M的台式机上可以进行每秒4.6亿次点到射线的距离计算计算&#xff0c;用于判断点是否真正的与射线相交。外部数据的填充与准备延迟依旧是GPGPU应用的一个巨大门槛。白色是命中的包围盒&#xff0c;绿色的就是射线…

SharePoint文档上传管理

前台代码: <% Control Language"C#" AutoEventWireup"true" CodeBehind"FileUpload.ascx.cs" Inherits"UploadFile.FileUpload" %><table><tr><td style"width:138px; height: 24px;">请选择列表:…

如何制定有价值的目标

写于2017年07月09日23:29现在修改发布到公众号声明原创公司会制定一系列目标&#xff0c;个人也可以制定一些目标&#xff0c;有利于自我学习成长。那么看我这篇文章可以告诉你如何制定有价值的目标。会制定有价值的目标&#xff0c;绝对超越很多人。SMART原则王健林之前说定个…