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使用pil生成缩略图的方法
Mar 26 Python
Python的Tornado框架异步编程入门实例
Apr 24 Python
浅谈python字典多键值及重复键值的使用
Nov 04 Python
浅谈python 线程池threadpool之实现
Nov 17 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Python函数基本使用原理详解
Mar 19 Python
Python多进程编程常用方法解析
Mar 26 Python
python主要用于哪些方向
Jul 05 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 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 在文件指定行插入数据的代码
2010/05/08 PHP
PHP Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
jquery设置按钮停顿3秒不可用
2014/03/07 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
python实现探测socket和web服务示例
2014/03/28 Python
Python中的默认参数详解
2015/06/24 Python
合并百度影音的离线数据( with python 2.3)
2015/08/04 Python
PyQt5 多窗口连接实例
2019/06/19 Python
python中删除某个元素的方法解析
2019/11/05 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
摩飞电器俄罗斯官方网站:Morphy Richards俄罗斯
2020/07/30 全球购物
String和StringBuffer的区别
2015/08/13 面试题
演讲稿开场白
2014/01/13 职场文书
庆元旦广播稿
2014/02/10 职场文书
高一学生期末评语
2014/04/25 职场文书
经济国贸专业求职信
2014/06/18 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
植树节新闻稿
2015/07/17 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书