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实现竖排打印传单手机号码易撕条
Mar 16 Python
Python使用chardet判断字符编码
May 09 Python
python多线程方式执行多个bat代码
Jun 07 Python
Python实现自动添加脚本头信息的示例代码
Sep 02 Python
Vue的el-scrollbar实现自定义滚动
May 29 Python
python使用epoll实现服务端的方法
Oct 16 Python
Python中Flask-RESTful编写API接口(小白入门)
Dec 11 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
浅谈Python响应式类库RxPy
Jun 14 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实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
浅析php数据类型转换
2014/01/09 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
python获取本地计算机名字的方法
2015/04/29 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
Python找出最小的K个数实例代码
2018/01/04 Python
Python 可视化神器Plotly详解
2020/12/26 Python
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
小学教师岗位职责
2013/11/25 职场文书
交通安全演讲稿
2014/01/07 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
英文邀请函
2015/02/02 职场文书