点击上方“AirPython”,选择“置顶公众号”

第一时间获取 Python 技术干货!

阅读文本大概需要 8 分钟。

1

目 标 场 景

现如今,我们处于一个信息碎片化的信息时代,遇到好的文章都有随手收藏的习惯。但过一段时间,当你想要重新查看这篇文章的时候,发现文章已经被移除或莫名其妙地消失了。

如果当时能将这些文章以 pdf 格式保存到本地,待空闲的时候慢慢地看,就不用担心这个问题了。

本文的目标是利用 Google 推出的「puppeteer」,配合无头浏览器爬取某位大佬在简书上发布的所有文章,并对页内元素进行优化样式后,以「pdf」格式保存下载到本地。

2

准 备 工 作

和前面爬虫方式不一样,这次的爬虫是在「Node.js」环境下执行的,所以需要提前安装好 node js。

然后通过 npm 安装「puppeteer」模块。

npm i puppeteer

我这里使用 Chrome 的无头浏览器模式,所以需要提前下载好「chromium」放在本地。

3

分 析 思 路

为了便于观察,首先我们利用 puppeteer 以有头模式启动浏览器。

const browser = await puppeteer.launch({   // 设置false可以看到页面的执行步骤   headless: false,});

再设置好浏览器的大小,然后打开文章列表页面。

BASE_URL = 'https://www.jianshu.com';//文章列表地址
HOME_URL = `${BASE_URL}/u/f46becd1ed83`;const viewport_size = {width: 0,height: 0,};const page = await browser.newPage();//设置浏览器的宽、高
page.setViewport(viewport_size);//打开文章主页
await page.goto(HOME_URL);

由于默认只显示第一页的文章,后面的文章需要多次从下到上的滑动才能加载出来。

这里需要定义一个函数不停的作滑动操作,直到滑动到最底部,待页面所有元素加载完成,才停止滑动。

function autoScroll(page) {return page.evaluate(() => {return new Promise((resolve, reject) => {var totalHeight = 0;var distance = 100;var timer = setInterval(() => {console.log('执行间断函数');var scrollHeight = document.body.scrollHeight;window.scrollBy(0, distance);totalHeight += distance;if (totalHeight >= scrollHeight) {console.log('滑动到底');clearInterval(timer);resolve();}}, 100);})});
}

待所有的文章都加载出来后,就可以通过「eval」函数获取文章元素,然后再通过 css 选择器获取到文章标题和页面地址。

const articles = await page.$eval('.note-list', articles_element => {const article_elements = articles_element.querySelectorAll('li');const articleElementArray = Array.prototype.slice.call(article_elements);return articleElementArray.map(item => {const a_element = item.querySelector('.title');return {href: a_element.getAttribute('href'),title: a_element.innerHTML.trim(),};});
});

获取到所有文章的链接地址之后,就可以通过遍历列表去打开每一篇文章。

for (let article of articles) {const articlePage = await browser.newPage();articlePage.setViewport(viewport_size);articlePage.goto(`${BASE_URL}${article.href}`, {waitUntil: 'networkidle2'});articlePage.waitForSelector('.post');console.log('文章详情页面加载完成');
}

等文章详情页面加载完全后,同样需要滑动页面到最底部,保证当前文章的文字信息、图片都加载完全。

为了保证最后保存的页面的美观性,需要利用「CSS样式」隐藏包含网站顶部、底部、评论、导航条等多余的元素。

await articlePage.$eval('body', body => {body.querySelector('.navbar').style.display = 'none';body.querySelector('#note-fixed-ad-container').style.display = 'none';body.querySelector('.note-bottom').style.display = 'none';body.querySelector('.side-tool').style.display = 'none';// body.querySelector('.author').style.display = 'none';body.querySelector('.meta-bottom').style.display = 'none';body.querySelector('#web-note-ad-1').style.display = 'none';body.querySelector('#comment-list').style.display = 'none';body.querySelector('.follow-detail').style.display = 'none';body.querySelector('.show-foot').style.display = 'none';Promise.resolve();});

最后利用「pdf」函数把当前页面保存为 pdf 格式的文件。

await page.emulateMedia('screen');await articlePage.pdf({path: fileFullPath,format: 'A4'});

需要注意的是,为了保证上面的函数正常的执行,需要修改浏览器打开的方式为无头模式,即:

const browser = await puppeteer.launch({headless: true,});

4

结 果 结 论

通过 node 命令就可以执行这个 js 文件。

node jian_shu.js

由于使用的是无头浏览器执行的,这里除了控制台能显示日志信息,没有任何操作。

待程序执行完毕之后,发现所有的文章都以 pdf 的形式保存到本地了。

我已经将全部源码上传到后台上,公众号回复「 pdf 」即可获得

THANDKS

- End -

爬取某位大佬简书上所有文章并保存为pdf相关推荐

  1. 【爬虫】爬取简书某ID所有文章并保存为pdf

    编辑 / 昱良 1 目 标 场 景 现如今,我们处于一个信息碎片化的信息时代,遇到好的文章都有随手收藏的习惯.但过一段时间,当你想要重新查看这篇文章的时候,发现文章已经被移除或莫名其妙地消失了. 如果 ...

  2. 爬虫36计 之 1.2 爬取文章-简书首页推荐文章

    文章目录 爬取文章-简书首页推荐文章 页面分析 页面源码分析 代码编写 获取第一页的内容 解析第一页面的方法:_parse_li() 获取下一页的方法:_handle_next_page() 实例运行 ...

  3. 爬取笔趣阁小说网站上的所有小说(二)

    爬取笔趣阁小说网站上的所有小说(二) 网址为:https://www.biqukan.cc/topallvisit/1.html 我们已经拿到了所有小说的地址爬取笔趣阁小说网站上的所有小说(一),现在 ...

  4. 简书python_在简书上一起学Python是怎样一种体验

    『Python爬虫小分队』学习群开到第三期,有近百人参加了Python爬虫入门学习,我们采用的方式:简书文章布置作业和进度,微信群答疑和讨论,QQ群.直播平台串讲和辅导,简书专题收作业. 一期二期的作 ...

  5. 爬取笔趣阁小说网站上的所有小说(一)

    爬取笔趣阁小说网站上的所有小说(一) 网址为:https://www.biqukan.cc/topallvisit/1.html 反反爬虫 爬虫首先要做的就是看看目标网址有没有反爬虫手段,一般网站都是 ...

  6. 简书上使用markdown

    Markdown介绍 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. Markdown语法的目标是:成为一种适用于网络的书写语言「 ...

  7. python3.6爬虫案例:爬取某网站所有PPT(上)。

    写在前面   这次实现之前的flag:爬取第一ppt网站的所有PPT,当然网站中有其他很多的学习资料,这次只爬取PPT.不仅可以平时做模板演示用,还可以练习爬虫,岂不美滋滋.闲话不多说,进入正题. 先 ...

  8. 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)...

    [爬虫]利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2) 第一篇( http://blog.itpub.net/26736162/viewspace-22865 ...

  9. 使用await和async关键字开发nodejs应用批量取出简书网站的文章标题和超链接

    ES6的await和async出来已经那么久了,一起来学习一下吧. 还是用我之前的读取某个简书用户所有文章列表的例子. 先看主函数框架: async function downloadArticle( ...

最新文章

  1. 计算机的表格如何加入客标,怎么在电脑上制作入库表格?
  2. vc中载入flash资源
  3. oracle 触发器 merge,如何从触发器中解决Oracle变异错误
  4. 监控延迟严重怎么解决_两个月的蓝白猫掉毛严重怎么办,蓝白掉毛严重怎么解决...
  5. HTML字体小于12谷歌不兼容,Chrome谷歌浏览器下不支持css字体小于12px的解决办法【原创】...
  6. 第5章--高级数据管理
  7. 全球品牌百强榜单出炉:中国品牌仅有华为上榜
  8. 移动APP开发的五个重要步骤
  9. js系列教程12-浏览器存储全解
  10. 如何在 M1 Mac 上运行英特尔应用程序?
  11. 华为NP课程笔记3-OSPF3
  12. 阿里云文本检测 使用教程(Java)
  13. 迅雷,暴风影音,QQ这些软件是什么工具和语言编的?
  14. pyqt界面语言中英文转换
  15. 类似:%u6D59%u6C5F%字符转中文
  16. 【POJ No. 3294】星际迷航 Life Forms
  17. Android-2-控件使用
  18. python3版本升级和系统更新_如何更新mac系统自带的python版本到最新3.3
  19. Android解决输入法自动弹出方法大全
  20. 敏感词过滤程序编写敏感词过滤程序

热门文章

  1. C++性能优化(十二)——自旋锁
  2. 静态路由,缺省路由和默认网关的区别
  3. 扣血抖动和FPS显示
  4. Jboot初遇activiti
  5. 【Unity入门教程】 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】
  6. 1907 Problem A 吃糖果
  7. 为什么要做小程序?90%的商家不知道的好处!
  8. Jumpserver界面设置及界面功能
  9. 23年 车辆检测+车距检测+行人检测+车辆识别+车距预测(附yolo v5最新版源码)
  10. python车牌识别系统抬杆_车牌识别系统识别到道闸不抬杆是什么问题?