一键下载:将知乎专栏导出成电子书

老是有同学问,学了 Python 基础后不知道可以做点什么来提高。今天就再用个小例子,给大家讲讲,通过 Python爬虫,可以完成怎样的小工具。

在知乎上,你一定关注了一些不错的专栏(比如 Crossin的编程教室

)。但万一有那么一天,你喜欢的答主在网上被人喷了,一怒之下删帖停更,这些好内容可就都看不到了。尽管这是小概率事件(可也不是没发生过),但未雨绸缪,你可以把关注的专栏导出成电子书,这样既可以离线阅读,又不怕意外删帖了。

只是需要工具和源码的可以拉到文章底部获取代码。

【最终效果】

运行程序,输入专栏的 id,也就是网页地址上的路径:

之后程序便会自动抓取专栏中的文章,并按发布时间合并导出为 pdf 文件。

【实现思路】

这个程序主要分为三个部分:

  1. 抓取专栏文章地址列表
  2. 抓取每一篇文章的详细内容
  3. 导出 PDF

1. 抓取列表

在之前的文章 爬虫必备工具,掌握它就解决了一半的问题 中介绍过如何分析一个网页上的请求。按照其中的方法,我们可以通过开发者工具Network 功能找出专栏页面获取详细列表的请求:

https://www.zhihu.com/api/v4/columns/crossin/articles

观察返回结果中发现,通过 nextis_end 的值,我们能获取下一次列表请求的地址(相当于向下滚动页面的触发效果)以及判断是否已经拿到所有文章。

data 中的 idtitleurl 就是我们需要的数据。因为 url 可以通过 id 拼出,所以我们的代码里未保存它。

使用一个 while 循环,直到抓取完所有文章的 idtitle,保存在文件中。

while True:
    resp = requests.get(url, headers=headers)
    j = resp.json()
    data = j['data']
    for article in data:
        # 保存id和title(略)
    if j['paging']['is_end']:
        break
    url = j['paging']['next']
    # 按 id 排序(略)
    # 导入文件(略)

2. 抓取文章

有了所有文章的 id / url,后面的抓取就很简单了。文章主体内容就在 Post-RichText 的标签中。

需要稍微花点功夫的是一些文本上的处理,比如原页面的图片效果,会加上 noscript 标签和 data-actualsrc="data:image 这样的属性,我们为了正常显示得把它们去掉。

url = 'https://zhuanlan.zhihu.com/p/' + id
html = requests.get(url, headers=headers).text
soup = BeautifulSoup(html, 'lxml')
content = soup.find(class_='Post-RichText').prettify()
# 对content做处理(略)
with open(file_name, 'w') as f:
    f.write(content)

到这一步,就已经完成了所有内容的抓取,可以在本地阅读了。

3. 导出 PDF

为了更便于阅读,我们使用 wkhtmltopdf + pdfkit,将这些 HTML 文件打包成 PDF。

wkhtmltopdf 是一个 HTML 转 PDF 的工具,需要单独安装,具体可参考它的官网介绍。

  • https://wkhtmltopdf.org/downloads.html
  • https://github.com/JazzCore/python-pdfkit/wiki/Installing-wkhtmltopdf

pdfkit 是对此工具封装的 Python 库,可从 pip 安装:

pip install pdfkit

使用起来很简单:

# 获取htmls文件名列表(略)
pdfkit.from_file(sorted(htmls), 'zhihu.pdf')

这样就完成了整个专栏导出。

不仅是知乎专栏,几乎大多数信息类网站,都是通过 1.抓取列表 2.抓取详细内容 这两个步骤来采集数据。因此这个代码稍加修改,即可用在很多别的网站上。只不过有些网站需登录后访问,那么就需要对 headers 里的 cookie 信息进行设置。此外,不同网站的请求接口、参数、限制都不尽相同,所以还是要具体问题具体分析。

关于这些爬虫的开发技巧,都可以在我们的 爬虫实战 课程中学到。有需要的请在公众号里回复 爬虫实战

【源码下载】

获取知乎专栏下载器源码,请在公众号(Crossin的编程教室)里回复关键字 知乎

除了代码外,本专栏打包好的 PDF 也一并奉上,欢迎阅读与分享。

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2018-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java工会

你应该关注的几个Eclipse超酷插件

1.4K20
来自专栏与神兽党一起成长

Webservice On Netty

Java的世界属于开源的世界,所谓开源的世界,只要你能想到的点子就一定有人实现了,没有你就自己造一个啊。

16820
来自专栏云瓣

[译] 所有你需要知道的关于完全理解 Node.js 事件循环及其度量

原文地址:All you need to know to really understand the Node.js Event Loop and its Me...

301110
来自专栏用户2442861的专栏

java系统高并发解决方案之图片服务器分离

http://blog.csdn.net/jimmy609/article/details/37909013

95320
来自专栏SeanCheney的专栏

《Python分布式计算》 第7章 测试和调试分布式应用 (Distributed Computing with Python)概述常见错误——时钟和时间常见错误——软件环境常见问题——许可和环境常见

无论大小的分布式应用,测试和调试的难度都非常大。因为是分布在网络中的,各台机器可能十分不同,地理位置也可能不同。 进一步的,使用的电脑可能有不同的用户账户、不同...

27050
来自专栏GA小站

UTM参数使用30问——既UTM参数使用指南(2018)

有很多缺少Google Analytics的UTM参数而导致的跟踪错误案例,我在Google Analytics Community和 Quora 看到过成千上...

42320
来自专栏人工智能

如何构建智能反垃圾邮件WordPress插件

在本文中,我们将看到我们如何构建一个使用机器学习来阻止垃圾邮件,成人邮件,甚至是负面评论的WordPress插件。该插件与WordPress 3.6v或更高版本...

343100
来自专栏腾讯移动品质中心TMQ的专栏

流量都去哪儿了 —— 三板斧搞定Android网络流量测试

流量是什么? 为什么要进行流量测试? 流量测试方法有哪些? 怎么统计流量并进行结果分析? 带着这些疑问,小编带您探寻Android网络流量的测试方法。 1 ...

50960
来自专栏Python爬虫与数据挖掘

手把手教你安装Navicat——靠谱的Navicat安装教程

 Navicat是一款轻量级的用于MySQL连接和管理的工具,非常好用,使用起来方便,简洁。下面讲讲其安装的过程。

25640
来自专栏编程

八个技巧,提高Web前端性能

1. 优化 CSS 性能 CSS,即级联样式表,能从 HTML 描述的内容生成专业而又整洁的文件。很多 CSS 需要通过 HTTP 请求来引入(除非使用内联 C...

237100

扫码关注云+社区

领取腾讯云代金券