写爬虫仿佛没有比用 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 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,如有侵权,请分割删除。