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使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
python分析网页上所有超链接的方法
May 08 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
python使用turtle库绘制时钟
Mar 25 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
对python的bytes类型数据split分割切片方法
Dec 04 Python
Python3实现获取图片文字里中文的方法分析
Dec 13 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 Python
使用Python获取字典键对应值的方法
Apr 26 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 array_flip() 删除数组重复元素
2009/01/14 PHP
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
PHP中date与gmdate的区别及默认时区设置
2014/05/12 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
解决uWSGI的编码问题详解
2017/03/24 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
Python使用gRPC传输协议教程
2018/10/16 Python
python读取xlsx的方法
2018/12/25 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
Python内置函数locals和globals对比
2020/04/28 Python
Django 实现图片上传和下载功能
2020/12/31 Python
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
幼儿园教师个人反思
2014/01/30 职场文书
酒店端午节促销方案
2014/02/18 职场文书
《夹竹桃》教学反思
2014/04/20 职场文书
施工工地安全标语
2014/06/07 职场文书
丽江古城导游词
2015/02/03 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python