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 相关文章推荐
下载给定网页上图片的方法
Feb 18 Python
python如何实现内容写在图片上
Mar 23 Python
Python图像处理之gif动态图的解析与合成操作详解
Dec 30 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
python 字典操作提取key,value的方法
Jun 26 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
python爬虫使用正则爬取网站的实现
Aug 03 Python
一些关于python 装饰器的个人理解
Aug 31 Python
python爬取天气数据的实例详解
Nov 20 Python
浅谈python数据类型及其操作
May 25 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数学运算
2011/12/30 PHP
PHP中的替代语法简介
2014/08/22 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
分享php邮件管理器源码
2016/01/06 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
python实现图片识别汽车功能
2018/11/30 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
英国品牌男装折扣网站:Brown Bag
2018/03/08 全球购物
投标承诺书范本
2014/03/27 职场文书
小学教师培训方案
2014/06/09 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
2015年派出所工作总结
2015/04/24 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
干部考核工作总结
2015/08/12 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL