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示例)