抓取网页生成电子书(通过Python和爬虫,可以完成怎样的小工具?|知乎 )
优采云 发布时间: 2021-12-29 12:13抓取网页生成电子书(通过Python和爬虫,可以完成怎样的小工具?|知乎
)
总是有同学问我在学习了Python基础知识后是否不知道我可以做些什么来改进。今天我就用一个小例子来告诉大家通过Python和爬虫可以完成什么样的小工具。
在知乎上,你一定关注过一些不错的专栏(比如Crossin的编程课堂)。但如果有一天,你最喜欢的受访者在网上被喷,你一怒之下删帖,停止更新,你就看不到这些好内容了。虽然这是小概率事件(还没有发生),但你可以准备下雨天。您可以将关注的专栏导出到电子书,这样您就可以离线阅读,而不必担心不小心删除帖子。
只需要工具和源码的可以拉到文章底部获取代码。
【最终效果】
运行程序,输入列的id,即网页地址上的路径:
之后,程序会自动抓取栏目内的文章,并根据发表时间合并导出为pdf文件。
【实现思路】
本方案主要分为三部分:
爬取专栏文章地址列表 爬取每篇文章的详细内容导出PDF 1. 爬取列表
上一篇爬虫必备工具,掌握了它就可以解决介绍如何分析网页请求的一半问题。根据方法,我们可以使用开发者工具的Network功能,找出栏目页面的请求,获取明细列表:
https://www.zhihu.com/api/v4/columns/crossin/articles
观察返回的结果,我们发现通过next和is_end的值,可以得到下一个列表请求的地址(相当于页面向下滚动的触发效果),判断是否拿到了所有的文章。
data中的id、title、url就是我们需要的数据。因为url可以用id拼写出来,所以没有保存在我们的代码中。
使用 while 循环直到所有文章的 id 和标题都被提取并保存在文件中。
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的工具,需要单独安装。详情请参阅其官方网站。
pdfkit 是为此工具打包的 Python 库,可以从 pip 安装:
pip install pdfkit
使用起来非常简单:
# 获取htmls文件名列表(略)
pdfkit.from_file(sorted(htmls), 'zhihu.pdf')
这样就完成了整列的导出。
不仅是知乎专栏,几乎大部分的资讯网站都是通过1.抓取列表和2.抓取详细内容这两个步骤来采集
数据的。所以这个代码只要稍加修改就可以在许多其他网站上使用。只是有些网站需要登录后才能访问,所以需要在headers中设置cookie信息。另外,不同网站的请求接口、参数、限制都不一样,所以具体问题还是要具体问题具体分析。
这些爬虫的开发技巧可以在我们的爬虫实战课中学习。需要的请回复公众号中的实际爬虫
【源码下载】
获取知乎专栏下载器源码请在公众号回复知乎关键词(Crossin的编程课堂)
除了代码,还有本专栏打包好的PDF,欢迎阅读分享。
====
其他文章和答案:
欢迎搜索关注:Crossin的编程课堂