Python实现Web请求与响应

web请求与响应

web请求与响应是web通信的基础。web请求由客户端发起,服务器处理后返回响应

web请求

web请求通常包括以下几个部分:

请求行:包括请求方法(如GET、POST、PUT、DELETE)、URL和HTTP协议版本(如HTTP/1.1)
请求头:包含关于客户端信息,请求体类型,浏览器类型等的元数据
请求体:在POST请求中包含用户提交的数据,如表单数据或文件

web响应

web响应由服务器返回,通常包括以下几个部分:

响应行:包括 HTTP 协议版本、状态码和状态消息。
响应头:包括关于响应的信息,如内容类型、服务器信息等。
响应体:包含实际返回的数据(如 HTML页面、JSON数据等)

HTTP协议概述

HTTP(Hypertext Transfer Protocol)是Web 上传输数据的协议,负责浏览器与服务器之间的通
信。常见的 HTTP 方法有:

GET:请求服务器获取资源,通常用于读取数据。
POST:提交数据到服务器,通常用于表单提交、文件上传等,
PUT:更新服务器上的资源。
DELETE:删除服务器上的资源

常见的 HTTP 状态码包括:

200 OK:请求成功,服务器返回所请求的数据。
301 Moved Permanently:资源已永久移动。
404 Not Found:请求的资源不存在。
500 Internal Server Error:服务器内部错误

python的requests库

python的requests库是发送HTTP请求和处理响应的最常用工具,它提供了简单、直观的API,使得web请求和响应的操作变得非常容易。通过requests,我们可以轻松的发送GET、POST请求,处理JSON响应,管理请求头等。

安装requests库

在这里插入图片描述

发送GET请求

GET请求通常用于获取数据。我们通过request.get()来发送GET请求,并可以处理返回的响应

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
代码解释:

**requests.get()**用于发送 GET请求,获取指定 URL的数据,
response.status code 获取 HTTP 响应状态码,
response.text 获取响应的正文内容(通常是 HTML或 JSON 数据)
response.headers 获取响应头
len(response.text)返回响应正文的长度,帮助我们了解返回内容的大小.

发送POST请求

POST请求用于将数据提交到服务器,通常用于表单提交或上传文件。我们使用requests.post()来发送POST请求
在这里插入图片描述

requests.post()用于发送 POST请求,将数据提交到服务器。
data参数是一个字典,包含了我们要提交的数据。requests 会自动将其编码为application/x-www-fomm-urlencoded 格式.
response.json()用于解析返回的 JSON 数据.

处理响应头和状态码

响应头提供了关于服务器的信息,状态码则告诉我们请求是否成功,可以通过response.headers获取响应头,通过response.status_code获取状态码

在这里插入图片描述
在这里插入图片描述

