Requests库是一个流行的HTTP请求库,用于向网站发送HTTP请求并获取响应结果。
一、HTTP协议
1.请求类型
HTTP协议请求类型包括GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE和CONNECT共九种主要方法,每种方法都有其特定的用途和特点。为了更好地理解这些请求类型,以下是具体的介绍:
- GET:用于请求服务器发送指定的资源。GET请求通常用于获取数据,如访问一个网页或下载一个文件。它不会对服务器上的资源进行任何修改,并且是幂等的,即多次执行相同GET请求应产生相同结果。
- POST:用于向服务器提交数据,通常用于表单提交或文件上传。POST请求可能会导致服务器状态的改变,并且可能不是幂等的。例如,提交注册表单时,通常会使用POST请求。
- HEAD:类似于GET请求,但服务器只返回响应头而不返回实际内容。这用于获取资源的元信息,如大小和类型,而无需传输整个内容,有助于减少带宽的使用。
- OPTIONS:用于查询服务器支持的HTTP方法及其参数。客户端可以通过OPTIONS请求确定服务器支持哪些请求类型和CORS(跨域资源共享)策略。
- PUT:用于yon向服务器上传资源,通常用于更新或创建新的资源。PUT请求应该是幂等的,这意味着多次执行相同的PUT请求应产生相同结果。在RESTful API设计中,PUT常用于更新资源。
- PATCH:用于对已知资源进行局部更新。与PUT不同,PATCH只更新资源的一部分而不是整体。PATCH请求在实际应用中较少使用。
- DELETE:用于请求服务器删除指定的资源。DELETE请求也应是幂等的,多次执行相同的DELETE请求会产生相同的结果。例如,在Amazon S3云服务中,DELETE用于删除资源。
- TRACE:用于回显服务器收到的请求,主要用于测试或诊断。TRACE请求允许客户端查看请求经过各种代理服务器和中间件时如何被修改。
- CONNECT:用于建立到服务器上指定端口的隧道,通常用于代理服务器。CONNECT方法在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。
2.请求响应
信息(1XX):这类状态码表示服务器已接收请求,并提供了关于请求的更多信息。
正常(2XX):这类状态码表示请求已被服务器成功处理。请求成功,服务器返回了请求的资源。
重定向(3XX):这类状态码表示客户端需要采取进一步行动以完成请求。
客户端错误(4XX):这类状态码表示客户端似乎有错误。
服务器错误(5XX):这类状态码表示服务器在处理请求时发生了错误。
二、Request库使用
1.发送get和post请求
resp = requests.get('http://127.0.0.1/xsstest/login.htm',verify=False) # 忽略证书
import requests
# 发送GET请求
resp = requests.get('http://127.0.0.1/xsstest/login.html')
resp.encoding = 'utf-8' # 设置编码格式
print(resp.text) # 打印响应正文
# 发送POST请求
data = {'username':'admin','password':'123456'}
resp = requests.post(url='http://127.0.0.1/xsstest/login.php',data=data)
print(resp.text)
print(resp.headers) # 打印响应头
if resp.text == 'login-pass': # 对响应进行判断
print("登录成功")
else:
print("登录失败")
# 登录成功后获取响应的Cookie,用于在后续请求中使用
cookie = resp.cookies
2、文件上传下载
文件下载:
import requests
# 下载图片
resp = requests.get('http://127.0.0.1/xsstest/img/1.ppt')
with open('1.ppt', mode='wb') as file:
file.write(resp.content)
文件上传:
用php语言简单搭建的文件上传代码
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['file'])) {
$upload_dir = 'uploads/';
$file_name = $_FILES['file']['name'];
$file_size = $_FILES['file']['size'];
$file_tmp = $_FILES['file']['tmp_name'];
$new_file_name = uniqid('', true) . '.' . $file_ext;
$destination = $upload_dir . $new_file_name;
if (move_uploaded_file($file_tmp, $destination)) {
echo "文件上传成功,保存在:" . $destination;
} else {
echo "文件上传失败。";
}
} else {
?>
<!DOCTYPE html>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file">
<input type="submit" value="上传文件">
</form>
</body>
</html>
<?php } ?>
# 文件上传
file = {'file':open('C:/Users/huawei4/Desktop/test/upload/1.png','rb')}
#print(file)
resp = requests.post(url='http://127.0.0.1/file_upload/upload.php', files=file)
print(resp.text)
利用json处理数据
#利用Python直接处理JSON
import json
list = json.loads(resp.text) #将字符串反序列化成List+Dict的Python对象
print(list)
print(type(list))
print(list[1]['name'])#输出字典的某个值
每篇一言:没有了对高处的恐惧,就体会不到高处之美。