Python 实现Web 请求与响应
目录
一:什么是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.文件操作中的注意事项
6.其他常用文件操作
(1)获取文件信息
(2)删除文件
五:错误处理与异常捕获
1.try语句的使用
2.示例:捕获常见异常
一:什么是Web 请求与响应?
1.web请求
定义:客户端(如浏览器)向服务器发送的获取资源或执行操作的请求。
组成部分:
- 请求行:包含请求方法(如 GET、POST)、URL、协议版本(如 HTTP/1.1)。
- 请求头:包含客户端信息(如 User-Agent)、请求参数(如 Content-Type)等。
- 请求体(可选):发送的数据(如表单数据、JSON),常见于 POST 请求。
2.web响应
定义:服务器接收到请求后返回给客户端的结果。
组成部分:
- 状态行:包含协议版本、状态码(如 200 OK)、状态描述。
- 响应头:包含服务器信息(如 Server)、数据类型(如 Content-Type)等。
- 响应体:返回的实际数据(如 HTML、JSON、文件内容)。
3.HTTP协议概述
超文本传输协议(HTTP) 是 Web 请求与响应的通信基础,基于 客户端 - 服务器模型,具有以下特点:
- 无状态:每次请求独立,服务器不保留客户端历史信息。
- 方法多样:常用方法包括 GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。
- 版本迭代:常见版本有 HTTP/1.1(主流)、HTTP/2(性能优化)、HTTP/3(基于 UDP 的 QUIC 协议)。
4.常见的HTTP状态码包括:
状态码 | 分类 | 说明 |
---|---|---|
200 | 成功 | 请求成功处理(如页面正常返回)。 |
201 | 成功 | 请求创建新资源成功(如用户注册)。 |
301 | 重定向 | 资源永久移动,自动跳转至新 URL。 |
400 | 客户端错误 | 请求语法错误(如参数缺失)。 |
401 | 客户端错误 | 未授权(需提供认证信息)。 |
403 | 客户端错误 | 禁止访问(权限不足)。 |
404 | 客户端错误 | 资源未找到(URL 错误)。 |
500 | 服务器错误 | 服务器内部错误(如代码崩溃)。 |
二:python的requests库
1.安装requests库
pip install requests
2.发送GET请求
GET 请求通常用于获取数据。我们通过 requests.get () 来发送 GET 请求,并可以处理返回的响应。
import requests# 发送 GET 请求
response = requests.get('https://www.example.com')# 输出响应的状态码
print('Status Code:', response.status_code)# 输出响应的内容
print('Response Body:', response.text)# 输出响应头
print('Response Headers:', response.headers)# 获取响应内容的长度
print('Content Length:', len(response.text))
代码解释:
- requests.get () 用于发送 GET 请求,获取指定 URL 的数据。
- response.status_code 获取 HTTP 响应状态码。
- response.text 获取响应的正文内容(通常是 HTML 或 JSON 数据)。
- response.headers 获取响应头。
- len (response.text) 返回响应正文的长度,帮助我们了解返回内容的大小 。
3.发送POST请求
POST 请求用于将数据提交到服务器,通常用于表单提交或上传文件。我们使用 requests.post () 来发送 POST 请求。
import requests# 发送 POST 请求
url = 'https://httpbin.org/post'
data = {'name': 'Alice', 'age': 25}
response = requests.post(url, data=data)# 输出响应状态码
print('Status Code:', response.status_code)# 输出响应内容(JSON 格式)
print('Response Body:', response.json())
代码解释:
- requests.post () 用于发送 POST 请求,将数据提交到服务器。
- data 参数是一个字典,包含了我们要提交的数据。requests 会自动将其编码为 application/x-www-form-urlencoded 格式。
- response.json () 用于解析返回的 JSON 数据。
4.处理响应头和状态码
响应头提供了关于服务器的信息,状态码则告诉我们请求是否成功。我们可以通过response.headers 获取响应头,通过 response.status_code 获取状态码。
import requests
# 发送GET请求
response = requests.get('https://www.example.com')# 获取响应头
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 数据。
四:文件操作
文件操作是 Python 编程中常见的任务。Python 提供了多种方法来读取、写入和管理文件,能够处理文本文件、二进制文件以及目录操作等。掌握文件操作的基础和技巧是高效编程的关键。
1.打开文件的模式
Python 使用内置的 open () 函数来打开文件。打开文件时,我们需要指定文件模式(即操作文件的方式)。常见的文件模式如下:
(1)常见的文件打开方式
- r:只读模式(默认模式)。文件必须存在。如果文件不存在,会抛出 FileNotFoundError 异常。
- w:写入模式。如果文件存在,会覆盖文件内容。如果文件不存在,会创建新文件。
- a:追加模式。如果文件存在,写入的数据会追加到文件末尾;如果文件不存在,会创建新文件。
- x:独占创建模式。若文件已存在,操作会失败并抛出 FileExistsError 异常。此模式通常用于创建文件时防止覆盖现有文件。
- rb:二进制读取模式,用于读取非文本文件(如图片、音频文件)。
- wb:二进制写入模式,用于写入非文本文件。
- r+:读写模式。文件必须存在。既可以读取文件内容,也可以写入数据。
- w+:读写模式。如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件。
- a+:读写模式。文件存在时,数据会追加到文件末尾;如果文件不存在,会创建新文件。
- rb+:二进制读写模式。
(2)示例:打开文件并使用模式
# 以只读模式打开文件
with open('example.txt', 'r') as file:content = file.read()print(content)# 以写入模式打开文件,文件内容会被覆盖
with open('example.txt', 'w') as file:file.write('这是新的文件内容。\n')# 以追加模式打开文件,新的内容会追加到文件末尾
with open('example.txt', 'a') as file:file.write('追加的内容。\n')# 以二进制模式打开文件(例如读取图片)
with open('image.jpg', 'rb') as file:binary_data = file.read()print('读取到的二进制数据:', binary_data[:20])
2.读取文件
Python 中的文件读取功能非常强大。以下是几种常见的读取方式:
(1)read()方法
read () 方法用于读取文件中的所有内容。读取后的内容会作为字符串返回。
with open('example.txt', 'r') as file:content = file.read()print(content)
(2)readline()方法
readline () 方法每次读取一行文件内容,适用于需要逐行处理文件的情况。
with open('example.txt', 'r') as file:line = file.readline()while line:print(line.strip()) # strip()用来去除行末的换行符line = file.readline()
(3)readlines()方法
readlines () 方法会一次性读取文件中的所有行,并将每行数据存储为一个列表的元素,适用于需要读取整个文件并进行行处理的情况。
with open('example.txt', 'r') as file:lines = file.readlines()for line in lines:print(line.strip())
3.写入文件
(1)使用write()方法写入文件
Python 中使用open()
函数打开文件时,若指定模式为'w'
(写入模式)、'w+'
(读写模式,文件不存在则创建)或'a'
(追加模式) 、'a+'
(追加读写模式)等可写模式,就可以通过文件对象的write()
方法写入内容。write()
方法接受一个字符串参数,将其写入文件。
示例代码:
with open('output.txt', 'w') as file:file.write("这是通过 write 方法写入的一行文字。\n")
(2)writelines()方法写入多行数据
writelines()
方法用于将一个字符串序列(如列表,其中每个元素为一行字符串)写入文件。它不会自动添加换行符,需要在字符串中自行包含。
示例代码:
lines = ["第一行内容\n", "第二行内容\n", "第三行内容\n"]
with open('output.txt', 'a') as file:file.writelines(lines)
4.下载文件示例
使用 Python 的requests
库可以实现文件下载。以下是从指定 URL 下载文件并保存到本地的示例:
import requestsurl = "https://example.com/some_file.jpg" # 替换为实际文件 URL
local_filename = 'downloaded_file.jpg'
response = requests.get(url, stream=True)
with open(local_filename, 'wb') as file:for chunk in response.iter_content(chunk_size=8192):if chunk:file.write(chunk)
上述代码中,stream=True
使请求以流的形式获取数据,iter_content()
按指定块大小迭代读取响应内容,然后逐块写入本地文件。
5.文件操作中的注意事项
- 文件打开模式选择:根据需求正确选择文件打开模式,如读取用
'r'
,写入用'w'
或'a'
等,避免因模式错误导致数据丢失或操作失败。 - 文件关闭:使用完文件后要确保关闭,
with
语句是一种安全简便的方式,可自动管理文件关闭,防止资源泄漏。若不使用with
,记得手动调用file.close()
。 - 权限问题:确保程序运行有足够权限对文件进行相应操作,如写入、删除等,否则会引发权限错误。
6.其他常用文件操作
(1)获取文件信息
可以使用os
模块获取文件相关信息,例如文件大小、修改时间等。示例代码:
import osfile_path = 'example.txt'
file_size = os.path.getsize(file_path) # 获取文件大小(字节数)
modified_time = os.path.getmtime(file_path) # 获取文件最后修改时间(时间戳)
print(f"文件大小: {file_size} 字节,最后修改时间: {modified_time}")
(2)删除文件
使用os
模块的remove()
函数可以删除文件。示例代码:
import osfile_path = 'to_be_deleted.txt'
if os.path.exists(file_path):os.remove(file_path)print(f"{file_path} 已成功删除。")
else:print(f"{file_path} 不存在。")
五:错误处理与异常捕获
1.try语句的使用
try 语句用于捕获和处理异常,它由三部分组成:
- try 块:包含可能会引发异常的代码。当代码运行过程中发生错误时,程序会跳到相应的 except 块进行处理。
- except 块:当 try 块中的代码出现异常时,程序会就转到 except 块执行。在 except 中可以指定要捕获的异常类型,如 Timeout、HTTPError 等。
- else 块(可选):如果 try 块中的代码没有抛出异常,则会执行 else 块中的代码。
- finally 块(可选):无论是否发生异常,finally 块中的代码都会执行,通常用于清理资源(如关闭文件、数据库连接等)。
2.示例:捕获常见异常
下示例展示捕获文件打开失败(FileNotFoundError
)和类型错误(TypeError
) :
try:with open('nonexistent_file.txt', 'r') as file: # 尝试打开不存在的文件content = file.read()data = "string" + 1 # 会引发类型错误的操作
except FileNotFoundError as e:print(f"文件未找到异常: {e}")
except TypeError as e:print(f"类型错误异常: {e}")