目录
一、什么是Web请求与响应?
0. 概述
Web 请求与响应是客户端(如浏览器)与服务器之间交互的核心机制:
-
请求(Request):客户端向服务器索取资源(如网页、图片)或提交数据(如表单信息)。
-
响应(Response):服务器处理请求后返回结果(如 HTML 内容、错误提示)。
-
通信协议:基于 HTTP/HTTPS 协议,遵循无状态、明文(HTTPS 加密)传输规则。
1. web 请求
请求的组成
请求行:定义请求方法、目标 URL 和协议版本。
请求头(Headers):传递客户端环境信息或附加要求。
请求体(Body):仅某些请求方法(如 POST、PUT)携带数据。
常见请求方法
方法 | 用途 |
---|---|
GET | 获取资源(无请求体) |
POST | 提交数据(如表单、文件上传) |
PUT | 更新服务器上的资源(全量替换) |
DELETE | 删除指定资源 |
PATCH | 更新资源的部分内容 |
2. web 响应
响应的组成
状态行:包含协议版本、状态码和状态描述。
响应头(Headers):描述服务器信息或资源属性。
响应体(Body):返回客户端请求的内容(如 HTML、JSON、文件)。
3. HTTP 协议概述
-
版本演进:
-
HTTP/1.1:主流版本,支持持久连接(Keep-Alive)。
-
HTTP/2:多路复用、头部压缩,提升性能。
-
HTTP/3:基于 QUIC 协议,解决队头阻塞问题。
-
-
特点:
-
无状态:服务器不保存客户端状态(依赖 Cookie/Session 管理)。
-
明文传输:HTTP 不加密(HTTPS 通过 SSL/TLS 加密)。
-
4. 常见的Http 状态码含义
状态码 | 分类 | 典型示例 |
---|---|---|
1xx | 信息性 | 100 Continue (继续发送请求体) |
2xx | 成功 | 200 OK (请求成功) |
3xx | 重定向 | 301 Moved Permanently (永久重定向)302 临时重定向 |
4xx | 客户端错误 | 404 Not Found (资源不存在) |
5xx | 服务器错误 | 500 Internal Server Error (服务器内部错误) |
高频状态码详解
-
200 OK:请求成功,响应体中包含目标数据。
-
301 vs 302:
-
301
:资源永久迁移,浏览器缓存新地址。 -
302
:资源临时重定向,下次请求仍访问原地址。
-
-
403 Forbidden:服务器拒绝请求(无权限)。
-
404 Not Found:请求的资源不存在。
-
500 Internal Error:服务器处理请求时发生未知错误(如代码崩溃)。
-
503 Service Unavailable:服务器暂时不可用(如维护或过载)。
二、Python 的 requests 库
1. 安装 requests 库
指定更新源
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
--安装requests库
pip3 install requests
2. 发送 GET 请求
设置GET请求
vim aaa.py
#指定模块
import requests
#发送get请求
response=requests.get('https://httpbin.org/get')
#输出响应的状态码
print ('状态码',response.status_code)
#输出响应内容
print ('响应内容',response.text)
#输出响应头
print ('响应头',response.headers)
#获取响应内容的长度
print ('内容长度',len(response.text))
3. 发送POST请求
设置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)
#输出响应内容(JSON格式)
print('响应内容',response.json()
4. 处理响应头和状态码
响应头提供关于服务器的信息,状态码则告诉我们请求是否成功。
可以通过 response.headers 获取响应头,通过 response.status_code 获取状态码
#指定模块
import requests
#发送get请求(目标)
response=requests.get('https://httpbin.org/get')
#获取响应头
print('Response Headers:', response.headers)
#获取响应状态码
#print('Status Code:', response.status_code)
#获取内容类型
print('Content-Type:', response.headers.get('Content-Type'))
代码解释:
- response.headers 返回响应头,包含如 Content-Type、Date、Server 等信息。
- response.status_code 返回 HTTP 状态码。
- response.headers.get ('Content-Type') 获取响应的内容类型 (如 text/html, application/json)。
5. 发送带查询参数的GET请求
在 GET 请求中,我们可以通过 URL 传递查询参数。例如,访问一个包含参数的 URL。
import requests
#发送带查询参数的 GET 请求
url = 'https://httpbin.org/get'
params = {'name': 'Alice', 'age': 25}
response = requests.get(url, params=params)
#输出响应内容
print('Response Body:', response.json())
代码解释:
- params 是一个字典,包含要传递的查询参数。requests.get () 会自动将这些参数编码到 URL 中。
6. 发送带单数据的 POST 请求
POST 请求可以用来提交表单数据,下面的例子展示了如何使用 requests 发送带表单数据的 POST 请求。
import requests
#发送带表单数据的 POST 请求
url = 'https://httpbin.org/post'
data = {'username': 'testuser', 'password':'mypassword'}
response = requests.post(url, data=data)
#输出响应的内容
print('Response Body:', response.json())
代码解释:
- data 参数是一个字典,包含表单提交的数据,requests 会自动将数据编码为 application/x-www-form-urlencoded 格式。
三、处理 JSON 响应
许多 Web API 返回的数据格式是 JSON,Python 的 requests 库提供了方便的 JSON 处理方法。
import requests
#发送 GET 请求并获取 JSON 响应
url = 'https://api.github.com/users/octocat'
response = requests.get(url)
#解析 JSON 数据
data = response.json()
#输出用户的GitHub信息
print('User Login:',data['login'])
print('User Name:',data['name'])
代码解释:
- response.json()将响应的内容解析为 Python 字典,方便我们处理 JSON 数据。
四、文件操作
1. 打开文件的模式
(1)常见的文件打开模式
模式 | 描述 |
---|---|
r | 只读模式(默认),文件必须存在,否则报错。 |
w | 写入模式,若文件存在则清空内容,不存在则创建。 |
a | 追加模式,在文件末尾追加内容,文件不存在则创建。 |
r+ | 读写模式,文件必须存在,可读写文件内容。 |
w+ | 读写模式,文件不存在则创建,存在则清空内容。 |
a+ | 读写追加模式,文件不存在则创建,写入时始终追加到末尾。 |
rb /wb | 二进制模式(如处理图片、视频等非文本文件)。 |
(2)示例
#以只读模式打开文件(需要有这个文件)
with open('example.txt','r') as file:
content = file.read()
print(content)
#以写入模式(会覆盖现有文件)
with open('example.txt','w') as file:
file.write("nihao")
#以追加模式(\n是换行)
with open('example.txt','a') as file:
file.write("nihao""张三"\n)
# 二进制读取(如图片)
with open("image.jpg", "rb") as f:
binary_data = f.read()
2. 读取文件
(1)read() 方法
-
功能:读取文件全部内容,返回字符串。
-
适用场景:小文件一次性读取。
with open("data.txt", "r") as f: content = f.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("data.txt", "r") as f: lines = f.readlines() # 返回列表,如 ["Line1\n", "Line2\n"] for line in lines: print(line.strip())
3.写入文件
(1)使用 write() 方法写入文件
-
功能:写入字符串到文件。
with open("output.txt", "w") as f: f.write("Line 1\n") f.write("Line 2\n")
(2)使用 writelines() 方法写入多行数据
-
功能:写入字符串列表到文件(需自行添加换行符)。
lines = ["Line 1\n", "Line 2\n", "Line 3\n"] with open("output.txt", "w") as f: f.writelines(lines)
4. 下载文件示例
vim eee.py
import requests
url = '图像链接' #代表图像文件
response = requests.get(url)
#判断语句,判断状态码是否为200,正确则下载图像到本地
if response.status_code==200:
with open ('123456.jpg','wb') as file:
file.write(response.content)
print("下载成功")
else:
print("下载失败,状态码:", response.status_code)
示例图路径:https://c-ssl.duitang.com/uploads/blog/202203/13/20220313195230_d82b9.jpg
5. 文件操作中的注意事项
-
关闭文件:使用
with
语句自动管理文件关闭,避免资源泄漏。 -
大文件处理:避免用
read()
一次性读取大文件,改用逐行读取或分块读取。 -
异常处理:捕获文件操作可能引发的异常(如
FileNotFoundError
)。 -
路径问题:使用绝对路径或确保相对路径正确(相对于当前工作目录)。
-
编码问题:文本文件读写时指定编码(如
encoding='utf-8'
),避免乱码。 -
权限问题:确保程序对目标文件有读写权限。
-
常见异常类型
异常 触发场景 FileNotFoundError
文件不存在时尝试读取(如 open("r")
)。PermissionError
无权限访问文件(如只读文件尝试写入)。 IsADirectoryError
尝试以文件模式操作目录。 UnicodeDecodeError
文本文件编码不匹配(如用 utf-8
读取gbk
文件)。 -
场景 最佳实践 错误捕获 使用 try-except
捕获特定异常,避免程序崩溃。大文件处理 分块读取或逐行处理,减少内存占用。 编码问题 明确指定 encoding
,或用chardet
检测编码。并发安全 使用文件锁防止多进程写入冲突。 资源管理 使用 with
语句和tempfile
模块。磁盘空间 写入前检查剩余空间,预防写入失败
6. 其他常用文件操作
(1)获取文件信息
使用 os
模块获取文件元数据:
import os
file_path = "data.txt"
file_info = os.stat(file_path)
print("文件大小:", file_info.st_size, "bytes")
print("最后修改时间:", file_info.st_mtime)
(2)删除文件
使用 os.remove()
:
import os
if os.path.exists("temp.txt"):
os.remove("temp.txt") # 删除文件
else:
print("文件不存在!")
总结
操作 | 核心方法 | 关键要点 |
---|---|---|
打开文件 | open() | 根据场景选择模式(r /w /a /rb 等)。 |
读取文件 | read() , readline() , readlines() | 大文件优先逐行读取。 |
写入文件 | write() , writelines() | 注意换行符和文件关闭。 |
文件管理 | os.stat() , os.remove() | 处理前检查文件是否存在。 |