高级扩展模块的相关知识,内容包括图像处理库、Web 服务框架、网络爬虫、绘制数据图标、上机练习。
一、图像处理库
1. Pillow库
Python里的图像处理库
- PIL:Python Image Library
功能强大,可以对图像做各种处理
- 缩放、裁剪、旋转、滤镜、文字、调色板等等
2. 图像处理步骤
打开图像
image.open(<路径+图像名+文件格式>)
- Pillow库能自动根据文件内容确定格式
- 若图片在程序目录下,则不需要附带路径,直接将图像名+文件格式作为参数
处理图像
- image模块中提供了大量处理图像的方法
存取或显示图像
im.show()
im.save(<文件名>)
3. PIL图像操作:缩略图
thumbnail函数
thumbnail(size, Image.ANTIALIAS)
- 参数size为一个元组,指定生成缩略图的大小
- 直接对内存中的原图进行了修改,但是修改完后的图片需要保存,处理后的图片不会被拉伸
4. PIL图像操作:模糊效果
5. PIL图像操作:添加文字
6. 小程序:PIL生成验证码
二、Web 服务框架
1. Web 应用
Web应用已经成为目前最热门的应用软件形式
Web应用通过Web服务器提供服务,客户端采用浏览器或者遵循HTTP协议的客户端
由于需要处理HTTP传输协议,很多web开发框架涌现
2. 框架的基本概念
什么是框架
- Web服务器会处理与浏览器客户端交互的HTTP协议具体细节,但对具体内容的处理还需要自己编写代码
- 一个Web框架至少要具备处理浏览器客户端请求和服务端响应的能力
框架的特性
- 路由 -- 解析URL并找到对应的服务端文件或者Python服务器代码
- 模板 -- 把服务端数据合并成HTML页面。
- 认证和授权 -- 处理用户名、密码和权限
- Session -- 处理用户在多次请求之间需要存储的数据
框架可能具备这些特性中的一种或多种
3. Flask框架
Flask是一种非常容易上手的Python web开发框架,功能强大,支持很多专业Web开发需要的扩展功能
- Facebook认证和数据库集成
只需要具备基本的Python开发技能,就可以开发出一个web应用来
4. Flask框架:小例子
一个Web服务器测试
- 在浏览器中访问http://127.0.0.1:5000/,这个服务器会返回一行文本
5. 表单插件Flask-WTF
关于表单的扩展库
- 使用Flask-WTF时,每个表单都抽象成一个类
三、网络爬虫
1. 搜索引擎蜘蛛
爬虫是按照一定规则,自动地提取并保存网页中信息的程序
- 蜘蛛沿着网络抓取猎物
- 通过一个节点之后,顺着该节点的连线继续爬行到下一个节点,最终爬完整个网络的全部节点
通过向网站发起请求获取资源,提取其中有用的信息
2. requests库
- Python实现的一个简单易用的HTTP库
- 支持HTTP持久连接和连接池、SSL证书验证、cookies处理、流式上传等
- 向服务器发起请求并获取响应,完成访问网页的步骤
- 简洁、容易理解,是最友好的网络爬虫库
http请求类型
- requests.request():构造一个请求
- requests.get():获取HTML网页
- requests.head():获取HTML网页头信息
- requests.post():提交POST请求
- requests.put():提交PUT请求
- requests.patch():提交局部修改请求
- requests.delete():提交删除请求
- requests.options():获取http请求
返回的是一个response对象
- 包含服务器返回的所有信息,例如状态码、编码形式、文本内容等;也包含请求的request信息
- .status_code:HTTP请求的返回状态
- .text:HTTP响应内容的字符串形式
- .content:HTTP响应内容的二进制形式
- .encoding:(从HTTP header中)分析响应内容的编码方式
- .apparent_encoding:(从内容中)分析响应内容的编码方式
定制请求头
- requests的请求接口有一个名为headers的参数,向它传递一个字典来完成请求头定制
设置代理
- 一些网站设置了同一IP访问次数的限制,可以在发送请求时指定proxies参数来替换代理,解决这一问题
3. Beautiful Soup
页面解析器
- 使用requests库下载了网页并转换成字符串后,需要一个解析器来处理HTML和XML,解析页面格式,提取有用的信息
解析器类型
搜索方法
find_all(name, attrs, recursive, string, **kwargs)
返回文档中符合条件的所有tag,是一个列表
find(name, attrs, recursive, string, **kwargs)
相当于find_all()中limit = 1,返回一个结果
- name:对标签名称的检索字符串
- attrs: 对标签属性值的检索字符串
- recursive: 是否对子节点全部检索,默认为True
- string: <>...</> 中检索字符串
- **kwargs:关键词参数列表
4. 爬虫的基本流程
- 分析网页结构
- 爬取页面
- 通过requests库向目标站点发送请求,若对方服务器正常响应,能够收到一个response对象,它包含了服务器返回的所有信息
- 解析页面
- HTML代码-网页解析器
- Json数据-json模块,转换成Json对象
- 二进制数据-以wb形式写入文件,再做进一步处理此处使用bs4进行解析
四、绘制数据图标
1. numpy库
numpy是Python用于处理大型矩阵的一个速度极快的数学库
- 可以做向量和矩阵的运算,包括各种创建矩阵的方法,以及一般的矩阵运算、求逆、求转置
它的很多底层的函数都是用C写的,可以得到在普通Python中无法达到的运行速度
numpy方法
- 矩阵计算
创建矩阵 a = np.matrix([])
矩阵求逆 a.I
矩阵转置 a.T
矩阵乘法 a*b或np.dot(a,b)
- 对象属性
np.shape 数组形状,矩阵则为n行m列
np.size 对象元素的个数
np.dtype 指定当前numpy对象的整体数据
2. matplotlib绘图库
matplotlib是Python的一个绘图库。它包含了大量的工具,可以使用这些工具创 建各种图形
- 简单的散点图、折线图,甚至三维图形、动画等
matplotlib功能异常强大
Python科学计算社区经常使用它完成数据可视化的工作
3. 绘制函数图像基本思路
基本思路
- 通过将图像上一些点的坐标连接起来,即可绘制函数的近似图像,当点越多时,所绘图像越接近函数图像
numpy库的linspace( )函数生成数组
numpy.linspace(<start>,<stop>,<num>)
- 生成一个存放等差数列的数组,数组元素为浮点型,包含三个参数,分别是:数列起始值、终止值(默认包含自身)、数列元素个数
matplotlib库的plot( )函数用来画图
- 可以设定图形颜色、线条线型、以及做标注等
4. 简单图形
5. 多个简单图形
6. 定制线型
plot()函数的绘制样式参数表示
7. 标签图例
坐标轴标签
plt.xlabel()、plt.ylabel()
图形标题
plt.title()
8. 散点图
函数scatter(x,y)
(x, y)是点的坐标
9. 直方图
函数hist(x, n),x是横坐标,n是条状图的数量
五、上机练习
1. 信息隐藏工具
轻微改变图片中像素的RGB值,肉眼无法察觉
将8bit R/G/B中的最低1bit,用于隐藏一个数据文件(如文本)
- 每3个像素可以隐藏1个字节
注意使用不失真图像格式
- BMP/PNG格式
要求:
- 提供图片和数据文件,生成隐藏信息的图片
- 从隐藏信息的图片中提取数据文件
2. 微博系统
开发一个单用户的微博系统
- 可以浏览、发帖、删帖、回复
- 利用Flask编程/shelve持久存储
3. 蒙特卡罗方法求圆周率
蒙特卡罗方法原理
- 通过大量随机样本,去了解一个系统,进而得到所要计算的值
用蒙特卡罗方法计算圆周率π
- 正方形内部有一个相切的圆
- 在这个正方形内部,随机产生10000个点,计算它们与中心点的距离,从而判断是否落在圆的内部
- 如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4
用matplotlib可视化
「资料来源:Python语言与基础应用-陈斌」