python爬取网页转换为PDF文件


Posted in Python onJune 07, 2018

爬虫的起因

官方文档或手册虽然可以查阅,但是如果变成纸质版的岂不是更容易翻阅与记忆。如果简单的复制粘贴,不知道何时能够完成。于是便开始想着将Android的官方手册爬下来。

全篇的实现思路

  1. 分析网页
  2. 学会使用BeautifulSoup库
  3. 爬取并导出

参考资料:

* 把廖雪峰的教程转换为PDF电子书
* Requests文档
* Beautiful Soup文档

配置

在Ubuntu下使用Pycharm运行成功
转PDF需要下载wkhtmltopdf

具体过程

网页分析

如下所示的一个网页,要做的是获取该网页的正文和标题,以及左边导航条的所有网址

python爬取网页转换为PDF文件

接下来的工作就是找到这些标签喽…

关于Requests的使用

详细参考文档,这里只是简单的使用Requests获取html以及使用代理翻墙(网站无法直接访问,需要VPN)

proxies={
 "http":"http://vpn的IP:port",
 "https":"https://vpn的IP:port",
 }

response=requests.get(url,proxies=proxies)

Beautiful Soup的使用

参考资料里面有Beautiful Soup文档,将其看完后,可以知道就讲了两件事:一个是查找标签,一个是修改标签。
本文需要做的是:

1. 获取标题和所有的网址,涉及到的是查找标签

#对标签进行判断,一个标签含有href而不含有description,则返回true
#而我希望获取的是含有href属性而不含有description属性的<a>标签,(且只有a标签含有href)
def has_href_but_no_des(tag):
 return tag.has_attr('href') and not tag.has_attr('description')

#网页分析,获取网址和标题
def parse_url_to_html(url):

 response=requests.get(url,proxies=proxies)
 soup=BeautifulSoup(response.content,"html.parser")
 s=[]#获取所有的网址
 title=[]#获取对应的标题
 tag=soup.find(id="nav")#获取第一个id为"nav"的标签,这个里面包含了网址和标题
 for i in tag.find_all(has_href_but_no_des):
 s.append(i['href'])
 title.append(i.text)

 #获取的只是标签集,需要加html前缀
 htmls = "<html><head><meta charset='UTF-8'></head><body>"
 with open("android_training_3.html",'a') as f:
 f.write(htmls)

对上面获取的网址分析,获取正文,并将图片取出存于本地;涉及到的是查找标签和修改属性

#网页操作,获取正文及图片
def get_htmls(urls,title):

 for i in range(len(urls)):
 response=requests.get(urls[i],proxies=proxies)
 soup=BeautifulSoup(response.content,"html.parser")
 htmls="<div><h1>"+str(i)+"."+title[i]+"</h1></div>"
 tag=soup.find(class_='jd-descr')
 #为image添加相对路径,并下载图片
 for img in tag.find_all('img'):
  im = requests.get(img['src'], proxies=proxies)
  filename = os.path.split(img['src'])[1]
  with open('image/' + filename, 'wb') as f:
  f.write(im.content)
  img['src']='image/'+filename
 htmls=htmls+str(tag)
 with open("android_training_3.html",'a') as f:
  f.write(htmls)
 print(" (%s) [%s] download end"%(i,title[i]))
 htmls="</body></html>"
 with open("android_training_3.html",'a') as f:
 f.write(htmls)

2.转为PDF

这一步需要下载wkhtmltopdf,在Windows下执行程序一直出错..Ubuntu下可以

def save_pdf(html):
 """
 把所有html文件转换成pdf文件
 """
 options = {
 'page-size': 'Letter',
 'encoding': "UTF-8",
 'custom-header': [
  ('Accept-Encoding', 'gzip')
 ]
 }
 pdfkit.from_file(html, "android_training_3.pdf", options=options)

最后的效果图

python爬取网页转换为PDF文件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python的迭代器与生成器实例详解
Jul 16 Python
python中map()与zip()操作方法
Feb 27 Python
Python数据结构之翻转链表
Feb 25 Python
Python解惑之True和False详解
Apr 24 Python
简单学习Python多进程Multiprocessing
Aug 29 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
对Python3中的input函数详解
Apr 22 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
python 如何上传包到pypi
Dec 24 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 #Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 #Python
python生成ppt的方法
Jun 07 #Python
python实现按长宽比缩放图片
Jun 07 #Python
python实现批量修改图片格式和尺寸
Jun 07 #Python
python实现批量图片格式转换
Jun 16 #Python
python脚本实现验证码识别
Jun 07 #Python
You might like
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
三种php连接access数据库方法
2013/11/11 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
独特的python循环语句
2016/11/20 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
django 简单实现登录验证给你
2019/11/06 Python
python实现简单俄罗斯方块
2020/03/13 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
用python对excel查重
2020/12/07 Python
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
网络安全方面的面试题
2015/11/04 面试题
写给学生的新学期寄语
2014/01/18 职场文书
统计岗位职责
2014/02/21 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
合伙协议书
2014/04/23 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书