前端使用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.pswp.cn/news/276500.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276500.shtml
英文地址,請注明出處:http://en.pswp.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原則王健林之前說定個…