目录
Web请求与响应是Web通信的基础。Web请求由客户端发起,服务器处里后返回响应
web请求
Web请求通常包括以下几个部分:
请求行:包括请求方法(如GET、POST、PUT、DELETE)、URL和HTTP协议版本(如HTTP/1.1)。
请求头:包含关于客户端信息、请求体类型、浏览器类型等的元数据
请求体:在POST请求中包含用户提交的数据,如表单数据或文件
web响应
Web响应由服务器返回,通常包括以下几个部分:
响应行:包括HTTP协议版本、状态码和状态消息。
响应头:包括关于响应的信息,如内容类型、服务器信息等。
响应体:包含实际返回的数据(如HTML页面、JSON数据等)。
HTTP(Hypertext Transfer Protocol)是Web上传输数据的协议,负责浏览器与服务器之间的通信。常见的HTTP方法有:
GET:请求服务器获取资源,通常用于读取数据。
POST:提交数据到服务器,通常用于表单提交、文件上传等等。
PUT:更新服务器上的资源。
DELETE:删除服务器上的资源。
200OK:请求成功,服务器返回所请求的数据。
301Moved Permanently:资源已永久移动。
404NotFound:请求的资源不存在。
500 Internal Server Error:服务器内部错误。
Python的requests库是发送HTTP请求和处理响应的最常用工具,它提供了简单、直观的API,使得Web请求和响应的操作变得非常容易。通过requests,我们可以轻松地发送GET、POST请求,处理JSON响应,管理请求头等。
在使用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
pip3 install requests
GET请求通常用于获取数据。我们通过requests.get()来发送GET请求,并可以处理返回的响应。
import requests
response = requests.get("https://www.example.com')
print('Status Code:', response.status_code)
print(Response Body:', response.text)
print('Response Headers:', response.headers)
print("Content Length:', len(response.text))
requests.get()用于发送GET请求,获取指定URL的数据。
response.status_code获取HTTP响应状态码。
response.text获取响应的正文内容(通常是HTML或JSON数据)。
response.headers获取响应头。
len(response.text)返回响应正文的长度,帮助我们了解返回内容的大小。
POST请求用于将数据提交到服务器,通常用于表单提交或上传文件。我们使用requests.post()来发送POST请求
import requests
url = 'https://httpbin.org/post
data = {'name':"Alice',"age': 25}
print('Status Code:', response.status_code)
print('Response Body:', response.json())
requests.post()用于发送POST请求,将数据提交到服务器。
data参数是一个字典,包含了我们要提交的数据。requests会自动将其编码为
application/x-www-form-urlencoded格式。
response.json()用于解析返回的JSON数据。
响应头提供了关于服务器的信息,状态码则告诉我们请求是否成成功。我们可以通过
response.headers获取响应头,通过response.status code获取状态码
import requests
response = requests.get('https://www.example.com')
print('Response Headers:', response.headers)
print('Status Code:', response.status_code)
print('Content-Type:', response.headers.get('Content-T)ype.)
response.headers返回响应头,包含如Content-Type、Date,Server等信息。
response.status_code返回HTTP状态码。
response.headers.get(Content-Type')获取响应的内容类型(如text/htm)I application/json)
在GET请求中,我们可以通过URL传递直询参数。例如,访可一个包含参数的URL。
import requests
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中
POST请求可以用来提交表单数据,下面的例子展示了如何使用requJests发送带表单数据的POST请求。
import requests
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格式。
许多WebAPI返回的数据格式是JSON,Python的requests库提供了方便的JSON处理方法
import requests
url = "https://api.github.com/users/octocat
response = requests.get(url)
data = response.json()
print('User Login:',data['login'])
print('User Name:',data['name'])
response.json()将响应的内容解析为Python字典,方便我们处理JSCDN数据
文件操作是Python编程中常见的任务。Python提供了多种方法来读取、写入和管理文件,能够处理文本文件、二进制文件以及目录操作等。掌握文件操作的基础和技巧是是高效编程的关键
Python使用内置的open()函数来打开文件。打开文件时,我们需要指定文件模式(即操作文件的方式)。常见的文件模式如下
r:只读模式(默认模式)。文件必须存在。如果文件不存在,会抛出FileNotFoundError异常。W:写入模式。如果文件存在,会覆盖文件内容。如果文件不存在,会创建新文件
a:追加模式。如果文件存在,写入的数据会追加到文件末尾;如果文件不存在,会创建新文件x:独占创建模式。若文件已存在,操作会失败并抛出FileExistsError异常。此模式通常用于创建文件时防止覆盖现有文件。rb:二进制读取模式,用于读取非文本文件(如图片、音频文件)。wb:二进制写入模式,用于写入非文本文件。读写模式。文件必须存在。既可以读取文件内容,也可以写入数据。读写模式。如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件。a+:读写模式。文件存在时,数据会追加到文件末尾;如果文件不存在,会创建新文件。rb+:二进制读写模式。
with open('example.txt', 'r')as file:
content = file.read
print(content)
with open('example.txt', 'w')as file:
file.write("这是新的文件内容。\n")
with open('example.txt', 'a') as file:
file.write("追加的内容。\n")
with open('image.jpg', 'rb') as file:
binary_data = file.read()
print("读取到的二进制数据:",binary_data[:20])
Python中的文件读取功能非常强大有常见的几种
read()方法用于读取文件中的所有内容。读取后的内容会作为字符串返回。
with open('example.txt', 'r') as file:
content = file.read()
print(content)
readline()方法每次读取一行文件内容,适用于需要逐行处理文件的情况
with open('example.txt', 'r')as file:
line = file.readline()
while line:
print(line.strip())
line = file.readline()
readlines()方法会一次性读取文件中的所有行,并将每行数据存储为一个列表的元素,适用于需要读取整个文件并进行行处理的情况。
with open('example.txt','r')as file:
lines = file.readlines ()
for line in lines:
print(line.strip())
Python提供了几种方法将数据写入文件。写入操作常用于日志记录、数据导出等场景
write()方法将指定的字符串写入文件。若文件以 模式打开,原文件内容会被覆盖;若以a模式打开,内容会被追加到文件末尾。
with open('output.txt','w')as file:
file.write("这是第一行数据。\n")
file.write("这是第二行数据。\n")
writelines()方法接受一个可选代对象(如列表、元组等),将其元素写入文件中,每个元素将作为一行写入文件。
lines=["第一行数据。\n","第二行数据。\n","第三行数据。\n"】
with open('output.txt', 'w')as file:
file.writelines(lines)
我们可以通过requests库来下载文件,并将其保存到本地。如下载一个图片文件
import requests
url = "https://www.example.com/image.jpg
response = requests.get(url)
if response.status_code ==200:
with open('downloaded image.jpg', 'wb') as file:
file.write(response.content)
else:
print(f"下载失败,状态码:{response.status_code}")
在进行文件操作时,需要注意以下几个问题:
文件是否存在:在打开文件时,必须确保文件路径正确。如果文件不存在,可以使用os.path.exists()检查文件是否存在,或者使用try-except捕获FileNotFoundError!异常。
import os
ifos.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("权限不足,无法写入文件。")
文件自动关闭:使用withopen()语句时,Python会自动管理文件的打开和关闭,无需显式调用
file.close()。这有助于避免文件未关闭的问题,减少资源泄漏的风险。
Python提供了os和os.path模块,可以获取文件的大小、修改时间等信息
import os
file_path = 'example.txt'
print("文件大小:",os.path.getsize(file_path),"字节")
print("文件修改时间:",os.path.getmtime(file_path))
使用os.remove()可以删除文件:
import os
file_path = 'example.txt'
if os.path.exists(file_path):
os.remove(file_path)
print(f"{file_path}已删除!")
else:
print("文件不存在!")
在进行Web请求时,可能会发生各种错误,例如网络超时、服务器错误等。requests库通过异常处理机制帮助我们捕获这些错误。Python的try语句能够捕获和处理我码快中的异常,从而避免程序崩溃,并且提供了处理错误的机会。
try语句用于捕获和处理异常,它由三部分组成:
try块:包含可能会引发异常的代码。当代码运行过程中发生错误时程序会跳到相应的except块进行处理。except块:当try块中的代码出现异常时,程序会跳转到except块执行在except中可以指定要捕获的异常类型,如Timeout、HTTPError等。
else块(可选):如果try块中的代码没有抛出异常,则会执行else块中的代码。
finally块(可选):无论是否发生异常,finally块中的代码都会执行通常用于清理资源(如关
闭文件、数据库连接等)。
import requests
from requests.exceptions import RequestException,Timeout,HTTPError
try:
response = requests.get('https://www.example.com',timeout=5)
response.raise_for_status
print(Response Body:', response.text)
except Timeout:
print('
Request timed out')
except HTTPError as http_err:
print(f'HTTP error occurred:{http_err}')
except RequestException as req_err:
print(f'Request error occurred:{req_err}')
finally:
print('Request attempt completed.')
1.try块:首先发起HTTP请求,设置超时时间为5秒,并使用response.raise_for_statusQ来检
查响应的状态码。如果服务器返回了错误的状态码(如404、500),aise_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块用于清理工作,在请求处理完成后可以释放资源(如关闭文件、数居库连接等)