2018-05-04 12:35 by JerremyZhang, 阅读, 评论, 收藏, 编辑

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

  1. npm install --save puppeteer

我们这里选择胡子大哈大神的网站 http://huziketang.mangojuice.top
爬取所有文章

  • 实现方案

爬取书籍目录->根据目录爬取没个章节的内容

  • 注意的地方

本书有付费章节和免费章节,爬取付费章节需要禁用javascript执行,然后移除对应的mask的dom节点

  1. const path = require('path');
  2. const fs = require('mz/fs');
  3. const puppeteer = require('puppeteer');
  4. const pdfDir = path.resolve(__dirname, './pdf/');
  5. const targetHost = "http://huziketang.mangojuice.top"
  6. //保存pdf 文件
  7. const savePdf = async (page, link) => {
  8. let fileName = link.substring(link.lastIndexOf('/')) + '.pdf';
  9. await page.goto(link);
  10. await page.evaluate(() => {
  11. //隐藏左侧菜单栏 以及下方部分内容
  12. let allNeedHidens = document.querySelectorAll('#table-of-content,.PageNavigation,.share-block,hr,blockquote,.post__back>a,#wrapper>h1');
  13. let elCount = allNeedHidens.length;
  14. for (let i = 0; i < elCount; i++) {
  15. allNeedHidens[i].style.display = 'none';
  16. }
  17. });
  18. await page.pdf({
  19. path: pdfDir + fileName
  20. });
  21. console.log(`${link} saved to pdf successfully!!!`);
  22. }
  23. //启动程序
  24. const start = async () => {
  25. //创建一个browser 实例
  26. let browser = await puppeteer.launch({
  27. headless: true,
  28. devtools: false
  29. });
  30. //创建一个空白page实例
  31. let page = await browser.newPage();
  32. //设置禁用js,当前必须设置,否则会导致页面无法处理
  33. //说明:只是禁用page原有javascript,但是page.evaluate 中可以继续使用
  34. await page.setJavaScriptEnabled(false);
  35. //获取书目录标题
  36. await page.goto(targetHost + '/books/react/');
  37. let result = await page.evaluate((targetHost) => {
  38. //获取目录链接
  39. let ulArray = document.querySelectorAll('ul.table-of-content>li>a');
  40. let array = Array.prototype.slice.call(ulArray, 0);
  41. let links = array.map((v) => {
  42. let href = v.getAttribute('href');
  43. return `${targetHost}${href}`;
  44. })
  45. return {
  46. links: links
  47. }
  48. }, targetHost);
  49. for (let link of result.links) {
  50. await savePdf(page, link);
  51. }
  52. await page.close();
  53. await browser.close();
  54. }
  55. start();

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

版权声明:本文为Johnzhang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Johnzhang/p/8990084.html