复杂的网络请求
4、验证请求
requests模块自带了验证功能,只需要在请求方法中填写auth参数,该参数的值是一个带有验证参数(用户名与密码)的HTTPBasicAuth对象。示例代码如下:
import requests # 导入requests模块
from requests.auth import HTTPBasicAuth # 导入HTTPBasicAuth类
# 定义请求地址
url = 'http://sck.rjkflm.com:666/spider/auth/'
ah = HTTPBasicAuth('admin','admin') # 创建HTTPBasicAuth对象,参数为用户名与密码
response = requests.get(url=url,auth=ah) # 发送网络请求
if response.status_code==200: # 如果请求成功
print(response.text) # 打印验证后的HTML代码
程序运行结果如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>标题文档</title>
</head>
<body>
<img src='../images/logo1.png'>
<br>
hello 明日科技 ~
</body>
</html>
5、网络超时与异常
在访问一个网页时,如果该网页长时间未响应,系统就会判断该网页超时,无法打开网页。下面通过代码来模拟网络超时现象,代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :1/28/22 10:38 PM
# 文件 :演示网络超时与异常现象.py
# IDE :PyCharm
# 导入网络请求模块
import requests
# 循环发送请求50次
for a in range(0, 50):
try:
# 设置超时0.1秒
resp = requests.get('https://www.baidu.com/', timeout = 0.08)
print(resp.status_code)
print(a+1)
# 捕获异常
except Exception as e:
print('异常' + str(e))
运行结果如下:
200
8
200
9
200
10
异常HTTPSConnectionPool(host='www.baidu.com', port=443): Read timed out. (read timeout=0.08)
200
12
200
说 明:
上面代码模拟50次循环请求,并且设置超时的时间为0.08秒,所以在0.08秒内服务器未做出响应将视为超时,将超时信息打印在控制台中。
6、识别网络异常的分类
针对网络异常的信息,requests模块同样提供了三种常见的网络异常类捕获异常,代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :1/28/22 10:50 PM
# 文件 :识别网络异常的分类.py
# IDE :PyCharm
import requests # 导入网络请求模块
# 导入requests.exceptions模块中的三种异常类
from requests.exceptions import ReadTimeout,HTTPError,RequestException
# 循环发送请求50次
for a in range(0, 50):
try: # 捕获异常
# 设置超时为0.1秒
response = requests.get('https://www.baidu.com/', timeout=0.06)
print(response.status_code) # 打印状态码
except ReadTimeout: # 超时异常
print('timeout')
except HTTPError: # HTTP异常
print('httperror')
except RequestException: # 请求异常
print('reqerror')
程序运行结果如下:
timeout
reqerror
timeout
reqerror
timeout
reqerror
200
timeout
timeout
timeout
200
200
7、上传文件
使用requests模块实现向服务器上传文件也是非常简单的,只需要指定post()函数中的files参数即可。files参数可以指定一个BufferReader对象,该对象可以使用内置的open()函数返回。示例代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :1/28/22 11:10 PM
# 文件 :使用requests模块实现上传图片文件.py
# IDE :PyCharm
import requests
# 读取指定文件
bd = open('百度logo.png', 'rb')
# 定义需要上传的图片文件
file = {
'file':bd}
# 发送上传文件的网络请求
resp = requests.post('http://httpbin.org/post', files = file)
print(resp.text)
程序运行结果如下:
{
"args": {
},
"data": "",
"files": {
# 图片文件的二进制数据,很长,....为省略部分
"file": "data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUgAAAhwAAAECCAMAAACCFP44AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKTWlDQ1BQaG90b3Nob3A.....},
"form": {
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "8027",
"Content-Type": "multipart/form-data; boundary=ce27e478ee87d2f129d4c606fa26aad6",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.27.1",
"X-Amzn-Trace-Id": "Root=1-61f40844-62fc499e71a1206c071b9658"
},
"json": null,
"origin": "222.163.139.128",
"url": "http://httpbin.org/post"
}
说 明:
从上面的程序运行结果可以看出,提交的图片文件(二进制数据)被指定在files中,file对应的数据中可以发现post()函数将上传的文件转为Base64的编码形式。