抓取网页生成电子书(廖雪峰的Python教程爬下来做成PDF电子书方便大家离线阅读 )

优采云 发布时间: 2022-02-10 16:13

  抓取网页生成电子书(廖雪峰的Python教程爬下来做成PDF电子书方便大家离线阅读

)

  看来写爬虫并不比使用 Python 更合适。Python社区提供的爬虫工具琳琅满目,你可以分分钟写一个爬虫,里面有各种可以直接使用的库。今天,我正在考虑写一个爬虫。,爬取廖雪峰的Python教程,制作成PDF电子书,供大家离线阅读。

  在开始写爬虫之前,我们先分析一下网站1的页面结构。页面左侧是教程目录的大纲,每个URL对应右侧一个文章,右上角是文章的标题,中间是正文部分文章的,body的内容是我们关注的重点,我们要爬取的数据是所有网页的body部分,底部是用户的评论区,评论区对我们来说很重要它没有用,所以可以忽略。

  

  工具准备

  搞清楚网站的基本结构后,就可以开始准备爬虫所依赖的工具包了。request和beautifulsoup是爬虫的两大神器,reuqests用于网络请求,beautifulsoup用于操作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 body保存到本地,然后找到所有的URL,进行同样的操作。

  使用Chrome浏览器找到页面body部分的标签,按F12找到文字对应的div标签:

  , div 是页面的正文内容。在本地使用请求加载整个页面后,您可以使用 beautifulsoup 操作 HTML dom 元素以提取正文内容。

  

  具体实现代码如下:使用soup.find_all函数找到body标签,然后将body部分的内容保存到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。同样的方法,找到左侧的菜单选项卡

  

  具体代码实现逻辑:因为页面上有uk-nav uk-nav-side的两个类属性,真正的目录列表是第二个。获取所有的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文件,效果图为:

  

  总结

  总代码量不到 50 行,但是,等等,上面给出的代码省略了一些细节,比如如何获取 文章 的标题,body 内容的 img 标签使用相对路径,如果如果要在pdf中正常显示图片,需要将相对路径改为绝对路径,并删除保存的html临时文件。这些细节都在github上。

  完整代码可以在 github 上下载。该代码适用于Windows平台的个人测试。欢迎 fork 下载并改进它。GitHub地址3,无法访问GitHub的同学可以使用码云4,关注公众号“程序员微站”并回复可以免费下载阅读《廖雪峰Python教程》电子书PDF文件“PDF”。

  本文首发于公众号“程序员的微站”(id:VTtalk),分享Python干货的温暖内容

  博客地址:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线