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进程管理工具supervisor使用实例
Sep 17 Python
Python实现的监测服务器硬盘使用率脚本分享
Nov 07 Python
Python实用日期时间处理方法汇总
May 09 Python
Python中防止sql注入的方法详解
Feb 25 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
May 27 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
Python如何急速下载第三方库详解
Nov 02 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
Python基础之常用库常用方法整理
Apr 30 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 in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
PHP 实现缩略图
2021/03/09 PHP
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
Python模块的加载讲解
2019/01/15 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
python关于调用函数外的变量实例
2019/12/26 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
python压包的概念及实例详解
2021/02/17 Python
什么是SCM(软件配置管理)
2014/08/16 面试题
信息服务专业毕业生求职信
2014/03/02 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
出国留学英文自荐信
2015/03/25 职场文书
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技