使用puppeteer抓取受限网站

不要相信前端是安全的,今天简单验证一下(但是希望大家支持正版,支持原作者,毕竟写书不易)。

安装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();

代码比较简单,不做过多解释。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

iOS9系列专题一——3D Touch 原

        在iphone6s问世之后,很多果粉都争先要体验3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加...

8120
来自专栏星流全栈

二〇一六年的前端入门指南

13880
来自专栏Web 开发

Design For Mobile Web

上面这段代码,源自Google的Best Practices for Web Apps,但在实际使用过程中,并不能完全适应iOS、Android平台,至于WP,...

10000
来自专栏极客编程

angularJS之站在jQuery的肩膀上

托互联网日新月异发展的福,浏览器变成了人们接入互联网的入口,而JavaScript 这个曾经的小语种,终于成功地站到了舞台的中央,唤起了开发者的兴趣。

9210
来自专栏Google Dart

AngularDart4.0 指南- 表单 顶

表单是商业应用程序的主流。您可以使用表单登录,提交帮助请求,下订单,预订航班,安排会议,并执行无数其他数据录入任务。

1K30
来自专栏IMWeb前端团队

开源跨平台移动项目Ngui【CSS样式表规则及用法】

Ngui简介 这是一个GUI的排版显示引擎和跨平台的GUI应用程序开发框架,基于NodeJS/OpenGL,这也是第一个在移动端Android/iOS融合Nod...

23080
来自专栏司想君

HTML5.2新特性解读

不到一个月之前,W3C官方发布 HTML5.2,并成为官方推荐使用标准。这意味着作为web开发者,我们可以愉快地使用5.2中的新特性了。 W3C在HTML5.2...

37750
来自专栏葡萄城控件技术团队

Spread for Windows Forms快速入门(16)---用Spread设计器创建和编辑图表

Spread支持85种丰富多彩的图表效果。可以在Spread设计器中基于工作表的数据直接生成图表,操作简单。同时,软件人员还可以在Visual Studio设计...

23880
来自专栏freesan44

实现 iOS 前台时的推送弹窗效果EBForeNotification

或许很多童鞋还不知道,在 iOS 中收到推送通知时,如果 App 处于前台运行的情况下,推送的顶部弹窗是不会弹出来的。

21310
来自专栏前端知识分享

第176天:页面优化

从用户角度而言,优化能够让页面加载得更快、对用户的操作响应得更及时,能够给用户提供更为友好的体验。从服务商角度而言,优化能够减少页面请求数、或者减小请求所占带宽...

13420

扫码关注云+社区

领取腾讯云代金券