python爬虫实现教程转换成 PDF 电子书
发布时间 - 2026-01-10 23:09:24 点击率:次写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 Python 教程 爬下来做成 PDF 电子书方便大家离线阅读。

开始写爬虫前,我们先来分析一下该网站1的页面结构,网页的左侧是教程的目录大纲,每个 URL 对应到右边的一篇文章,右侧上方是文章的标题,中间是文章的正文部分,正文内容是我们关心的重点,我们要爬的数据就是所有网页的正文部分,下方是用户的评论区,评论区对我们没什么用,所以可以忽略它。
工具准备
弄清楚了网站的基本结构后就可以开始准备爬虫所依赖的工具包了。requests、beautifulsoup 是爬虫两大神器,reuqests 用于网络请求,beautifusoup 用于操作 html 数据。有了这两把梭子,干起活来利索,scrapy 这样的爬虫框架我们就不用了,小程序派上它有点杀鸡用牛刀的意思。此外,既然是把 html 文件转为 pdf,那么也要有相应的库支持, wkhtmltopdf 就是一个非常好的工具,它可以用适用于多平台的 html 到 pdf 的转换,pdfkit 是 wkhtmltopdf 的Python封装包。首先安装好下面的依赖包,
接着安装 wkhtmltopdf
pip install requests pip install beautifulsoup pip install pdfkit
安装 wkhtmltopdf
Windows平台直接在 wkhtmltopdf 官网2下载稳定版的进行安装,安装完成之后把该程序的执行路径加入到系统环境 $PATH 变量中,否则 pdfkit 找不到 wkhtmltopdf 就出现错误 “No wkhtmltopdf executable found”。Ubuntu 和 CentOS 可以直接用命令行进行安装
$ sudo apt-get install wkhtmltopdf # ubuntu $ sudo yum intsall wkhtmltopdf # centos
爬虫实现
一切准备就绪后就可以上代码了,不过写代码之前还是先整理一下思绪。程序的目的是要把所有 URL 对应的 html 正文部分保存到本地,然后利用 pdfkit 把这些文件转换成一个 pdf 文件。我们把任务拆分一下,首先是把某一个 URL 对应的 html 正文保存到本地,然后找到所有的 URL 执行相同的操作。
用 Chrome 浏览器找到页面正文部分的标签,按 F12 找到正文对应的 div 标签: <div >,该 div 是网页的正文内容。用 requests 把整个页面加载到本地后,就可以使用 beautifulsoup 操作 HTML 的 dom 元素 来提取正文内容了。
具体的实现代码如下:用 soup.find_all 函数找到正文标签,然后把正文部分的内容保存到 a.html 文件中。
def parse_url_to_html(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, "html5lib")
body = soup.find_all(class_="x-wiki-content")[0]
html = str(body)
with open("a.html", 'wb') as f:
f.write(html)
第二步就是把页面左侧所有 URL 解析出来。采用同样的方式,找到 左侧菜单标签 <ul >
具体代码实现逻辑:因为页面上有两个uk-nav uk-nav-side的 class 属性,而真正的目录列表是第二个。所有的 url 获取了,url 转 html 的函数在第一步也写好了。
def get_url_list():
"""
获取所有URL目录列表
"""
response = requests.get("http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000")
soup = BeautifulSoup(response.content, "html5lib")
menu_tag = soup.find_all(class_="uk-nav uk-nav-side")[1]
urls = []
for li in menu_tag.find_all("li"):
url = "http://www.liaoxuefeng.com" + li.a.get('href')
urls.append(url)
return urls
最后一步就是把 html 转换成pdf文件了。转换成 pdf 文件非常简单,因为 pdfkit 把所有的逻辑都封装好了,你只需要调用函数 pdfkit.from_file
def save_pdf(htmls):
"""
把所有html文件转换成pdf文件
"""
options = {
'page-size': 'Letter',
'encoding': "UTF-8",
'custom-header': [
('Accept-Encoding', 'gzip')
]
}
pdfkit.from_file(htmls, file_name, options=options)
执行 save_pdf 函数,电子书 pdf 文件就生成了,效果图:
总结
总共代码量加起来不到50行,不过,且慢,其实上面给出的代码省略了一些细节,比如,如何获取文章的标题,正文内容的 img 标签使用的是相对路径,如果要想在 pdf 中正常显示图片就需要将相对路径改为绝对路径,还有保存下来的 html 临时文件都要删除,这些细节末叶都放在github上。
完整代码可以上github下载 ,代码在 Windows 平台亲测有效,欢迎 fork 下载自己改进。github 地址3,GitHub访问不了的同学可以用码云4, 《廖雪峰的 Python 教程》电子书 PDF 文件可以通过关注本公众号『一个程序员的微站』回复 “pdf” 免费下载阅读。
# python爬虫电子书
# python实现网络爬虫
# python实现爬虫
# Python3转换html到pdf的不同解决方案
# python3如何将docx转换成pdf文件
# python将html转成PDF的实现代码(包含中文)
# Python 将pdf转成图片的方法
# python使用reportlab实现图片转换成pdf的方法
# python批量实现Word文件转换为PDF文件
# Python实现批量把SVG格式转成png、pdf格式的代码分享
# windows下Python实现将pdf文件转化为png格式图片的方法
# 用python 制作图片转pdf工具
# Python中使用PyQt把网页转换成PDF操作代码实例
# Python使用到第三方库PyMuPDF图片与pdf相互转换
# Python3将jpg转为pdf文件的方法示例
# 就可以
# 好了
# 可以用
# 转换成
# 的是
# 离线
# 文件转换成
# 让你
# 放在
# 都要
# 也要
# 就不
# 找不到
# 且慢
# 适用于
# 上有
# 杀鸡
# 要把
# 可以通过
# 用了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在建站之星网店版论坛获取技术支持?
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
个人摄影网站制作流程,摄影爱好者都去什么网站?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
js实现获取鼠标当前的位置
网站制作软件有哪些,制图软件有哪些?
详解jQuery中基本的动画方法
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何基于云服务器快速搭建网站及云盘系统?
HTML 中动态设置元素 name 属性的正确语法详解
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
微信小程序 闭包写法详细介绍
如何在IIS中新建站点并配置端口与IP地址?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel如何使用查询构建器?(Query Builder高级用法)
如何快速搭建安全的FTP站点?
Linux后台任务运行方法_nohup与&使用技巧【技巧】
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
原生JS实现图片轮播切换效果
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
北京网站制作公司哪家好一点,北京租房网站有哪些?
Laravel模型事件有哪些_Laravel Model Event生命周期详解
如何在IIS中配置站点IP、端口及主机头?
Android滚轮选择时间控件使用详解
详解阿里云nginx服务器多站点的配置
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
用v-html解决Vue.js渲染中html标签不被解析的问题
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
如何注册花生壳免费域名并搭建个人网站?
在centOS 7安装mysql 5.7的详细教程
怎么用AI帮你为初创公司进行市场定位分析?
高防服务器租用如何选择配置与防御等级?
如何快速搭建高效香港服务器网站?
Laravel如何优化应用性能?(缓存和优化命令)
如何用景安虚拟主机手机版绑定域名建站?
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
怎样使用JSON进行数据交换_它有什么限制
Laravel如何编写单元测试和功能测试?(PHPUnit示例)

