目录
一:什么是Web请求与响应?
1:Web请求
2:Web响应
3:HTTP协议概述
4:常见的HTTP状态码包括:
二:python的requests库
1:安装requests库
2:发送GET请求
3:发送POST请求
4:处理响应头和状态码
5:发送带查询参数的GET请求
6:发送带表单数据的POST请求
三:处理JSON响应
四:文件操作
1:打开文件的模式
(1)常见的文件打开模式
(2)示例:打开文件并使用模式
2:读取文件
(1)read()方法
(2)readline()方法
(3)readlines()方法
3:写入文件
(1)使用write()方法写入文件
(2)使用writelines()方法写入多行数据
4:下载文件示例
5:文件操作中的注意事项
(1)文件是否存在
(2)文件权限
(3)文件自动关闭
6:其他常用文件操作
(1)获取文件信息
(2)删除文件
五:错误处理与异常捕获
1:try语句的使用
2:示例:捕获常见异常
一:什么是Web请求与响应?
1:Web请求
当客户端(如浏览器)向服务器请求资源时,触发Web请求,其结构包括:
-
请求行:包括请求方法定义操作类型(如
GET
(获取资源)、POST
(提交数据)、PUT
(更新资源)、DELETE
(删除资源))。 -
URL:目标资源的地址(如
https://example.com/page
)。 -
请求头(Headers):附加信息(如
User-Agent
(客户端类型)、Accept-Language
(语言偏好)、Content-Type
(数据类型))。 -
请求体(Body):可选,用于提交数据(如表单输入、JSON)。
2:Web响应
服务器处理请求后返回Web响应,包含:
-
状态码:表示请求结果(如
200 OK
)。 -
响应头(Headers):元数据(如
Content-Type
(响应数据类型)、Content-Length
(数据大小)、Cache-Control
(缓存策略))。 -
响应体(Body):返回的数据(如HTML页面、图片、JSON)。
3:HTTP协议概述
-
定义:基于TCP/IP的应用层协议,用于客户端与服务器通信。
常见HTTP方法:
- GET:请求服务器获取资源,通常用于读取数据。
- POST:提交数据到服务器,通常用于表单提交,文件上传等。
- PUT:更新服务器上的资源。
- DELETE:删除服务器上的资源。
4:常见的HTTP状态码包括:
分类 | 状态码 | 说明 |
---|---|---|
1xx(信息) | 100 Continue | 服务器已接收请求头,客户端应继续发送请求体。 |
2xx(成功) | 200 OK | 请求成功。 |
201 Created | 资源已创建(如POST提交成功)。 | |
204 No Content | 成功但无返回内容(如DELETE请求)。 | |
3xx(重定向) | 301 Moved Permanently | 资源永久重定向到新URL。 |
302 Found | 资源临时重定向。 | |
304 Not Modified | 客户端缓存有效,无需重新传输。 | |
4xx(客户端错误) | 400 Bad Request | 请求语法错误(如参数错误)。 |
401 Unauthorized | 需身份验证(如未登录)。 | |
403 Forbidden | 无权限访问资源(如已登录但权限不足)。 | |
404 Not Found | 资源不存在。 | |
5xx(服务器错误) | 500 Internal Server Error | 服务器内部错误(如代码异常)。 |
502 Bad Gateway | 网关/代理服务器无法获取上游响应。 | |
503 Service Unavailable | 服务器过载或维护。 | |
504 Gateway Timeout | 网关等待上游响应超时。 |
二:python的requests库
1:安装requests库
Linux自带python:
pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
#信任更新源
pip3 config set install.trusted-host mirrors.aliyun.com
pip3 install --upgrade pip #设置更新源
history#安装requests库
pip3 install requests
2:发送GET请求
创建python文件,用于发送get请求
vim aaa.py
import requests #导入模块response=requests.get('https://httpbin.org/get') #发送get请求print('状态码:',response.status_code) #输出响应的状态码
print('响应内容:',response.text) #输出响应的内容
print('响应头:',response.headers) #输出响应头
print('头部长度:',len(response.text)) #获取响应内容的长度
#运行aaa.py
python3 aaa.py
代码解释:
response = requests.get() #
发送一个 HTTP GET 请求。
response.status_code #
获取 HTTP 响应的 状态码。
response.text #
以 字符串形式 返回响应内容
response.headers #
获取 HTTP 响应的 头部信息,返回一个字典状对象。
len(response.text) #
计算响应内容的 字符长度。
3:发送POST请求
提交表单,用POST的方式
创建python文件,用于发送POST请求
vim bbb.py
import requests #导入模块#发送POST请求
url='https://httpbin.org/post'
data={'name':'zhangsan','age':20}
response=requests.post(url,data=data)print('状态码:',response.status_code) #输出响应的状态码
print('响应内容:',response.json()) #输出响应的内容(json格式)
#运行aaa.py
python3 bbb.py
代码解释:
response = requests.post() #
发送一个 HTTP POST 请求。
response.status_code #
获取 HTTP 响应的 状态码。
response.json()
#输出响应的内容(json格式)
4:处理响应头和状态码
# 获取状态码(200表示成功,404未找到等)
print("状态码:", response.status_code)# 获取所有响应头(字典格式)
headers = response.headers
print("Content-Type:", headers.get('Content-Type'))# 检查请求是否成功
if response.status_code == 200:print("请求成功!")
5:发送带查询参数的GET请求
使用params
参数自动构建URL:
form_data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://www.example.com/login', data=form_data)
6:发送带表单数据的POST请求
使用data
参数提交表单数据:
form_data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://www.example.com/login', data=form_data)
发送JSON数据(对比)
使用json
参数自动设置请求头:
json_data = {'key': 'value'}
response = requests.post('https://api.example.com/post', json=json_data)
# Content-Type自动设为application/json
三:处理JSON响应
使用response.json()
方法直接将响应内容解析为Python字典或列表:
import requestsresponse = requests.get('https://api.example.com/data')
data = response.json() # 自动解析JSON数据print(data) # 输出完整JSON内容
print(data['key']) # 访问具体字段(假设是字典结构)
四:文件操作
1:打开文件的模式
(1)常见的文件打开模式
'r'
:只读模式(默认),文件必须存在。
'w'
:写入模式,若文件存在则清空内容,不存在则创建。
'a'
:追加模式,若文件存在则在末尾追加,不存在则创建。
'x'
:独占创建模式,文件必须不存在,否则报错。
'b'
:二进制模式(如'rb'
或'wb'
)。
't'
:文本模式(默认,如'rt'
或'wt'
)。
'+'
:读写模式(如'r+'
或'w+'
)。
(2)示例:打开文件并使用模式
#打开文本并使用模式
vim 111.txt
vim ccc.py
#以只读模式打开文件
with open('111.txt','r') as file:content=file.read()print(content)#以写入模式打开文件,文件内容会被覆盖
with open('111.txt','w') as file:file.write("这是新内容。\n")#以追加模式打开文件,文件内容会追加到文件末尾
with open('111.txt','a') as file:file.write("追加内容。\n")#以二进制模式打开文件
vim 图片.jpg
with open('图片.jpg','rb') as file:binary_data=file.read()print("读取到的二进制数据:",binary_data[:20])
2:读取文件
(1)read()方法
读取整个文件内容,返回字符串。
with open('example.txt', 'r') as file:content = file.read()print(content)
(2)readline()方法
逐行读取文件,每次返回一行字符串。
with open('example.txt', 'r') as file:line = file.readline()while line:print(line.strip()) # strip() 去除换行符line = file.readline()
(3)readlines()方法
读取所有行,返回包含各行内容的列表。
with open('example.txt', 'r') as file:lines = file.readlines()for line in lines:print(line.strip())
3:写入文件
(1)使用write()方法写入文件
with open('example.txt', 'w') as file:file.write("Line 1\n")file.write("Line 2\n")
(2)使用writelines()方法写入多行数据
参数为字符串列表,需自行添加换行符。
lines = ["Line 1\n", "Line 2\n", "Line 3\n"]
with open('example.txt', 'w') as file:file.writelines(lines)
4:下载文件示例
使用 requests
库下载文件:
import requestsurl = "https://example.com/file.txt"
response = requests.get(url)with open("downloaded_file.txt", 'wb') as file:file.write(response.content)
5:文件操作中的注意事项
(1)文件是否存在
在打开文件之前,最好先检查文件是否存在,以避免 FileNotFoundError
。可以使用 os.path.exists()
或 Path.exists()
(Python 3.4+ 的 pathlib
模块)进行检查。
import osfile_path = "example.txt"if os.path.exists(file_path):with open(file_path, "r") as file:content = file.read()print(content)
else:print(f"文件 {file_path} 不存在!")
(2)文件权限
文件存在,也可能因权限问题(如只读文件尝试写入)导致操作失败。
import osfile_path = "example.txt"if os.path.exists(file_path):if os.access(file_path, os.R_OK):with open(file_path, "r") as file:content = file.read()print(content)else:print(f"没有读取 {file_path} 的权限!")
else:print(f"文件 {file_path} 不存在!")
(3)文件自动关闭
使用 with
语句(上下文管理器)可以确保文件在使用后自动关闭,即使发生异常。避免直接使用 open()
而不关闭文件,否则可能导致资源泄漏。
#正确做法(推荐):
with open("example.txt", "r") as file:content = file.read()print(content)
# 文件会自动关闭,无需手动调用 file.close()#错误做法(不推荐):
file = open("example.txt", "r")
content = file.read()
print(content)
file.close() # 如果前面代码出错,可能不会执行 close()
6:其他常用文件操作
(1)获取文件信息
使用 os
模块:
import os# 获取文件大小
size = os.path.getsize('example.txt')# 获取文件修改时间
mtime = os.path.getmtime('example.txt')# 检查是否为文件
is_file = os.path.isfile('example.txt')
(2)删除文件
import osos.remove('example.txt') # 删除文件
os.rmdir('empty_dir') # 删除空目录
shutil.rmtree('dir') # 递归删除目录(需导入 shutil)
五:错误处理与异常捕获
1:try语句的使用
try
语句用于捕获和处理代码块中可能发生的异常。基本语法如下:
try:# 可能引发异常的代码
except ExceptionType:# 处理异常的代码
else:# 如果没有异常发生,执行的代码(可选)
finally:# 无论是否发生异常,都会执行的代码(可选)
try
:包裹可能引发异常的代码。
except
:捕获特定类型的异常并处理。
else
:当没有异常发生时执行的代码(可选)。
finally
:无论是否发生异常都会执行的代码(常用于资源清理,如关闭文件)。
2:示例:捕获常见异常
以下是几种常见异常的捕获示例:
(1)捕获 ZeroDivisionError
(除零错误)
try:result = 10 / 0
except ZeroDivisionError:print("错误:除数不能为零!")
输出:
错误:除数不能为零!
(2)捕获 ValueError
(值错误,如输入非数字)
try:num = int("abc")
except ValueError:print("错误:输入的不是有效数字!")
输出:
错误:输入的不是有效数字!
(3)捕获 IndexError
(索引越界)
try:lst = [1, 2, 3]print(lst[3])
except IndexError:print("错误:索引超出范围!")
输出:
错误:索引超出范围!
(4)捕获 KeyError
(字典键不存在)
try:d = {"name": "Alice"}print(d["age"])
except KeyError:print("错误:键不存在!")
输出:
错误:键不存在!
(5)捕获多个异常
try:num = int(input("请输入一个数字:"))result = 10 / num
except ValueError:print("错误:输入的不是有效数字!")
except ZeroDivisionError:print("错误:除数不能为零!")
else:print(f"结果是:{result}")
finally:print("程序执行完毕。")
输入5: 结果是:2.0程序执行完毕。
输入 0:错误:除数不能为零!程序执行完毕。
输入 abc: 错误:输入的不是有效数字!程序执行完毕。
(6)捕获所有异常(不推荐,但可用于日志记录)
try:# 可能出错的代码risky_operation()
except Exception as e:print(f"发生未知错误:{e}")