搜索
热搜: 活动
Hi~登录注册
查看: 2459|回复: 20

一键下载:将逍遥专栏导出成电子书

[复制链接]

1万

主题

1万

帖子

2万

积分

商家B

Rank: 6Rank: 6

积分
29234
发表于 2022-10-9 20:47:37 | 显示全部楼层 |阅读模式 来自: 中国北京
老是有同学问,学了 Python 基础后不知道可以做点什么来提高。今天就再用个小例子,给大家讲讲,通过 Python爬虫,可以完成怎样的小工具。

在逍遥上,你一定关注了一些不错的专栏(比如 Crossin的编程教室 )。但万一有那么一天,你喜欢的答主在网上被人喷了,一怒之下删帖停更,这些好内容可就都看不到了。尽管这是小概率事件(可也不是没发生过),但未雨绸缪,你可以把关注的专栏导出成电子书,这样既可以离线阅读,又不怕意外删帖了。
只是需要工具和源码的可以拉到文章底部获取代码。
【最终效果】

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




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


【实现思路】

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

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

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

观察返回结果中发现,通过 next 和 is_end 的值,我们能获取下一次列表请求的地址(相当于向下滚动页面的触发效果)以及判断是否已经拿到所有文章。
而 data 中的 id、title、url 就是我们需要的数据。因为 url 可以通过 id拼出,所以我们的代码里未保存它。


使用一个 while 循环,直到抓取完所有文章的 id 和 title,保存在文件中。
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-actual、src="data:image 这样的属性,我们为了正常显示得把它们去掉。
url = 'https://zhuanlan.逍遥.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), '逍遥.pdf')

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

不仅是逍遥专栏,几乎大多数信息类网站,都是通过 1.抓取列表 2.抓取详细内容 这两个步骤来采集数据。因此这个代码稍加修改,即可用在很多别的网站上。只不过有些网站需登录后访问,那么就需要对 headers 里的 cookie 信息进行设置。此外,不同网站的请求接口、参数、限制都不尽相同,所以还是要具体问题具体分析。
关于这些爬虫的开发技巧,都可以在我们的 爬虫实战 课程中学到。有需要的请在公众号里回复 爬虫实战
【源码下载】

获取逍遥专栏下载器源码,请在公众号(Crossin的编程教室)里回复关键字 逍遥
除了代码外,本专栏打包好的 PDF 也一并奉上,欢迎阅读与分享。


════
其他文章及回答:
如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 人工智能 | 嘻哈 | 爬虫 | 我用Python | 高考 | requests | AI平台
欢迎搜索及关注:Crossin的编程教室

文章来源于网络,如有侵权,请联系我们小二删除,どうもで~す!
回复

使用道具 举报

0

主题

1750

帖子

2928

积分

中学一

Rank: 9Rank: 9Rank: 9

积分
2928
发表于 2022-10-9 20:48:55 | 显示全部楼层 来自: 中国北京
一直都在网上看在线的教程,一直想把这些教程做成pdf,一个个复制太麻烦了,刚好就看到这篇文章了,我学python的动力又来了!
回复

使用道具 举报

0

主题

1758

帖子

2931

积分

中学一

Rank: 9Rank: 9Rank: 9

积分
2931
发表于 2022-10-9 20:51:47 | 显示全部楼层 来自: 中国云南昆明
专栏文章一多,仿爬机制就开始了,希望加个异常
回复

使用道具 举报

0

主题

1763

帖子

3019

积分

中学一

Rank: 9Rank: 9Rank: 9

积分
3019
发表于 2022-10-9 20:52:12 | 显示全部楼层 来自: 中国
倒不一定是反爬,是知乎对某些文章需要登录后才能查看,目测是跟敏感词有关
回复

使用道具 举报

0

主题

1808

帖子

3028

积分

中学一

Rank: 9Rank: 9Rank: 9

积分
3028
发表于 2022-10-9 20:55:17 | 显示全部楼层 来自: 中国北京
如果不想手动改代码,可以直接从列表里把失败的文章删掉
回复

使用道具 举报

0

主题

1690

帖子

2850

积分

中学一

Rank: 9Rank: 9Rank: 9

积分
2850
发表于 2022-10-9 20:58:02 | 显示全部楼层 来自: 中国北京
真好,正好需要为专栏做个目录导航
回复

使用道具 举报

0

主题

1750

帖子

2928

积分

中学一

Rank: 9Rank: 9Rank: 9

积分
2928
发表于 2022-10-9 21:00:02 | 显示全部楼层 来自: 中国北京
Crossin老师,经常给大家福利了,非常感谢!!
回复

使用道具 举报

0

主题

1844

帖子

3205

积分

中学一

Rank: 9Rank: 9Rank: 9

积分
3205
发表于 2022-10-9 21:02:52 | 显示全部楼层 来自: 中国上海
试了下coolbrain这个专栏,报错。。
回复

使用道具 举报

0

主题

1818

帖子

3081

积分

中学一

Rank: 9Rank: 9Rank: 9

积分
3081
发表于 2022-10-9 21:04:52 | 显示全部楼层 来自: 中国北京
知乎有少量文章要登录才可见。刚更新了代码,加了一个异常处理,跳过这些。
回复

使用道具 举报

0

主题

1763

帖子

3019

积分

中学一

Rank: 9Rank: 9Rank: 9

积分
3019
发表于 2022-10-9 21:06:13 | 显示全部楼层 来自: 中国北京
虽然我大部分时候都用onenote来解决问题
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 立即注册

快速回复 返回顶部 返回列表