接上文 urllib3学习笔记(一)https://developer.aliyun.com/article/1615874
urllib3学习笔记
urllib3简介
POST请求
1、使用request()方法实现POST请求
使用urllib3模块向服务器发送POST请求时,并不复杂,与发送GET请求相似,只是需要在request()方法中将method参数设置为’POST’, 然后将fields 参数设置为字典类型的表单参数。示例代码如下:
import urllib3 # 导入urllib3模块
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://www.httpbin.org/post' # post请求测试地址
params = {
'name':'Jack','country':'中国','age':30} # 定义字典类型的请求参数
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('POST',url,fields=params) # 发送POST请求
print('返回结果:',r.data.decode('utf-8'))
结果如下:
备注
同样,Python3.7, Python3.9.7可以正常运行以上程序,其他版本报错,即使import ssl也不能解决。
从上图的运行结果看出,JSON信息中的form对应的数据为表单参数,只是chinese_name所对应的并不是’杰克’而是一段Unicode编码,对于这样情况,可以将请求结果编码方式设置为’unicode_escape’。如下:
print(r.data.decode('unicode_escape'))
重试请求
urllib3模块可以自动重试请求,这种相同的机制还可以处理重定向。在默认情况下request()方法的请求重试次数为3次,如果需要修改重试次数可以设置为retries参数。修改重试测试的示例代码如下:
import urllib3 # 导入urllib3模块
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://www.httpbin.org/get' # get请求测试地址
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('GET',url) # 发送GET请求,默认重试请求
r1 = http.request('GET',url,retries=5) # 发送GET请求,设置5次重试请求
r2 = http.request('GET',url,retries=False) # 发送GET请求,关闭重试请求
print('默认重试请求次数:',r.retries.total)
print('设置重试请求次数:',r1.retries.total)
print('关闭重试请求次数:',r2.retries.total)
运行结果如下:
executed in 1.78s, finished 22:07:40 2022-01-27
默认重试请求次数: 3
设置重试请求次数: 5
关闭重试请求次数: False
处理响应内容
1、获取响应头
发送网络请求后,将返回一个HTTPResponse对象,通过该对象中的info()方法即可获取HTTP响应头信息,该信息为字典(dict)类型的数据,所以需要通过for循环进行遍历才可清晰的看到每条响应头信息内容。示例代码如下:
import urllib3 # 导入urllib3模块
try:
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://www.sohu.com/get' # get请求测试地址
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('GET',url) # 发送GET请求,默认重试请求
response_header = r.info() # 获取响应头
for key in response_header.keys(): # 循环遍历打印响应头信息
print(key,':',response_header.get(key))
except:
pass
运行结果如下:
executed in 484ms, finished 22:20:48 2022-01-27
Content-Type : text/html
Content-Length : 8511
Connection : keep-alive
Server : openresty
Date : Thu, 27 Jan 2022 14:20:48 GMT
Last-Modified : Wed, 27 Oct 2021 12:17:55 GMT
Vary : Accept-Encoding
ETag : "61794373-213f"
Cache-Control : no-cache, no-store, must-revalidate
Referrer-Policy : no-referrer-when-downgrade
Accept-Ranges : bytes
FSS-Cache : MISS from 3951190.5655136.5536880
FSS-Proxy : Powered by 3689042.5130844.5274728
2、JSON信息
如果服务器返回了一条JSON信息,而这条信息中只有某条数据为可用数据时,可以先将返回的JSON数据转为字典(dict)数据,接着直接获取指定键所对应的值即可。示例代码如下:
import urllib3 # 导入urllib3模块
import json # 导入json模块
try:
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://www.httpbin.org/post' # post请求测试地址
params = {
'name': 'Jack', 'country': '中国', 'age': 30} # 定义字典类型的请求参数
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('POST', url, fields=params) # 发送POST请求
j = json.loads(r.data.decode('unicode_escape')) # 将响应数据转换为字典类型
print('数据类型:', type(j))
print('获取form对应的数据:', j.get('form'))
print('获取country对应的数据:', j.get('form').get('country'))
except:
pass
运行结果如下:
executed in 1.36s, finished 22:31:42 2022-01-27
数据类型: <class 'dict'>
获取form对应的数据: {
'age': '30', 'country': '中国', 'name': 'Jack'}
获取country对应的数据: 中国
3、二进制数据
如果响应数据为二进制数据,也可以做出相应的处理。例如,响应内容为图片的二进制数据时,则可以使用open()函数,将二进制数据转换成图片。示例代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :1/27/22 10:48 PM
# 文件 :处理服务器返回的二进制数据.py
# IDE :PyCharm
import urllib3 # 导入urllib3模块
try:
urllib3.disable_warnings() # 关闭ssl警告
url = 'http://sck.rjkflm.com:666/spider/file/python.png' # 图片请求地址
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('GET', url) # 发送网络请求
print(r.data) # 打印二进制数据
f = open('python.png', 'wb+') # 创建open对象
f.write(r.data) # 写入数据
f.close() # 关闭
except:
pass
运行结果如下:
/Users/liuxiaowei/PycharmProjects/爬虫练习/venv/bin/python /Users/liuxiaowei/PycharmProjects/爬虫练习/Urllib3/处理响应内容/处理服务器返回的二进制数据.py
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01\x0e\x00\x00\x00\\\x08\x02\x00\x00\x00\x10\xe2\xcc\xba\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x.......'
Process finished with exit code 0
2021-08-23
获得帮助
多层次的帮助
whatis
command --help
man and info
/usr/share/doc/
Red Hat documentation
其他网站和搜索
内部命令:
help command
man bash
外部命令:
(1) command --help
command -h
(2)使用手册(manual)
man command
(3)信息页
info command
(4)程序自身的帮助文档
README
INSTALL
ChangeLog
(5)程序官方文档
官方站点:Documentation
(6)发行版的官方文档
(7)Google
man命令
- 提供命令帮助的文件
- 手册页存放在/usr/share/man
- 几乎每个命令都有man的“页面”
- man页面分组为不同的“章节“ whatis command查章节
- man命令操作方法:使用less命令实现
space,^v,^f,^F:向文件尾翻屏
b,^b:向文件首部翻屏
d,^d:向文件尾部翻半屏
u,^u:向文件首部翻半屏
RETURN,^N,e,^E or j or ^J:向文件尾部翻一行 y or ^Y or ^P or k or ^K:向文件首部翻一行
q:退出
#:跳转至第#行
1G:回到文件首部
G:翻至文件尾部
man搜索
/KEYWORD:
以KEYWORD指定的字符串为关键字,从当前位置向文件尾部搜索;不区分字符大小写;
n:下一个
N:上一个
?KEYWORD:
以KEYWORD指定的字符串为关键字,从当前位置向文件首部搜索;不区分字符大小写;
n:跟搜索命令同方向,下一个
N:跟搜索命令方向反方向,上一个
man命令的配置文件:/etc/man.config | man_db.conf
MANPATH /PATH/TO/SOMEWHERE:指明man文件搜索位置
man -M /PATH/TO/SOMEWHERE:到指定位置搜索
COMMAND命令的手册页并显示
中文man需安装包man-pages-zh-CN
man章节
1:用户命令
2:系统调用
3:C库调用
4:设备文件及特殊文件
5:配置文件格式
6:游戏
7:杂项
8:管理类的命令
9:Linux内核API
man帮助段落说明
帮助手册中的段落说明:
NAME 名称及简要说明
SYNOPSIS 用法格式说明
[] 可选内容
<> 必选内容
a|b 二选一
{} 分组
...... 同一内容可以出现多次
DESCRIPTION 详细说明
OPTIONS 选项说明
EXAMPLES 示 例
FILES 相关文件
AUTHOR 作 者
COPYRIGHT 版本信息
REPORTING BUGS bug 信息
SEE ALSO 其他帮助参考
man帮助
查看man手册页
man [章节] keyword
列出所有帮助
man -a keyword
搜索man手册
man -k keyword 列出所有匹配的页面
使用whatis 数据库
相当于whatis
man -f keyword
打印man帮助文件的路径
man -w [章节] keyword
导航info页
方向键,PaUp,PgDn导航
Tab键移动到下一个链接
d 显示主题目录
Home显示主题首部
Enter进入选定链接
n/p/u/l进入下/前/上一层/最后一个链接
s文字 文本搜索
q退出info
Linux平台文件系统管理
磁盘命令:
查看各分区使用情况
#df -h
#lsblk
查看所有分区
#fdisk -l
查看所有交换分区
#swapon -s
查看根目录下所有文件夹(目录)大小
#du -sh /*
查看指定目录大小
du -sh /root
网络命令
查看所有网络接口属性
[root@Bruce_Liu ~]#ifconfig
查看带宽
[root@Bruce_Liu ~]#ethtool 网卡名
查看路由表
[root@Bruce_Liu ~]#route -n
查看所有监听端口
[root@Bruce_Liu ~]#netstat -lntp
查看所有已建立连接
[root@Bruce_Liu ~]#netstat -antp
查看某端口使用情况
[root@Bruce_Liu ~]#lsof -i:端口号
或者使用
[root@Bruce_Liu ~]#netstat -apn|grep 端口号
查看所有进程
查看进程
[root@Bruce_Liu ~]#ps -ef,使用ps -ef|gerp tomcat过滤
#可以看到进程占用CPU,内存情况
[root@Bruce_Liu ~]#ps -aux
#查看实时显示进程状态
[root@localhost ~]# top
网络IO:
iftop -n ,ifstat,dstat -nt,sar -n DEV 2 3
文件系统
文件和目录被组织成一个单根倒置树结构
文件系统从根目录下开始,用“/”表示
根文件系统(ROOTFS):root filesystem
文件名称区分大小写
以.开头的文件为隐藏文件
路径分隔符/
文件有两类数据:
元数据:metadata 文件属性信息
数据:data 具体内容
- 文件系统分层结构:LSB Linux Standard Base
- FHS:(Filesystem Hierarchy Standard)
文件名规则
1.文件名最长255个字节
2.包括路径在内文件名称最长4095个字节
3.蓝色--->目录 绿色--->可执行文件 红色--->压缩文件 浅蓝色--->链接文件(相当于windows快捷方式) 灰色-->其他文件
4.除了斜杠和NUL,所有字符都有效。但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用它们。
标准Linux文件系统(如ex4),文件名称大小写敏感。例如:
MAIL,Mail,mail, mAiL
技巧:创建一个"-a"文件名,#touch -a,touch "-a"都是错误的,#touch path/-a可以,加上路径,如果根目录就是/-a,如果其他目录就是path/-a
字符文件(c开头)
[root@Bruce_Liu ~]#ll /dev/zero
用处:在磁盘快速生成大文件,命令如下
[root@Bruce_Liu ~]#dd if=/dev/zero of=data/bigfile bs=1M count=1024
#data/bigfile data路径下的bigfile文件
if:input file缩写
of:output file 缩写
bs:block size
显示当前工作路径pwd:printing working directory
绝对路径和相对路径
绝对路径
以正斜杠开始 /
完整的文件的位置路径
可用于任何想指定一个文件名的时候
相对路径
不以斜线开始
指定相对于当前工作目录或某目录的位置
可以作为一个简短的形式指定一个文件名
基名:basename
取最后文件(文件夹)名:network
[root@Bruce_Liu ~]#basename /etc/sysconfig/network
目录名:dirname
取路径名:/etc/sysconfig
[root@Bruce_Liu ~]#dirname /etc/sysconfig/network
切换终端命令
[root@Bruce_Liu ~]#chvt 2
#2终端号,chvt:change virtual terminal缩写
开机启动图形化界面切换
[root@Liu_Bruce ~]#systemctl get-default
#graphical.target 代表开机时启动图形化界面
#multi-user.target 代表开机启动dos界面
如果想要进入图形化界面
#systemctl set-default graphical.target
如果开机进入dos界面,输入命令:
#systemctl set-default multi-user.target
DOS界面与图形化界面切换快捷键
图形到dos:ctrl+alt+f2
dos到图形化:startx
或者在命令行输入init 3切到dos界面
init 5切到图形界面