文章目录
requests 是一个非常流行的 Python HTTP 库,用于发送所有类型的 HTTP 请求。它简洁易用,能够处理复杂的请求场景,如保持会话、处理 cookies、上传文件等。本篇只对GET和POST做简单说明,其他请求类似。
安装
要在 Python 中使用 requests 库,首先需要安装它。可以使用以下指令进行安装:
bash
pip install requests
如果遇到网络环境导致下载失败,可以使用国内第三方镜像站进行安装,这里使用的是阿里云镜像:
bash
pip install requests -i https://mirrors.aliyun.com/pypi/simple
基本用法
测试网站
在接下来的代码示例中,会使用到 httpbin.org 工具。httpbin.org 是一个专门用于测试 HTTP 请求的服务网站。这个网站由 Kenneth Reitz 创建,目的是为开发者提供一个简单的工具来测试和调试各种 HTTP 请求。你可以使用它来发送各种类型的 HTTP 请求(如 GET、POST、PUT、DELETE 等),并查看服务器返回的内容。
以下是 httpbin.org 提供的一些常见测试端点:
- /get:用于测试 GET 请求。它会返回你发送的查询参数、请求头等信息。
- /post:用于测试 POST 请求。你可以发送表单数据或 JSON 数据,并查看服务器返回的数据。
- /status/:code:用于测试不同的 HTTP 状态码。例如,/status/404 会返回一个 404 状态码。
- /redirect/:n:用于测试重定向。/redirect/3 会重定向 3 次。
- /cookies 和 /cookies/set:用于测试 cookie 的处理。
- /delay/:seconds:用于测试请求延迟。它会延迟指定的秒数后再响应。
- /basic-auth/:user/:passwd:用于测试基本 HTTP 身份验证。
当你在开发过程中需要测试各种 HTTP 行为时。例如,你可以使用它来验证你的客户端是否正确处理重定向、身份验证、请求头、响应格式等。
发送GET请求
GET 请求用于从服务器获取数据。最简单的形式如下:
python
import requests
response = requests.get('http://httpbin.org/get')
print(response.status_code) # 输出状态码,例如 200
print(response.text) # 输出响应内容
发送POST请求
POST 请求通常用于提交数据到服务器,例如提交表单数据。
python
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
res = requests.post(url="http://httpbin.org/post",data=payload)
print(res.json())
更多请求
requests.get(url, params=None, **kwargs)
: 发送一个HTTP GET请求,并返回一个Response对象。可以使用params参数传递查询参数,也可以使用**kwargs参数传递其他的请求参数,如headers、timeout等。requests.post(url, data=None, json=None, **kwargs)
: 发送一个HTTP POST请求,并返回一个Response对象。可以使用data参数传递表单数据,也可以使用json参数传递JSON数据,还可以使用**kwargs参数传递其他的请求参数,如headers、timeout等。requests.put(url, data=None, **kwargs)
: 发送一个HTTP PUT请求,并返回一个Response对象。可以使用data参数传递请求数据,也可以使用**kwargs参数传递其他的请求参数,如headers、timeout等。requests.delete(url, **kwargs)
: 发送一个HTTP DELETE请求,并返回一个Response对象。可以使用**kwargs参数传递请求参数,如headers、timeout等。requests.head(url, **kwargs)
: 发送一个HTTP HEAD请求,并返回一个Response对象。可以使用**kwargs参数传递请求参数,如headers、timeout等。requests.options(url, **kwargs)
: 发送一个HTTP OPTIONS请求,并返回一个Response对象。可以使用**kwargs参数传递请求参数,如headers、timeout等。requests.exceptions
: requests库的异常类,如Timeout、ConnectionError等,可以用于捕获请求过程中可能出现的异常情况。
请求参数
可以通过 params 参数将查询参数添加到 URL 中,params 用于添加 URL 查询参数。这些参数会附加在 URL 后面,格式为 key=value,多个参数之间用 & 分隔。
python
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get(url, params=params)
发送的实际请求 URL 会是:
python
https://api.example.com/data?key1=value1&key2=value2
请求头
自定义请求头可以通过 headers 参数传递。用于设置 HTTP 请求头。它用来传递额外的信息给服务器。可以把它想象成你写信时附上的说明,比如告诉收信人你是谁、信的内容类型等。
python
import requests
headers = {'User-Agent': 'my-app/0.0.1'}
response = requests.get('https://httpbin.org/get', headers=headers)
print(response.text)
其他常用请求属性
-
timeout :用于设置请求的超时时间,单位是秒。如果请求超过指定时间未完成,会抛出
requests.exceptions.Timeout
异常。 -
auth:用于处理 HTTP 身份验证。比如,当你访问某个网页时,可能会弹出一个窗口要求输入用户名和密码,这就是一种基本的 HTTP 身份验证。假设你要访问一个需要登录的 API 或网页,你需要提供正确的用户名和密码,服务器才会允许你访问。
pythonfrom requests.auth import HTTPBasicAuth response = requests.get(url, auth=HTTPBasicAuth('user', 'pass'))
HTTPBasicAuth 是处理基本身份验证的简单方法,特别适合用来访问那些需要用户名和密码的简单 API 或网页。
-
cookies:用于发送 HTTP cookies,可以是一个字典。是服务器与客户端之间交换的小型数据,用于记住用户的信息和状态。
处理响应
请求会返回一个 Response 对象,该对象包含了服务器返回的数据和状态信息。
响应状态码
status_code
属性用于获取 HTTP 响应状态码,如 200(成功)、404(未找到)、500(服务器错误)等:
python
if response.status_code == 200:
print('Success!')
elif response.status_code == 404:
print('Not Found.')
响应内容
requests 提供了多种方式获取响应内容:
- text:返回响应内容的字符串形式。它自动将响应的字节数据解码为 Unicode 字符串,使用的是 HTTP 响应头中指定的字符编码(通常是 UTF-8)。
- content:返回响应内容的二进制形式。不进行任何解码。这对于处理非文本内容(如图片、音频文件、视频文件、压缩包等)非常有用。适用于处理二进制文件,如图片、音频文件、PDF 文档等。
- json():如果响应内容是 JSON 格式,可以使用此方法将其解析为 Python 字典。
- url:返回请求的最终 URL(包括重定向后的 URL)
- headers:返回一个包含响应头的字典。
- cookies:返回服务器在响应中设置的 cookies。
处理超时
可以通过 timeout 参数设置请求的超时时间(单位为秒)。如果请求超时,会抛出 requests.exceptions.Timeout
异常。
python
try:
response = requests.get('https://httpbin.org/delay/10', timeout=2)
except requests.exceptions.Timeout:
print('The request timed out')
处理异常
当使用requests库发送HTTP请求时,有可能会发生异常情况,例如网络错误、连接超时等。为了处理这些异常情况,我们可以使用Python的异常处理机制。requests库中定义了多种异常类型,可以用来捕获和处理各种HTTP请求相关的异常情况。
在使用requests库时,我们应该始终使用try-except语句来捕获和处理可能发生的异常。以下是一些常见的异常类型:
- requests.exceptions.RequestException: 所有异常的基类,可以用来捕获所有的异常情况。
- requests.exceptions.Timeout: 当请求超时时,抛出此异常。
- requests.exceptions.Timeout: 当请求超时时,抛出此异常。
- requests.exceptions.HTTPError: 当HTTP请求返回错误状态码时,抛出此异常。
以下是一个例子,演示如何使用try-except语句来捕获请求可能出现的异常情况:
python
import requests
try:
r = requests.get('https://www.baidu.com/', timeout=3)
r.raise_for_status()
except requests.exceptions.Timeout as e:
print('请求超时:', e)
except requests.exceptions.ConnectionError as e:
print('连接错误:', e)
except requests.exceptions.HTTPError as e:
print('HTTP错误:', e)
except requests.exceptions.RequestException as e:
print('其他异常:', e)
在上述代码中,我们首先使用try语句来执行requests.get()方法,如果发生异常,则会跳转到相应的except块进行处理。如果请求超时、连接错误或者HTTP错误,将会抛出相应的异常,并且打印相应的错误信息。如果发生其他异常情况,则会抛出requests.exceptions.RequestException异常,并打印相应的错误信息。
通过使用异常处理机制,我们可以有效地处理请求中可能出现的各种异常情况,以确保我们的程序能够在不稳定的网络环境中稳定地运行。