目录
一、什么是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 请求与响应?
Web请求与响应是 Web 通信的基础。Web 请求由客户端发起,服务器处理后返回响应。
1、Web 请求
Web 请求通常包括以下几个部分:
请求行 | 包括请求方法(如 GET、POST、PUT、DELETE)、URL和 HTTP 协议版本(如 HTTP/1.1)。 |
请求头 | 包含关于客户端信息、请求体类型、浏览器类型等的元数据。 |
请求体 | 在 POST 请求中包含用户提交的数据,如表单数据或文件。 |
2、web 响应
Web 响应由服务器返回,通常包括以下几个部分:
响应行 | 包括 HTTP 协议版本、状态码和状态消息。 |
响应头 | 包括关于响应的信息,如内容类型、服务器信息等。 |
响应体 | 包含实际返回的数据(如 HTML页面、JSON数据等)。 |
3、HTTP协议概述
HTTP (Hypertext Transfer Protocol)是Web 上传输数据的协议,负责浏览器与服务器之间的通
信。常见的 HTTP 方法有:
GET | 请求服务器获取资源,通常用于读取数据。 |
POST | 提交数据到服务器,通常用于表单提交、文件上传等。 |
PUT | 更新服务器上的资源 |
DELETE | 删除服务器上的资源。 |
4、常见的HTTP状态码包括
200 OK | 请求成功,服务器返回所请求的数据。 |
301 Moved Permanently | 资源已永久移动。 |
404 Not Found | 请求的资源不存在。 |
500 Internal Server Error | 服务器内部错误。 |
二、Python 的requests库
Python的 requests 库是发送 HTTP 请求和处理响应的最常用工具,它提供了简单、直观的 API,使得 Web 请求和响应的操作变得非常容易。通过requests,我们可以轻松地发送 GET、POST请求处理JSON 响应,管理请求头等。
1、安装requests库
pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple #添加国内更新源
pip3 config set install.trusted-host mirrors.aliyun.com/pypi/simple #设置信任更新源
pip3 install --upgrade pip #测试更新源
pip3 install requests #安装requests
2、发送GET请求
GET 请求通常用于获取数据。我们通过requests.get()来发送 GET 请求,并可以处理返回的响应。
import requests
#发送GET请求
response=requests.get('https://httpbin.org/get')
#输出响应的状态码
print('状态码:',response.status_code)
#输出响应的内容
print('响应内容:',response.text)
#输出响应头
print('响应头:',response.headers)
#获取响应内容的长度
print('头部长度:',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
url='https://httpbin.org/post'
data={'name':'zhangsan','age':20}
response=requests.post(url,data=data)
print('状态码:',response.status_code)
print(response.json())
代码解释:
requests.post() | 用于发送 POST请求,将数据提交到服务器。 |
data参数 | 是一个字典,包含了我们要提交的数据。requests 会自动将其编码为application/x-www-form-urlencoded 格式。 |
response.json() | 用于解析返回的 JSON 数据. |
4、处理响应头和状态码
响应头提供了关于服务器的信息,状态码则告诉我们请求是否成功。我们可以通过response.headers获取响应头,通过response.status_code 获取状态码。
import requests
response=requests.get('https://httpbin.org/get')
print('响应头:',response.headers)
print('状态码:',response.status_code)
print('内容类型:',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
url='https://httpbin.org/post'
params={'name':'zhangsan','age':20}
response=requests.get(url,params=params)
print('响应内容:',response.json())
代码解释:
params | 是一个字典,包含要传递的査询参数。 |
requests.get() | 会自动将这些参数编码到 URL中。 |
6、发送带表单数据的POST 请求
POST请求可以用来提交表单数据,下面的例子展示了如何使用requests 发送带表单数据的POST 请求。
import requests
url='https://httpbin.org/post'
data={'username':'testuser','password':'mypassword'}
response=requests.post(url,data=data)
print('响应的内容:',response.json())
代码解释:
data 参数是一个字典,包含表单提交的数据,requests 会自动将数据编码为application/x-www-fomm-urlencoded格式。
三、处理JSON响应
许多 Web API 返回的数据格式是JSON, Python 的 requests 库提供了方便的 JSON 处理方法。
import requests
url='https://httpbin.org/post'
response=requests.get(url)
data=response.json()
print('用户登录',data['login'])
print('用户名',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('111.txt','r') as file:
content=file.read()
print(content)
#以写入模式打开文件,文件内容会被覆盖
with open('111.txt','w') as file:
file.write('nihao!\n')
#以追加模式打开文件,新的内容会追加到文件末尾
with open('111.txt','a') as file:
file.write('nihao,zhangsan\n')
#以二进制模式打开文件(例如读取图片)
with open('image.jpg','rb') as file:
binary_data=file.read()
print("读取到的二进制数据:",binary_data[:20])
2、读取文件
Python中的文件读取功能非常强大。以下是几种常见的读取方式:
(1)read()方法
read()方法用于读取文件中的所有内容。读取后的内容会作为字符串返回。
with open('111.txt','r') as file;
content=file.read()
print(content)
(2)readline()方法
readline()方法每次读取一行文件内容,适用于需要逐行处理文件的情况。
with open('111.txt','r') as file;
content=file.readline()
while line:
print(line.strip()) #strip()用来去除行末的换行符
line=file.readline()
(3)readlines()方法
readlines()方法会一次性读取文件中的所有行,并将每行数据存储为一个列表的元素,适用于需要读取整个文件并进行行处理的情况。
with open('111.txt','r') as file;
lines=file.readlines()
for line in lines:
print(line.strip())
3、写入文件
Python提供了几种方法将数据写入文件。写入操作常用于日志记录、数据导出等场景。
(1)使用write()方法写入文件
write()方法将指定的字符串写入文件。若文件以w模式打开,原文件内容会被覆盖;若以a模式打开,内容会被追加到文件末尾。
with open('111.txt','w') as file:
file.write('第一行 \n')
file.write('第二行 \n')
(2)使用writelines()方法写入多行数据
writelines()方法接受一个可选代对象(如列表、元组等),将其元素写入文件中,每个元素将作为一行写入文件。
lines=["第一行 \n","第二行 \n","第三行 \n"]
with open('111.txt','w') as file:
file.writelines(lines)
4、下载文件示例
我们可以通过requests库来下载文件,并将其保存到本地。例如,下载一个图片文件:
import requests
url='https://img-s.msn.cn/tenant/amp/entityid/AA1Faw8x.img?w=600&h=337&m=6'
#https://img-s.msn.cn/tenant/amp/entityid/AA1Faw8x.img?w=600&h=337&m=6为图片URL(网上随便点的链接,时间久了可能用不了了,换一个就行)
response=requests.get(url)
#检查请求是否成功
if response.status_code==200:
#使用二进制模式写入文件
with open('123456.jpg','wb') as file:
file.write(response.content)
print('图像下载成功')
else:
print('下载失败')
5、文件操作中的注意事项
在进行文件操作时,需要注意以下几个问题:
文件是否存在:在打开文件时,必须确保文件路径正确。如果文件不存在,可以使用 os.path.exists()检查文件是否存在,或者使用try-except捕获FileNotFoundError异常。
import os
if os.path.exists('111.txt'):
with op('111.txt','r') as file:
content=file.read()
else:
print("文件不存在!")
文件权限:在操作文件时,可能会遇到权限不足的问题。例如,尝试写入只读文件,或访问没有读取权限的文件。在这种情况下,可以使用try-except来捕获PermissionError 异常。
try:
with open('111.txt','w') as file:
file.write("尝试写入只读文件”)
except PermissionError:
print("杈限不足,无法写入文件。")
文件自动关闭:使用with open()语句时,Python会自动管理文件的打开和关闭,无需显式调用file.close()。这有助于避免文件未关闭的问题,减少资源泄漏的风险。
6、其他常用文件操作
(1)获取文件信息
Python提供了os 和os.path 模块,可以获取文件的大小、修改时间等信息。
import os
file_path='111.txt'
print("文件大小:",os.path.getsize(file_path),"字节")
print("文件修改时间:",os.path.getmtime(file_path))
(2)删除文件
使用os.remove()可以删除文件:
import os
file_path='111.txt'
if os.path.exists(file_path):
os.remove(file_path)
print(f"{file_path} 已删除!")
else:
print("文件不存在!")
五、错误处理与异常捕获
在进行Web 请求时,可能会发生各种错误,例如网络超时、服务器错误等。requests 库通过异常处理机制帮助我们捕获这些错误。Python 的 try语句能够捕获和处理代码块中的异常,从而避免程序崩溃,并且提供了处理错误的机会。
1、try语句的使用
try语句用于捕获和处理异常,它由以下几部分组成:
try块 | 包含可能会引发异常的代码。当代码运行过程中发生错误时,程序会跳到相应的except块进行处理。 |
except块 | 当 try块中的代码出现异常时,程序会跳转到except块执行。在 except 中可以指定要捕获的异常类型,如 Timeout、HTTPError 等。 |
else 块(可选) | 如果try块中的代码没有抛出异常,则会执行else 块中的代码。 |
finally块(可选) | 无论是否发生异常,finally 块中的代码都会执行,通常用于清理资源(如关闭文件、数据库连接等) |
2、示例 :捕获常见异常
import requests
from requests.exceptions import RequestException,Timeout,HTTPError
try:
#发送 GET请求,并设置超时时间为 5秒
response=requests.get('https://httpbin.org',timeout=5)
#如果状态码不是 200,抛出 HTTPError 异常
response.raise_for_status() #如果状态码是 404或 500,抛出异常
#如果请求成功,则输出响应内容
print('Response Body:', response.text)
#捕获请求超时异常
except Timeout:
print('Request timed out")
#捕获 HTTP 错误(如状态码 404、500等)
except HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
#捕获其他网络相关的错误
except RequestException as req_err:
print(f'Request error occurred: {reg_err}')
#可以在 finally 块中清理资源(如关闭文件或连接)
finally:
print('Request attempt completed.')
代码解释:
1、try 块:首先发起 HTTP请求,设置超时时间为5秒,并使用response.raise_for_status()来检查响应的状态码。如果服务器返回了错误的状态码(如 404、500),raise_for_status()会抛出HTTPError 异常。
2、except 块:
- Timeout:如果请求超时(超过设置的5秒),程序会捕获到Timeout 异常,并打印“Request timed out”。
- HTTPEror:如果响应的状态码表明出现 HTTP 错误(例如 404 表示未找到页面),程序会捕获到 HTTPError 异常,并打印相关错误信息。
- Request Exception:捕获其他类型的网络相关错误(如连接问题、DNS 解析失败等)RequestException 是所有 requests 库异常的基类,可以捕获任何 requests 库抛出的异常
3、finally块:finally 中的代码无论是否发生异常都会被执行,通常用于释放资源或做一些收尾工作。这里我们仅打印“Request attempt completed”表示请求的结束。
异常处理总结:
- 异常处理让我们在程序运行中捕获到错误并做出相应处理,避免程序崩溃。
- 通过 try...except结构,可以精确捕获并处理不同类型的异常。
- finally 块用于清理工作,在请求处理完成后可以释放资源 (如关闭文件、数据库连接等)。