Python 实现Web请求与响应

目录

一、什么是Web请求与响应?

0. 概述

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)删除文件


一、什么是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()处理前检查文件是否存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值