声明:本文仅供学习参考,切忌用于其它用途,爬的过程中注意控制请求速度,以免给服务器带来过多的压力

写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天尝试写一个爬虫,将廖雪峰老师的 Python 教程爬下来做成 PDF 电子书方便离线阅读。

开始写爬虫前,我们先来分析一下网站的页面结构,网页的左侧是教程的目录大纲,每个 URL 对应到右边的一篇文章,右侧上方是文章的标题,中间是文章的正文部分,正文内容是我们关心的重点,我们要爬的数据就是所有网页的正文部分,下方是用户的评论区,评论区对我们没什么用,所以可以忽略它。

工具准备

弄清楚了网站的基本结构后就可以开始准备爬虫所依赖的工具包了。requests、beautifulsoup 是爬虫两大神器,reuqests 用于网络请求,beautifusoup 用于操作 html 数据。有了这两把梭子,干起活来利索,scrapy 这样的爬虫框架我们就不用了,小程序派上它有点杀鸡用牛刀的意思。此外,既然是把 html 文件转为 pdf,那么也要有相应的库支持, wkhtmltopdf 就是一个非常好的工具,它可以用适用于多平台的 html 到 pdf 的转换,pdfkit 是 wkhtmltopdf 的Python封装包。首先安装好下面的依赖包,接着安装 wkhtmltopdf

pip install requests

pip install beautifulsoup4

pip install pdfkit

安装 wkhtmltopdf

Windows平台直接在 wkhtmltopdf 官网下载稳定版的进行安装,安装完成之后把该程序的执行路径加入到系统环境 $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, "html.parser")

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, "html.parser")

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上。

有问题可以扫描二维码和我交流

关注公众号「Python之禅」,回复「1024」免费获取Python资源

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

  1. 廖雪峰python教程书-Python 爬虫:把廖雪峰的教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...

  2. python爬虫教程pdf-Python 爬虫:把廖雪峰教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天尝试写一个爬虫,将廖雪峰老师的 ...

  3. python基础教程廖雪峰云-Python 爬虫:把廖雪峰的教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...

  4. Python新手爬虫,简单制作抓取廖雪峰教程的小爬虫

    先看几张对比图,分别是官网截图和抓取下来的 txt文档的截图,不算那难看的排版的话,内容是一致的,图片用 url替换了! 在整个抓取过程中,除了普通的文本以外,还需要处理 3个地方,分别是:代码.图片 ...

  5. Python 爬虫:把教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...

  6. 廖雪峰python教程pdf-爬虫:把廖雪峰的教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...

  7. Python 爬虫:把廖雪峰的教程转换成 PDF 电子书

    .前两天,有读者在微信公众平台 问道:可以推荐一本 Python 入门的教程吗? 我说:廖雪峰的 Python 教程 她说:有没有电子书呢? 我说:没有,但你可以用 Google 搜一下,找到了记得发 ...

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

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

  9. jpg转换成PDF详细教程

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

最新文章

  1. 消防报警联动监控计算机中心,楼宇消防报警联动监控计算机中心实验设备
  2. HSF服务的开发与使用
  3. 澳门关键字:葡萄牙、天主教、dc
  4. docker 启动mongodb
  5. 休眠后gpio状态_1.Linux电源管理-休眠与唤醒
  6. linux间隔一定时间访问指定url
  7. LeetCode 96. Unique Binary Search Trees
  8. php解析torrent文件格式,bittorrent 种子文件结构解析
  9. IEC 60335标准介绍
  10. 【渗透测试】常用工具总结
  11. 今日头条信息流 - 橙子建站
  12. xp系统下载U盘安装教程,u盘安装xp系统方法
  13. java判断闰年中闰月_闰年闰月查询表_闰月查询表_闰年查询表-万年历
  14. 【2020最新,无错误!】python实现百度API---地址转经纬度(地理编码)/经纬度转地址(逆地理编码),含源码
  15. 【C语言-09】给定两个整形变量的值,将两个值的内容进行交换。(内附异或法原理讲解哦~)
  16. Java修改图片分辨率(附代码) | Java工具类
  17. php输入框里的提示文字,input 标签实现输入框带提示文字效果(两种方法)
  18. 说说亲身经历的草根seo的辛酸
  19. SIGGRAPH中海洋的研究学习
  20. 相位干涉仪测向的基础理论

热门文章

  1. 关键词 onStart()和onResume()存在的原因(测验篇)两者的区别
  2. 西里尔字 - 俄罗斯
  3. 虚拟手柄控制的小车 air3.4 Android IPones4s 下运行正常
  4. 记一次CTF实验吧的代码审计
  5. FileChannel
  6. 数据结构 树的遍历(递归遍历)
  7. Android 编译系统模块 3
  8. 再读《精通css》04:盒模型和空白边叠加
  9. [C#]面向对象设计
  10. Matlab 模拟退火算法模型代码