爬取某位大佬简书上所有文章并保存为pdf
点击上方“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相关推荐
- 【爬虫】爬取简书某ID所有文章并保存为pdf
编辑 / 昱良 1 目 标 场 景 现如今,我们处于一个信息碎片化的信息时代,遇到好的文章都有随手收藏的习惯.但过一段时间,当你想要重新查看这篇文章的时候,发现文章已经被移除或莫名其妙地消失了. 如果 ...
- 爬虫36计 之 1.2 爬取文章-简书首页推荐文章
文章目录 爬取文章-简书首页推荐文章 页面分析 页面源码分析 代码编写 获取第一页的内容 解析第一页面的方法:_parse_li() 获取下一页的方法:_handle_next_page() 实例运行 ...
- 爬取笔趣阁小说网站上的所有小说(二)
爬取笔趣阁小说网站上的所有小说(二) 网址为:https://www.biqukan.cc/topallvisit/1.html 我们已经拿到了所有小说的地址爬取笔趣阁小说网站上的所有小说(一),现在 ...
- 简书python_在简书上一起学Python是怎样一种体验
『Python爬虫小分队』学习群开到第三期,有近百人参加了Python爬虫入门学习,我们采用的方式:简书文章布置作业和进度,微信群答疑和讨论,QQ群.直播平台串讲和辅导,简书专题收作业. 一期二期的作 ...
- 爬取笔趣阁小说网站上的所有小说(一)
爬取笔趣阁小说网站上的所有小说(一) 网址为:https://www.biqukan.cc/topallvisit/1.html 反反爬虫 爬虫首先要做的就是看看目标网址有没有反爬虫手段,一般网站都是 ...
- 简书上使用markdown
Markdown介绍 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. Markdown语法的目标是:成为一种适用于网络的书写语言「 ...
- python3.6爬虫案例:爬取某网站所有PPT(上)。
写在前面 这次实现之前的flag:爬取第一ppt网站的所有PPT,当然网站中有其他很多的学习资料,这次只爬取PPT.不仅可以平时做模板演示用,还可以练习爬虫,岂不美滋滋.闲话不多说,进入正题. 先 ...
- 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)...
[爬虫]利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2) 第一篇( http://blog.itpub.net/26736162/viewspace-22865 ...
- 使用await和async关键字开发nodejs应用批量取出简书网站的文章标题和超链接
ES6的await和async出来已经那么久了,一起来学习一下吧. 还是用我之前的读取某个简书用户所有文章列表的例子. 先看主函数框架: async function downloadArticle( ...
最新文章
- 计算机的表格如何加入客标,怎么在电脑上制作入库表格?
- vc中载入flash资源
- oracle 触发器 merge,如何从触发器中解决Oracle变异错误
- 监控延迟严重怎么解决_两个月的蓝白猫掉毛严重怎么办,蓝白掉毛严重怎么解决...
- HTML字体小于12谷歌不兼容,Chrome谷歌浏览器下不支持css字体小于12px的解决办法【原创】...
- 第5章--高级数据管理
- 全球品牌百强榜单出炉:中国品牌仅有华为上榜
- 移动APP开发的五个重要步骤
- js系列教程12-浏览器存储全解
- 如何在 M1 Mac 上运行英特尔应用程序?
- 华为NP课程笔记3-OSPF3
- 阿里云文本检测 使用教程(Java)
- 迅雷,暴风影音,QQ这些软件是什么工具和语言编的?
- pyqt界面语言中英文转换
- 类似:%u6D59%u6C5F%字符转中文
- 【POJ No. 3294】星际迷航 Life Forms
- Android-2-控件使用
- python3版本升级和系统更新_如何更新mac系统自带的python版本到最新3.3
- Android解决输入法自动弹出方法大全
- 敏感词过滤程序编写敏感词过滤程序