乐趣区

关于python:Python-爬虫把教程转换成-PDF-电子书

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

退出移动版