当前位置: 首页 > 科技观察

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

时间:2023-03-13 14:57:57 科技观察

写爬虫好像比用Python更合适。Python社区提供的爬虫工具多得让你眼花缭乱。各种库分分钟可以直接使用可以写一个爬虫,今天想写一个爬虫,把廖雪峰的Python教程爬下来做成PDF电子书给大家离线阅读。在开始写爬虫之前,我们先分析一下网站的页面结构1.网页左侧是教程的目录大纲,右侧每个URL对应一篇文章。正文部分,正文内容是我们关注的重点。我们要爬取的数据是所有网页的文本部分。下面是用户的评论区。评论区对我们没有用处,可以忽略。工具准备在搞清楚了网站的基本结构之后,就可以开始准备爬虫所依赖的工具包了。requests和beautifulsoup是爬虫的两大神器,reuqests用于网络请求,beautifulsoup用于操作html数据。有了这两辆穿梭车,我们的工作就可以很快了。我们不需要像scrapy这样的爬虫框架。这对小程序来说有点大材小用。另外,既然是html文件转pdf,就必须要有相应的库支持,wkhtmltopdf是一个很好的工具,可以用于多平台html转pdf,pdfkit是wkhtmltopdf的Python包。首先安装以下依赖包,然后安装wkhtmltopdfpipinstallrequestspipinstallbeautifulsouppipinstallpdfkitinstallwkhtmltopdfWindows平台直接从wkhtmltopdf官网下载稳定版2安装即可。安装完成后,将程序的执行路径添加到系统环境的$PATH变量中,否则pdfkit找不到wkhtmltopdf,会出现“Nowkhtmltopdfexecutablefound”的错误。Ubuntu和CentOS可以直接使用命令行安装$sudoapt-getinstallwkhtmltopdf#ubuntu$sudoyumintsallwkhtmltopdf#centos爬虫实现一切准备就绪后,你就可以上传代码了,但是在写代码之前,你应该整理一下你的想法第一。程序的目的是将所有url对应的html文本部分保存到本地,然后使用pdfkit将这些文件转换成pdf文件。让我们拆分任务。首先将某个URL对应的html文本保存到本地,然后查找所有的URL进行同样的操作。使用Chrome浏览器找到页面文字部分的标签,按F12找到文字对应的div标签:,这个div就是网页的文字内容页。使用requests将整个页面加载到本地后,就可以使用beautifulsoup操作HTMLdom元素提取文本内容。具体实现代码如下:使用soup.find_all函数找到text标签,然后将text部分的内容保存到a.html文件中。defparse_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)withopen("a.html",'wb')asf:f.write(html)第二步解析页面左侧的所有URL。同理找到左侧菜单标签具体代码实现逻辑:因为页面中有两个类属性uk-navuk-nav-side,和真正的目录列表是第二个。所有的url都已经拿到了,把url转html的函数也写在了第一步中。defget_url_list():"""获取所有URL目录列表"""response=requests.get("http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000")soup=BeautifulSoup(response.content),"html5menu_tag=soup.find_all(class_="uk-navuk-nav-side")[1]urls=[]forliinmenu_tag.find_all("li"):url="http://www.liaoxuefeng.com"+li.a.get('href')urls.append(url)返回url最后一步是将html转换为pdf文件。转换成pdf文件很简单,因为pdfkit封装了所有的逻辑,只需要调用函数pdfkit.from_filedefsave_pdf(htmls):"""Convertallhtmlfilestopdffiles"""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文件可关注本公众号『一个程序员的微站』,回复“pdf”即可免费下载阅读。本文首发于公众号“一个程序员的微站”(id:VTtalk),分享温暖内容Python干货博客地址:https://foofish.net/python-crawler-html2pdf.html