资讯专栏INFORMATION COLUMN

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

ivyzhang / 1615人阅读

摘要:在知乎上,你一定关注了一些不错的专栏比如的编程教室。有需要的请在公众号里回复爬虫实战源码下载获取知乎专栏下载器源码,请在公众号的编程教室里回复关键字知乎除了代码外,本专栏打包好的也一并奉上,欢迎阅读与分享。

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

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

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

【最终效果】

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

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

【实现思路】

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

抓取专栏文章地址 列表

抓取每一篇文章的 详细内容

导出 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标签和 `、highlight">


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 也一并奉上,欢迎阅读与分享。

════

其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 人工智能 | 嘻哈 | 爬虫 | 我用Python | 高考 | requests | AI平台

欢迎搜索及关注: Crossin的编程教室

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42477.html

相关文章

  • 程序员的一些常用技能点

    摘要:其他笔记还有一些其他的主流云笔记软件,像印象笔记,为知笔记,等,由于没有多做尝试,就不加以评价年最好用的云笔记软件推荐介绍是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。 目录: [TOC] Git Git介绍: Git是目前世界上最先进的分布式版本控制系统(没有之一),简单来说,Git 是一个管理你的「代码的历史记录」的工具。 Gi...

    baishancloud 评论0 收藏0
  • 2017-06-24 前端日报

    摘要:前端日报精选带来的困惑知乎专栏推送技术之难,真的远超我们想象奇舞周刊第期深度学习助力前端开发中的回调众成翻译荐官方译文和框架源码版掘金中文笔记事件委托即事件代理知识点第期掌握缓存从请求到响应过程的一切下译行代码撸一个阴阳八卦 2017-06-24 前端日报 精选 This 带来的困惑 - 知乎专栏HTTP/2推送技术之难,真的远超我们想象奇舞周刊第215期:深度学习助力前端开发Java...

    Anshiii 评论0 收藏0
  • 2017-07-05 前端日报

    摘要:前端日报精选你可能不知道的前端知识点译在服务端渲染的实现掘金小前端创建或文件并浏览器导出下载张鑫旭鑫空间鑫生活代理服务器浅析知乎专栏快速打造简易高效的配置掘金中文译组件解耦之道枫上雾棋的日志第期什么样的工程师才能算老司机 2017-07-05 前端日报 精选 你可能不知道的前端知识点[译] React 在服务端渲染的实现 - 掘金小tip:JS前端创建html或json文件并浏览器导出...

    ISherry 评论0 收藏0
  • 简单三步,用 Python 发邮件

    摘要:使用脚本发送邮件并不复杂。以下为思路导图模块与发送邮件相关的模块是关于简单邮件传输协议的操作模块,在发送邮件的过程中起到服务器之间互相通信的作用。 0. 前言 发送电子邮件是个很常见的开发需求。比如你写了个监控天气的脚本,发现第二天要下雨,或者网站上关注的某个商品降价了,就可以发个邮件到邮箱来提醒自己。 使用 Python 脚本发送邮件并不复杂。不过由于各家邮件的发送机制和安全策略不同...

    haobowd 评论0 收藏0

发表评论

0条评论

ivyzhang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<