目录
一,什么是Web请求与响应
1,Web请求
2,Web响应
3,HTTP协议概述
4,常见的HTTP状态码
二,使用requests处理请求与响应
1,准备工作
2,发送GET请求
3,发送POST请求
4,处理响应头和状态码
5,发送带查询参数的GET请求
6,发送带表单数据的POST请求
三,文件操作
1,常见的文件打开模式
2,打开文件并使用模式
3,读取文件
4,写入文件
5,下载文件示例
四,错误处理与异常捕获
1,使用try语句
2,通过示例来捕获异常
3,模拟异常开始捕获
4,使用finally块捕获异常
5,使用 Exception捕获所有异常
一,什么是Web请求与响应
Web应用已成为日常生活的重要组成部分。从浏览器访问网页到移动应用获取数据,Web 请求和响应无处不在。Web 请求是指客户发 Web 爬虫、API接口调用以及数据交互至关重要。端(如浏览器、应用程序)通过网络向服务器请求资源,而 Web 响应则是服务器返回的数据。
1,Web请求
主要包括以下几个部分:
- 请求行: 包括请求方法 (如 GET、POST、PUT、DELETE)、URL和 HTTP 协议版本(如 HTTP/1.1)
- 请求头: 包含关于客户端信息、请求体类型、浏览器类型等的元数据。
- 请求体: 在 POST请求中包含用户提交的数据,如表单数据或文件。
2,Web响应
Web响应由服务器返回,通常包括以下几个部分:
- 响应行: 包括 HTTP 协议版本、状态码和状态消
- 响应头: 包括关于响应的信息,如内容类型、服务器信息等。
- 响应体: 包含实际返回的数据(如 HTML页面、JSON 数据等)
3,HTTP协议概述
HTTP是Web上传输数据的协议,复制浏览器与服务器之间的通信,常见的HTTP方法有:
- GET: 请求服务器获取资源,通常用于读取数据。
- POST: 提交数据到服务器,通常用于表单提交、文件上传等,
- PUT:PUT:更新服务器上的资源
- DELETE: 删除服务器上的资源
4,常见的HTTP状态码
- 200OK: 提交数据到服务器,通常用于表单提交、文件上传等,
- 301: 永久重定向
- 404: 请求的资源不存在,
- 500: 服务器内部错误
二,使用requests处理请求与响应
在linux虚拟机进行操作
1,准备工作
##把 pip 的默认软件源修改为阿里云的镜像源
pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple##将阿里云的镜像源添加到受信任的主机列表中
pip3 config set install.trusted-host mirrors.aliyun.com##会将 pip 工具本身更新到最新版本
pip3 install --upgrade pip##安装requests库
pip3 install requests
2,发送GET请求
GET请求通常用于获取数据,通过requests.get()来发送GET请求,并可以处理返回的响应。
[root@localhost ~]# vim get.py
import requestsresponse = requests.get('https://httpbin.org/get')print('状态码:',response.status_code)
print('响应内容:',response.text)
print('响应头:',response.headers)
print('头部长度:',len(response.text))##运行get.py查看状态信息
[root@localhost ~]# python3 get.py
状态码: 200
响应内容: {"args": {}, "headers": {
...../省略部分内容
- requests.get():用于发送 GET 请求,获取指定 URL的数据,
- response.status_code:获取 HTTP 响应状态码。
- response.text:获取响应的正文内容(通常是 HTML或JSON 数据)
- response.headers:获取响应头
- len(response.text):返回响应正文的长度,帮助我们了解返回内容的大小,
3,发送POST请求
[root@localhost ~]# vim post.py
import requestsurl='https://httpbin.org/post' ##发送post请求
data={'name':'zhangsan','age':20}
response=requests.post(url,data=data)print('状态码:',response.status_code) ##输出响应状态码
print(response.json()) ##输出响应内容[root@localhost ~]# python3 post.py
状态码: 200
{'args': {}, 'data': '', 'files': {}, 'form': {'age': '20', 'name': 'zhangsan'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate',
......./省略部分内容
- requests.post():用于发送 POST请求,将数据提交到服务器,
- data:参数是一个字典,包含了我们要提交的数据。requests 会自动将其编码为application/x-www-form-urlencoded 格式
- response.json():用于解析返回的 JSON 数据.
4,处理响应头和状态码
响应头提供了关于服务器的信息,状态码则告诉我们请求是否成功。
[root@localhost ~]# vim aaa.py
import requestsresponse=requests.get('https://www.example.com')
print('响应头:',response.headers)
print('响应状态码:',response.status_code)
print('内容类型:',response.headers.get('Content-Type'))[root@localhost ~]# python3 aaa.py
响应头: {'Accept-Ranges': 'bytes', 'Content-Type': 'text/html', 'ETag': '"84238dfc8092e5d9c0dac8ef93371a07:1736799080.121134"', 'Last-Modified': 'Mon, 13 Jan 2025
...../省略部分内容
响应状态码: 200
内容类型: text/html
- response.headers:返回响应头,例如date,server等信息
- response.status_code:返回HTTP状态码
- response.headers.get('Content-Type'):获取响应的内容类型(text/html,application/json)
5,发送带查询参数的GET请求
在GET请求中,我们可以通过URL传递查询参数
[root@localhost ~]# vim bbb.py ##访问一个包含参数的URL
import requests
url='https://httpbin.org/get'
params={'name':'lisi','age':22}
response=requests.get(url,params=params)
print('响应内容:',response.json())[root@localhost ~]# python3 bbb.py
响应内容: {'args': {'age': '22', 'name': 'lisi'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate',
....../省略部分内容##params是一个字典,包含要传递的查询参数,requests.get()会自动将这些参数编码到URL中
6,发送带表单数据的POST请求
[root@localhost ~]# cat ccc.py
import requestsurl='https://httpbin.org/post'
data={'name':'zhangsan','password':'123456'}
response=requests.post(url,data=data)
print('响应内容:',response.json())[root@localhost ~]# python3 ccc.py
响应内容: {'args': {}, 'data': '', 'files': {}, 'form': {'name': 'zhangsan', 'password': '123456'}, 'headers': {'Accept': '*/*',
....../省略部分内容
- data 参数是一个字典,包含表单提交的数据,requests 会自动将数据编码为application/x-www-fomm-urlencoded格式。
三,文件操作
1,常见的文件打开模式
模式 | 作用 |
r | 只读模式(默认模式)。文件必须存在。如果文件不存在,会抛出FileNotFoundError 异常 |
w | 写入模式。如果文件存在,会覆盖文件内容。如果文件不存在,会创建新文件。 |
a | 追加模式。如果文件存在,写入的数据会追加到文件末尾;如果文件不存在,会创建新文件。 |
x | 追加模式。如果文件存在,写入的数据会追加到文件末尾;如果文件不存在,会创建新文件。 |
rb | 二进制读取模式,用于读取非文本文件(如图片、音频文件)。 |
wb | 二进制写入模式,用于写入非文本文件。 |
r+ | 读写模式。文件必须存在。既可以读取文件内容,也可以写入数据 |
w+ | 读写模式。如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件 |
a+ | 读写模式。文件存在时,数据会追加到文件末尾;如果文件不存在,会创建新文件 |
rb+ | 二进制读写模式 |
2,打开文件并使用模式
- 只读模式打开文件
##编辑file.py设置文件模式为只读
[root@localhost ~]# cat file.py
with open('/10.txt','r')as file:content=file.read()print(content)[root@localhost ~]# python3 file.py
zhangsan
lisi
wangwu
aaa
bbb
- 以写入模式打开文件,文件内容会被覆盖
[root@localhost ~]# cat file.py ##10.txt文件本身的内容会被覆盖
with open('/10.txt','w')as file: file.write('这是新的内容\n')[root@localhost ~]# python3 file.py
[root@localhost ~]# cat /10.txt
这是新的内容
- 追加模式打开文件,新的内容会追加到文件末尾
[root@localhost ~]# cat file.py
with open('/10.txt','a')as file:file.write('我是zhangsan \n') ##\n表示换行[root@localhost ~]# python3 file.py
[root@localhost ~]# cat /10.txt
这是新的内容
我是zhangsan
- 以二进制模式代开文件(例如读取图片)
[root@localhost ~]# ls ##准备好111.jpg图片文件
111.jpg [root@localhost ~]# cat a1.py
with open('111.jpg','rb')as file: ##文件放在当前目录下注意好路径binary_data=file.read()print('读取到的二进制数据:',binary_data[:20])##Python 中的切片操作,用于从 binary_data 这个二进制数据对象中提取前 20 个字节。##由于是图片类型的数据,无法在linux系统中展示出来
[root@localhost ~]# python3 a1.py
读取到的二进制数据: b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00'
3,读取文件
- read()方法
read()方法用于读取文件中的所有内容,读取后的内容会作为字符串返回。
[root@localhost 123]# cat a.py ##编辑用于read的方法读取的文件,前提是准备好file.txt
with open('file.txt','r')as file:content=file.read()print(content)[root@localhost 123]# python3 a.py
123
456
789
111
222
- readline()方法
readline()方法每次读取一行文件内容,适用于需要逐级处理文件的情况。
[root@localhost 123]# cat b.py
with open('file.txt','r')as file:line=file.readline() ##读取第一行while line: ##循环直到文件结束print(line.strip()) ##打印去除首位空白的行line=file.readline() ##读取下一行[root@localhost 123]# python3 b.py
123
456
789
111
222
- readlines()方法
[root@localhost 123]# cat b.py
with open('file.txt','r')as file:line=file.readlines() ##一次性读取所有行for line in line: ##遍历列表中的每行文本,strip() 去除每行首尾的空白字符print(line.strip())[root@localhost 123]# python3 b.py
123
456
789
111
222
4,写入文件
-
使用write()方法写入文件
[root@localhost 123]# cat file.txt ##准备好文件,放在当前目录下
123
456[root@localhost 123]# cat aaa.py ##使用write()方法指定字符串写入文件,以w模式打开,文件会被覆盖
with open('file.txt','w')as file:file.write('这是添加的第一行数据\n')file.write('这是添加的第二行数据\n')
[root@localhost 123]# python3 aaa.py [root@localhost 123]# cat file.txt
这是添加的第一行数据
这是添加的第二行数据[root@localhost 123]# cat aaa.py ##使用write()方法指定字符串写入文件,以a模式打开,文件会被覆盖
with open('file.txt','a')as file:file.write('这是添加的第三行数据\n')file.write('这是添加的第四行数据\n')
[root@localhost 123]# python3 aaa.py
[root@localhost 123]# cat file.txt
这是添加的第一行数据
这是添加的第二行数据
这是添加的第三行数据
这是添加的第四行数据
-
使用writelines()方法写入多行数据
[root@localhost 123]# cat bbb.py
lines=['第一行数据\n','第二行数据\n','第三行数据\n'] ##列表 lines 包含三个字符串,每个字符串末尾的 \n 表示换行符。
with open('file.txt','w')as file: ##以写入模式('w')打开文件。若文件不存在则创建;若已存在则清空内容。file.writelines(lines) ##将列表 lines 中的所有字符串直接写入文件。[root@localhost 123]# python3 bbb.py
[root@localhost 123]# cat file.txt
第一行数据
第二行数据
第三行数据
5,下载文件示例
[root@localhost 123]# cat download.py
import requests
url = 'https://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1305/16/c4/20990657_1368686545122.jpg' ##图片的url
response=requests.get(url)
if response.status_code==200: ##检查请求是否成功with open('downloaded_image.jpg','wb')as file: ##使用二进制的模式写入文件file.write(response.content)print('图片下载成功!') ##输出提示信息(下载失败,下载成功)
else:print('下载失败') [root@localhost 123]# python3 download.py
图片下载成功![root@localhost 123]# ls ##下载成功后传输到win系统查看,linux无法查看
downloaded_image.jpg
四,错误处理与异常捕获
在进行Web 请求时,可能会发生各种错误,例如网络超时、服务器错误等。requests 库通过异常处理机制帮助我们捕获这些错误。Python 的 try语句能够捕获和处理代码块中的异常,从而避免
程序崩溃,并且提供了处理错误的机会。
1,使用try语句
try语句用于捕获和处理异常,
- try快:包含可能会引发异常的代码。当代码运行过程中发生错误时,程序会跳到相应的except块进行处理。
- except快:当 try块中的代码出现异常时,程序会跳转到except块执行。在 except 中可以指定要捕获的异常类型。
- else快(可选):如果try块中的代码没有抛出异常,则会执行 else块中的代码。
- finally快(可选):无论是否发生异常,finally 块中的代码都会执行,通常用于清理资源。
2,通过示例来捕获异常
[root@localhost ~]# vim error.py ##定义一个用于测试的除法运算
print('开始一个除法运算')while True:str1='请输入第一个整数\n'str2='请输入第二个整数\n'op1=int(input(str1))op2=int(input(str2))result=op1/op2print(result)[root@localhost ~]# python3 error.py ##运行正常
开始一个除法运算
请输入第一个整数
10
请输入第二个整数
2
5.0
3,模拟异常开始捕获
[root@localhost ~]# python3 error.py ##由于0不能被除,所以会报错
开始一个除法运算
请输入第一个整数
10
请输入第二个整数
0ZeroDivisionError ##将报错信息复制出来try: ##添加try语句,捕获以下语句的异常op1=int(input(str1))op2=int(input(str2))result=op1/op2print(result)except ZeroDivisionError: ##添加报错信息,使得屏幕输出错误提示print('你输入的数字有问题')##进行验证
[root@localhost ~]# python3 error.py
开始一个除法运算
请输入第一个整数
10
请输入第二个整数
0
你输入的数字有问题
4,使用finally块捕获异常
[root@localhost ~]# vim error.py try:op1=int(input(str1))op2=int(input(str2))result=op1/op2print(result)finally: ##添加两行print('出错了')##进行验证,可以看到脚本运行正常也会提示
[root@localhost ~]# python3 error.py
开始一个除法运算
请输入第一个整数
10
请输入第二个整数
2
5.0
出错了
5,使用 Exception捕获所有异常
try:op1=int(input(str1))op2=int(input(str2))result=op1/op2print(result)except Exception: ##可以将except后面的内容改为Exception来捕获所有的异常print('你输入的数字有问题')