不要相信前端是安全的,今天簡單驗證一下,可是但願你們支持正版,支持原做者,畢竟寫書不易。javascript
安裝Puppteer
npm install --save puppeteer
選擇目標網站
咱們這裏選擇鬍子大哈大神的網站 http://huziketang.mangojuice.top ; 爬取全部文章前端
基本思想思路
- 實現方案
爬取書籍目錄->根據目錄爬取沒個章節的內容java
- 注意的地方
本書有付費章節和免費章節,爬取付費章節須要禁用javascript執行,而後移除對應的mask的dom節點react
核心代碼
const path = require('path'); const fs = require('mz/fs'); const puppeteer = require('puppeteer'); const pdfDir = path.resolve(__dirname, './pdf/'); const targetHost = "http://huziketang.mangojuice.top" //保存pdf 文件 const savePdf = async (page, link) => { let fileName = link.substring(link.lastIndexOf('/')) + '.pdf'; await page.goto(link); await page.evaluate(() => { //隱藏左側菜單欄 以及下方部份內容 let allNeedHidens = document.querySelectorAll('#table-of-content,.PageNavigation,.share-block,hr,blockquote,.post__back>a,#wrapper>h1'); let elCount = allNeedHidens.length; for (let i = 0; i < elCount; i++) { allNeedHidens[i].style.display = 'none'; } }); await page.pdf({ path: pdfDir + fileName }); console.log(`${link} saved to pdf successfully!!!`); } //啓動程序 const start = async () => { //建立一個browser 實例 let browser = await puppeteer.launch({ headless: true, devtools: false }); //建立一個空白page實例 let page = await browser.newPage(); //設置禁用js,當前必須設置,不然會致使頁面沒法處理 //說明:只是禁用page原有javascript,可是page.evaluate 中能夠繼續使用 await page.setJavaScriptEnabled(false); //獲取書目錄標題 await page.goto(targetHost + '/books/react/'); let result = await page.evaluate((targetHost) => { //獲取目錄連接 let ulArray = document.querySelectorAll('ul.table-of-content>li>a'); let array = Array.prototype.slice.call(ulArray, 0); let links = array.map((v) => { let href = v.getAttribute('href'); return `${targetHost}${href}`; }) return { links: links } }, targetHost); for (let link of result.links) { await savePdf(page, link); } await page.close(); await browser.close(); } start();
代碼比較簡單,不作過多解釋。npm