写爬虫仿佛没有比用 Python 更适合了,Python 社区提供的爬虫工具多得让你目迷五色,各种拿来就能够间接用的 library 分分钟就能够写出一个爬虫进去,明天就推敲着写一个爬虫,将廖雪峰的 Python 教程 爬下来做成 PDF 电子书不便大家离线浏览。
开始写爬虫前,咱们先来剖析一下该网站1的页面构造,网页的左侧是教程的目录纲要,每个 URL 对应到左边的一篇文章,右侧上方是文章的题目,两头是文章的注释局部,注释内容是咱们关怀的重点,咱们要爬的数据就是所有网页的注释局部,下方是用户的评论区,评论区对咱们没什么用,所以能够疏忽它。
工具筹备
弄清楚了网站的根本构造后就能够开始筹备爬虫所依赖的工具包了。requests、beautifulsoup 是爬虫两大神器,reuqests 用于网络申请,beautifusoup 用于操作 html 数据。有了这两把梭子,干起活来利索,scrapy 这样的爬虫框架咱们就不必了,小程序派上它有点杀鸡用牛刀的意思。此外,既然是把 html 文件转为 pdf,那么也要有相应的库反对, wkhtmltopdf 就是一个十分好的工具,它能够用实用于多平台的 html 到 pdf 的转换,pdfkit 是 wkhtmltopdf 的Python封装包。首先装置好上面的依赖包,接着装置 wkhtmltopdf
pip install requestspip install beautifulsouppip 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 class="x-wiki-content">
,该 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 class="uk-nav uk-nav-side">
具体代码实现逻辑:因为页面上有两个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 文件就生成了,效果图:
本文转自 https://juejin.cn/post/6844903463063650311,如有侵权,请分割删除。