response.headers 返回响应头,包含如 Content-Type、Date、Server 等信息。
response.status code 返回 HTTP 状态码,
response.headers.get('Content-Type’)获取响应的内容类型(如 text/html、application/json)

发送带查询参数的GET请求

在GET请求中,可以通过URL传递查询参数
在这里插入图片描述

params是一个字典,包含要传递的查询参数。requests.get()会自动将这些参数编码到URL中。

发送带表单数据的POST请求

POST请求可以用来提交表单数据
在这里插入图片描述

data参数是一个字典,包含表单提交的数据,requests 会自动将数据编码为application/x-www-fomm-urlencoded格式.

处理JSON响应

许多web API返回的数据格式是JSON,python的requests库提供了方便的JSON处理方法
在这里插入图片描述

代码解释:
response.json(将响应的内容解析为 Python 字典,方便我们处理 JSON 数据.

文件操作

文件操作是 Python编程中常见的任务。Python提供了多种方法来读取、写入和管理文件,能够处理文本文件、二进制文件以及目录操作等。掌握文件操作的基础和技巧是高效编程的关键。

1:打开文件的模式

Python使用内置的 open()函数来打开文件。打开文件时,我们需要指定文件模式(即操作文件的方式)。常见的文件模式如下:

(1)常见的文件打开模式

r:只读模式(默认模式)。文件必须存在。如果文件不存在,会抛出FileNotFoundError 异常。
w:写入模式。如果文件存在,会覆盖文件内容。如果文件不存在,会创建新文件。
a:追加模式。如果文件存在,写入的数据会追加到文件末尾;如果文件不存在,会创建新文件。
x:独占创建模式。若文件已存在,操作会失败并抛出 FileExistsError 异常。此模式通常用于创建文件时防止覆盖现有文件。
x:独占创建模式。若文件已存在,操作会失败并抛出 FileExistsError异常。此模式通常用于创建文件时防止覆盖现有文件。
rb:二进制读取模式,用于读取非文本文件(如图片、音频文件)。
wb:二进制写入模式,用于写入非文本文件。
r+:读写模式。文件必须存在。既可以读取文件内容,也可以写入数据
w+:读写模式。如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件。
a+:读写模式。文件存在时,数据会追加到文件末尾;如果文件不存在,会创建新文件。
rb+:二进制读写模式。

(2)打开文件并使用模式

以只读模式打开文件
在这里插入图片描述

以写入模式打开文件,文件内容会被覆盖
在这里插入图片描述
以追加模式打开文件,新的内容会被追加到文件末尾
在这里插入图片描述

2.读取文件

pyython中的文件读取功能非常强大

(1)read()方法

read()方法用于读取文件中的所有内容。读取后的内容会作为字符串返回
在这里插入图片描述

(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.写入文件

python提供了几种将数据写入文件。写入操作常用于日志记录,数据导出等场景

(1)使用write()方法写入文件

write()方法将指定的字符串写入文件。若文件以w模式打开,原文件内容会被覆盖;若以a模式打开内容会被追加到文件末尾。

with open('output.txt','w') as file:
  file.write("这是第一行数据。\n")
  file.write("这是第二行数据。\n")

(2)使用 writelines()方法写入多行数据
writelines()方法接受一个可选代对象(如列表、元组等),将其元素写入文件中,每个元素将作为一行写入文件。

lines =["第一行数据。\n""第二行数据。\n""第三行数据。\n"]
with open('output.txt','w') as file:
  file.writelines(lines)

4.下载文件示例

我们可以通过requests库来下载文件,并将其保存到本地

import requests
url='https://www.example.com/image.jpg’ #图片URLresponse=requests.get(url)
#检查请求是否成功
if response.status code == 200:
#使用二进制模式写入文件

import requests
url='https://www.example.com/image.jpg’ #图片URLresponse=requests.get(url)
#检查请求是否成功
if response.status code == 200:
#使用二进制模式写入文件


import requests
url='https://www.example.com/image.jpg’ #图片URLresponse=requests.get(url)
#检查请求是否成功
if response.status code == 200:
#使用二进制模式写入文件
with open('downloaded image.jpg','wb')as file:
file.write(response.content)
print("图片下载成功!")
else:
print(f"下载失败,状态码:{response.status_code}")

5.文件操作中的注意事项

在进行文件操作时,需要注意以下几个问题:
文件是否存在:在打开文件时,必须确保文件路径正确。如果文件不存在,可以使用 os.path.exists()检查文件是否存在,或者使用try-except捕获FileNotFoundError异常。

import os
if os.path.exists('example.txt'):with open('example.txt','r')as file:content = file.read()
else:
print("文件不存在!")

文件权限:在操作文件时,可能会遇到权限不足的问题。例如,尝试写入只读文件,或访问没有读取权限的文件。在这种情况下,可以使用try-except来捕获 PermissionError 异常

try:
  with open('readonly_file.txt','w') as file:
    file.write("尝试写入只读文件")
except PermissionError:
  print("杈限不足,无法写入文件。")![

文件自动关闭:使用with open()语句时,Python会自动管理文件的打开和关闭,无需显式调用file.close()。这有助于避免文件未关闭的问题,减少资源泄漏的风险。

6.其他常用文件操作

(1)获取文件信息

Python提供了os和os.path 模块,可以获取文件的大小、修改时间等信息。

import os

file path ='example.txt"
print("文件大小:",os.path.getsize(file_path)"字节")
print("文件修改时间:",os.path.getmtime(file_path))

(2)删除文件

使用os.remove()可以删除文件:

import os

file path='example.txt
if os.path.exists(file path):
  os.remove(file path)
  print(f"{file_path} 已删除!")
else:
  print("文件不存在!")

错误处理与异常捕获

try语句用于捕获和处理异常,它由三部分组成:

try块:包含可能会引发异常的代码。当代码运行过程中发生错误时,程序会跳到相应的 except
块进行处理。
except块:当try块中的代码出现异常时,程序会跳转到except块执行。在 except 中可以指定要捕获的异常类型,如Timeout、HTTPError 等
else 块(可选):如果try块中的代码没有抛出异常,则会执行 else块中的代码.
finally块(可选):无论是否发生异常,finally 块中的代码都会执行,通常用于清理资源(如关闭文件、数据库连接等)。

捕获常见异常

import requests
from requests.exceptions import RequestException, Timeout, HTTPError
try:
#发送 GET请求,并设置超时时间为5秒
response =requests.get("https://www.example.com',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 reg 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 异常,并打印“Requesttimed out"
HTTPError:如果响应的状态码表明出现 HTTP 错误(例如 404表示未找到页面),程序会捕获
到 HTTPError 异常,并打印相关错误信息
RequestException:捕获其他类型的网络相关错误(如连接问题、DNS 解析失败等)
RequestException 是所有 requests 库异常的基类,可以捕获任何requests 库抛出的异常,
3. finally 块:finally 中的代码无论是否发生异常都会被执行。通常用于释放资源或做一些收尾工作。这里我们仅打印“Request attempt completed.”表示请求的结束。

异常处理总结:

异常处理让我们在程序运行中捕获到错误并做出相应处理,避免程序崩溃。
通过 try…except结构,可以精确捕获并处理不同类型的异常。
finally块用于清理工作,在请求处理完成后可以释放资源(如关闭文件、数据库连接等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值