不要相信前端是安全的,今天簡單驗證一下,但是希望大家支持正版,支持原作者,畢竟寫書不易。
安裝Puppteer
npm install --save puppeteer
選擇目標網站
我們這里選擇胡子大哈大神的網站 http://huziketang.mangojuice.top ;
爬取所有文章
基本思想思路
- 實現方案
爬取書籍目錄->根據目錄爬取沒個章節的內容
- 注意的地方
本書有付費章節和免費章節,爬取付費章節需要禁用javascript執行,然后移除對應的mask的dom節點
核心代碼
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();
代碼比較簡單,不做過多解釋。