Python 实现web请求与响应

目录

[一、什么是web 请求与响应?](#一、什么是web 请求与响应?)

[1、Web 请求](#1、Web 请求)

[2、web 响应](#2、web 响应)

3、HTTP协议概述

4、常见的HTTP状态码包括

[二、Python 的requests库](#二、Python 的requests库)

1、安装requests库

2、发送GET请求

3、发送POST请求

4、处理响应头和状态码

5、发送带查询参数的GET请求

[6、发送带表单数据的POST 请求](#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、示例 :捕获常见异常](#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 块用于清理工作,在请求处理完成后可以释放资源 (如关闭文件、数据库连接等)。
相关推荐
Uncertainty!!23 分钟前
C++系统IO
开发语言·c++
玉笥寻珍31 分钟前
从零开始:Python语言进阶之多态
开发语言·python
长勺32 分钟前
单例模式总结
java·开发语言·单例模式
缘友一世39 分钟前
PyTorch中TensorBoardX模块与torch.utils.tensorboard模块的对比分析
人工智能·pytorch·python
缘友一世42 分钟前
TensorBoard安装与基本操作指南(PyTorch)
人工智能·pytorch·python
谷晓光1 小时前
在Mac中使用pyenv管理Python版本:从安装到虚拟环境的全流程指南
python·elasticsearch·macos
CAT_cwds1 小时前
使用MybatisPlus实现sql日志打印优化
数据库·python·sql
ZFJ_张福杰1 小时前
【Flutter】多语言适配-波斯语RTL从右到左
java·开发语言
tanyongxi661 小时前
C++ 继承详解:基础篇(含代码示例)
开发语言·c++
yaoxin5211231 小时前
86. Java 数字和字符串 - 数字
java·开发语言