博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一键下载:将知乎专栏导出成电子书
阅读量:7071 次
发布时间:2019-06-28

本文共 1938 字,大约阅读时间需要 6 分钟。

老是有同学问,学了 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标签和 `、highlight">

url = 'https://zhuanlan.zhihu.com/p/' + idhtml = requests.get(url, headers=headers).textsoup = 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 的工具,需要单独安装,具体可参考它的官网介绍。

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

pip install pdfkit

使用起来很简单:

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

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

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

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

【源码下载】

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

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

════

其他文章及回答:

| | | | | | | | | |

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

转载地址:http://mghll.baihongyu.com/

你可能感兴趣的文章
阿里Q2财报:阿里云季度营收达30亿,领先优势持续扩大
查看>>
聚集索引,非聚集索引,唯一索引,索引视图
查看>>
云计算不敷物联网时代所需 “雾计算”应运而生
查看>>
金融安全资讯精选 2017年第十一期 银行木马利用VMvare进行传播 研究人员发现新型安卓银行木马Red Alert...
查看>>
路由器长期开着可以吗?不关有什么危害吗?
查看>>
这是我看过的最牛的编码套路,给大家分享下
查看>>
阿里云数据库挑战赛"SQL优化大师"获奖案例
查看>>
PSR-3
查看>>
表格存储如何实现高可靠和高可用
查看>>
初探JavaScript——JS另类的作用域和声明提前
查看>>
基于安卓系统的5款录音App
查看>>
Pinterest开源Kafka集群自愈和工作负载均衡工具:DoctorKafka
查看>>
英伟达推出信用卡大小的“超级计算机” 旨在实现便携式AI
查看>>
深度剖析俄罗斯黑客组织APT29的后门
查看>>
九月揭幕,上海再迎云计算“干货”盛筵
查看>>
前雅虎CTO:Hadoop扩展过程中的7个危险信号
查看>>
阿里Q2财报:云计算增速106%超越亚马逊
查看>>
C#中Dictionary的内部实现剖析
查看>>
再潮的技术也离不开数据—2017关于数据的三个趋势
查看>>
如何使用SIOC存储策略优化负载性能?
查看>>