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

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

工具准备

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

pipinstallrequestspipinstallbeautifulsouppipinstallpdfkit

安装 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 文件中。

defparse_url_to_html(url):response = requests.get(url) soup = BeautifulSoup(response.content,"html5lib") body = soup.find_all(class_="x-wiki-content")[] html = str(body)withopen("a.html",'wb')asf: f.write(html)

第二步就是把页面左侧所有 URL 解析出来。采用同样的方式,找到 左侧菜单标签

具体代码实现逻辑:因为页面上有两个uk-nav uk-nav-side的 class 属性,而真正的目录列表是第二个。所有的 url 获取了,url 转 html 的函数在第一步也写好了。

defget_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 = []forliinmenu_tag.find_all("li"): url ="http://www.liaoxuefeng.com"+ li.a.get('href') urls.append(url)returnurls

最后一步就是把 html 转换成pdf文件了。转换成 pdf 文件非常简单,因为 pdfkit 把所有的逻辑都封装好了,你只需要调用函数 pdfkit.from_file

defsave_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 文件可以通过关注公众号『python之禅』回复 "pdf”免费下载阅读。

Python网络爬虫与数据挖掘

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

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

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

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

    声明:本文仅供学习参考,切忌用于其它用途,爬的过程中注意控制请求速度,以免给服务器带来过多的压力 写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来 ...

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

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

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

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

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

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

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

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

  7. 【Python3.6】:廖雪峰python教程转换成 PDF

    开始写爬虫前,我们先来分析一下该网站https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c00 ...

  8. python基础一入门必备知识-python基础教程#菜鸟也能看懂的超简单入门必备知识...

    python基础语法教程 python一直是一门非常火爆的编程语言,从简洁的语法,全面的功能,也是得到许多编程萌新的重视,在刚刚接触编程不久的人来说,python就像是代码编程的入门语言,但其实想成为 ...

  9. Python基础(一)--初识Python

    目录 Python基础(一)--初识Python 1 Python基本概念 1.1 什么是Python 1.2 Python的语言特征 1.3 Python的应用领域 2 Python开发环境 2.1 ...

最新文章

  1. 在小程序中实现 Mixins 方案
  2. UnicodeEncodeError: ‘latin-1‘ codec can‘t encode characters in position: ordinal not in range(256)
  3. mysql的存储过程与事务_mysql的存储过程与事务入门
  4. Tornado-Lesson05-模版继承、函数和类导入、ui_methods和ui_modules
  5. 安装openssl-devel命令
  6. Python中的全局变量与局部变量2
  7. 算法复习——割点(洛谷3388)
  8. CentOS 7.5 重置 root 密码
  9. 计算机屏幕显示不能全屏,电脑屏幕小软件显示不全
  10. 无法远程连接到计算机 凭证,win10系统凭证不工作导致远程桌面连接不了的解决办法...
  11. form表单中@submit.prevent作用
  12. 拿姐姐身份证登记结婚竟然成了!婚姻户籍信息共享难在哪儿
  13. TextOut字体设置
  14. 车道线检测CondLaneNet论文和源码解读
  15. 【java】Java连接mysql数据库及mysql驱动jar包下载和使用
  16. 字符版本贪吃蛇游戏设计及算法
  17. c语言:数据保存的方法实现简易贪吃蛇
  18. warning MSB8012 VS2010
  19. 《痞子衡嵌入式半月刊》 第 50 期
  20. 【分享】beta技术沙龙:大型网站的Lucene应用

热门文章

  1. 如何制作SCI论文中的Figures(一)
  2. php入门代码 基础慕课,php基础入门
  3. java8 meta区_JVM-Java8的MetaSpace
  4. BZOJ4336: BJOI2015 骑士的旅行
  5. 字符、字符串和文本的处理之String类型
  6. 第6章 访问权限控制
  7. 开发项目的简单流程(需求、数据库、编码)
  8. MVC3 Razor 语法检查 -(转)
  9. [文摘20071008]全国软考相关-计算机技术与软件专业资格(水平)考试
  10. CCF201803-5 二次求和(100分题解链接)