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的Django框架中更新数据库数据的方法
Jul 17 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
python读写配置文件操作示例
Jul 03 Python
python读写csv文件实例代码
Jul 05 Python
解决Django加载静态资源失败的问题
Jul 28 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
Python模块的制作方法实例分析
Dec 21 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
python对接ihuyi实现短信验证码发送
May 10 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 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下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
决策树的python实现方法
2014/11/18 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
Python3 操作符重载方法示例
2017/11/23 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
介绍一下Mysql的存储引擎
2015/02/12 面试题
本科生个人求职自荐信
2013/09/26 职场文书
机械电子工程毕业生自荐信
2013/11/23 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
环境工程专业自荐信范文
2014/03/18 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
2014年宣传工作总结
2014/11/18 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL