使用Puppeteer抓取受限網站

不要相信前端是安全的,今天簡單驗證一下,可是但願你們支持正版,支持原做者,畢竟寫書不易。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

相關文章
相關標籤/搜索