写爬虫似乎没有比用 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 是网页的正文内容。用 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 解析出来。采用同样的方式,找到 左侧菜单标签

具体代码实现逻辑:因为页面上有两个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” 免费下载阅读。

本文首发于公众号『一个程序员的微站』(id:VTtalk),分享 Python 干货和有温度的内容

博客地址:https://foofish.net/python-crawler-html2pdf.html

廖雪峰python教程pdf-爬虫:把廖雪峰的教程转换成 PDF 电子书相关推荐

  1. jpg转换成pdf格式?怎么把图片jpg转换成pdf格式?

    jpg转换成pdf格式?怎么把图片jpg转换成pdf格式?有时候我们需要把图片转成pdf.可能还有些小伙伴不知道怎么去完成这项转换的,图片转pdf其实很简单,下面给大家分享一个简单把图片转pdf的方法 ...

  2. python怎么变成文档_python3如何将docx转换成pdf文件

    本文实例为大家分享了python3将docx转换成pdf文件的具体代码,供大家参考,具体内容如下 直接上代码 # -*- encoding:utf-8 -*- """ a ...

  3. word转换成pdf java代码_java代码实现word转换成pdf

    [实例简介] va代码 word转pdf ,word批量转换成pdf,word单独转换成pdf,只需要调用WordToPDFUtil方法就可以实现批量或者单独转换 [实例截图] [核心代码] e6f6 ...

  4. axure8.0导出页面打不开问题_excel怎么转pdf?excel打不开?转换成PDF就行了

    excel转pdf怎么做?年底最后一天了,我都被一堆的Excel文件搞得头疼,在这些时间里,要让我对几个G的文件进行操作,我已经是忙得不可开交,而在最后的最后,我的主管还说他的电脑无法打开我的Exce ...

  5. jpg格式图片怎么转换成pdf格式?如何把jpg图片转换成pdf格式文档?

    把图片转换为pdf的软件?什么软件可以把图片转换成pdf格式?有时候我们需要把图片转成pdf.可能还有些小伙伴不知道怎么去完成这项转换的,图片转pdf其实很简单,下面给大家分享一把图片转成pdf的简单 ...

  6. itext html转pdf 图片,itext2.0.8 将 HTML 转换成 PDF, 完美 CSS, 带图片, 自动分页

    itext2.0.8 将 HTML 转换成 PDF, 完美 CSS, 带图片, 自动分页 之前用 itext7 将 html 导出为 PDF, 比较方便, 代码较少, 而且支持 base64 的图片. ...

  7. excel中html批量转化为pdf文件,如何将大量的Excel转换成PDF?

    大家都知道Excel表,最怕别人修改了,尤其是数据.一旦修改,可能就会有麻烦.那如何是好呢?有一个最简单的办法就是把Excel转换成PDF文件,这样别人只能阅读不能编辑,就不用担心被修改了,哈哈~下面 ...

  8. 【Python】comtypes模块Windows环境下使用批量转换成PDF文件

    最近在微信看到一篇文章介绍说批量将ppt文件转化为pdf文件,自己尝试了一下,后面想能否自己封装一个类,既能将ppt转换为pdf,而且能够将word转换为pdf,或者其他类型转化为pdf.花了半天时间 ...

  9. 如何将jpg转换成PDF转换器教程

    jpg转换成PDF转换器是将PDF文档中的文字.图片.表格.注释等文档元素完整保的一种标准电子文档格式,如果要将JPG图片转换到PDF文档中,有没有好的方法呢?普通的 JPG转PDF转换器不具备良好的 ...

  10. jpg转换成PDF详细教程

    PDF转换器是将PDF文档中的文字.图片.表格.注释等文档元素完整保的一种标准电子文档格式,如果要将JPG图片转换到PDF文档中,有没有好的方法呢?普通的 JPG转换成PDF转换器 不具备良好的的图像 ...

最新文章

  1. 优雅处理你的Java异常
  2. java单元测试总结
  3. 转发高人文章:以前写的一些有关代码签名/时间戳数字证书的东东
  4. 雷蛇鼠标宏文件_Razer推出DeathAdder V2与Basilisk V2游戏鼠标
  5. koa --- 使用koa-multer和element-ui组件上传头像
  6. java 正则 实例_Java正则表达式示例
  7. HDU4857 逃生【拓扑排序】
  8. 字符串startswith_Python字符串startswith()
  9. spring mvc组件以及架构流程详解
  10. Java二叉树数据结构原理
  11. Dual Thrust(期货)
  12. FPGA两片RAM的乒乓操作
  13. Ubuntu 22.04 LTS apt-get update 报 Key is stored in legacy trusted.gpg keyring 警告解决方案
  14. gpib-usb-hs linux,美国NI GPIB-USB-HS+连接线GPIB转USB接口控制器高速传输
  15. coso全称是什么_京东方全称是什么
  16. 在Word中撰写论文插入MathType公式,使得公式居中编号右对齐教程
  17. 阿里云windows服务器配置环境以及发布项目
  18. Transformer拿下CV顶会大奖,微软亚研获ICCV 2021最佳论文
  19. 常用的Linux命令.cmd
  20. 使用Python玩转ROS2参数

热门文章

  1. 公有云厂商DDoS防护产品竞品分析——内含CC的一些简单分析,貌似多是基于规则,CC策略细粒度ip/url//ua/refer...
  2. Vim 删除不包含指定字符串的行及统计匹配个数
  3. centos6 升级gcc / 无法识别的命令行选项“-std=gnu++1y”的解决办法
  4. Mysql8.0.16 only_full_group_by
  5. 23种设计模式中的蝇量(享元)模式
  6. 微软家浏览器挺有意思,大家体会一下
  7. __tostring和__invoke 方法
  8. 05. 取SQL分组中的某几行数据
  9. ios UI自动化测试
  10. 《深入Linux设备驱动程序内核机制》中的mmap_demo.c例程