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 09 Python
Django接受前端数据的几种方法总结
Nov 04 Python
Django视图之ORM数据库查询操作API的实例
Oct 27 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
Python 变量的创建过程详解
Sep 02 Python
python实现画出e指数函数的图像
Nov 21 Python
opencv-python 提取sift特征并匹配的实例
Dec 09 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
python可以用哪些数据库
Jun 22 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
Python Pygame实战在打砖块游戏的实现
Mar 17 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使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
2018/09/14 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
python3中int(整型)的使用教程
2017/03/23 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Python坐标线性插值应用实现
2019/11/13 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
您的网上新华书店:文轩网
2016/08/24 全球购物
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
土建资料员岗位职责
2014/01/04 职场文书
社区母亲节活动方案
2014/03/05 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
2014年团委工作总结
2014/11/13 职场文书
单位计划生育责任书
2015/05/09 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技