跳至主要内容

Requests 模块

Requests Module in Python

requests 模块通过简化发送请求和处理响应的过程,使得与网页和 API 的交互变得容易。使用 requests,你可以快速轻松地从网络中检索数据,并在 Python 项目中使用这些数据。在本文中,我们将探索 requests 模块及其功能,并演示如何在 Python 代码中使用它。

关于 requests 模块的一些说明

Python 中的 Requests 模块是一个 HTTP 库,它允许你使用 Python 发送 HTTP/1.1 请求。但是,如果你在尝试在 Python 中使用 requests 模块时遇到 没有名为 requests 的模块 错误,则表示该模块未安装或在你的环境中不可访问。

要安装 requests 模块,你只需在终端中运行以下命令

pip install requests

安装 Requests 库后,你可以使用它通过 Python 向 Web 服务器发送请求。以下是一个简单的代码示例,演示如何使用 Requests 模块从网站请求 data

import requests

response = requests.get('https://www.example.com')
print(response.text)

在此示例中,我们 import Requests 模块并使用 requests.get() 方法向参数中指定的网站发送 GET 请求。response.text 属性包含网站返回的 data,我们将其 print 到控制台。

以下是如何发送带有某些数据的 POST 请求的另一个示例

import requests

data = {'key': 'value'}
response = requests.post('https://www.example.com', data=data)
print(response.text)

在此示例中,我们使用 requests.post() 方法向参数中指定的网站发送 POST 请求。我们还将一些 data 作为字典传递,这些 data 将作为表单 data 随请求一起发送。response.text 属性包含网站返回的 data,我们将其 print 到控制台。

使用 JSON 的 Requests

JSON 是一种用于系统之间数据交换的流行数据格式。在此上下文中,我们将学习如何使用 Python requests 发送和接收 JSON 数据。

要使用 requests 发送带有 JSON 的 POST 请求,请使用 post 方法并使用 json 参数传递 JSON 数据。

import requests

data = {
    'name': 'John Doe',
    'email': '[email protected]',
    'message': 'Hello world!'
}

response = requests.post('https://example.com/api', json=data)

print(response.status_code)
print(response.json())

要发送带有 JSON 的 GET 请求,请使用 get 方法并使用 params 参数传递 JSON 数据。

import requests

params = {
    'category': 'books',
    'page': 1
}

response = requests.get('https://example.com/api', params=params)

print(response.status_code)
print(response.json())

要将 JSON 数据作为请求正文发送,请使用 data 参数,而不是 params 参数。

import requests
import json

data = {
    'name': 'John Doe',
    'email': '[email protected]',
    'message': 'Hello world!'
}

response = requests.post('https://example.com/api', data=json.dumps(data))

print(response.status_code)
print(response.json())

总之,requests 使得发送和接收 JSON 数据变得容易。根据你发送的是 POST 请求还是 GET 请求,使用 jsondata 参数。请记住,服务器必须能够处理你发送的 JSON 数据。

如何设置 requests 超时

如果你正在使用 Python requests 进行 HTTP 请求,则必须设置超时值以避免请求持续太长时间。使用 requests 库设置超时值很容易。以下两个代码示例使用 get 方法设置超时值。

import requests

response = requests.get("https://www.example.com", timeout=5)

在上面的示例中,我们设置了 5 秒的超时值。因此,如果服务器在 5 秒内没有响应,则请求将引发 requests.exceptions.Timeout 异常。

import requests

try:
    response = requests.get("https://www.example.com", timeout=5)
    response.raise_for_status()
except requests.exceptions.HTTPError as errh:
    print("HTTP Error:", errh)
except requests.exceptions.ConnectionError as errc:
    print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
    print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
    print("Something went wrong:", err)

在上面的示例中,我们使用 try-except 块来处理异常。如果请求花费的时间超过 5 秒,它将引发 requests.exceptions.Timeout 异常。

通过设置超时值,我们可以防止程序无限期地等待,并且可以优雅地处理错误。

Requests 属性

Requests 提供了几个属性,可用于自定义和访问请求的不同部分,例如请求正文、标头、响应和 cookie。

请求正文

要在请求正文中发送数据,可以使用 data 参数,其中包含键值对词典。这是一个示例

import requests

payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://example.com', data=payload)

标头

可以使用 headers 参数将标头添加到请求中。在发送授权令牌或自定义标头时,这可能很有用。这是一个示例

import requests

headers = {'Authorization': 'Bearer my_token', 'Custom-Header': 'value'}
response = requests.get('https://example.com', headers=headers)

响应

response 对象包含服务器对请求的 response。它包括属性,例如 response 状态代码、内容和标头。这是一个示例

import requests

response = requests.get('https://example.com')
print(response.status_code)
print(response.content)
print(response.headers)

Cookie

可以使用 cookies 属性访问和设置 cookie。这对于维护 session 或设置持久性数据很有用。这是一个示例

import requests

login_data = {'username': 'my_username', 'password': 'my_password'}
response = requests.post('https://example.com/login', data=login_data)

# Get the session cookie
session_cookie = response.cookies['session']

# Use the session cookie for subsequent requests
response2 = requests.get('https://example.com/protected', cookies={'session': session_cookie})

Requests 会话

Python Requests Session 是一款功能强大的工具,它允许你在单个 session 对象中维护 HTTP 请求的持久性。这意味着你可以轻松地为多个请求重复使用相同的连接,每个请求都基于前一个请求。

使用 Python 中内置的 requests 库,Sessions 功能维护 session 变量,包括 cookie。因此,它允许在客户端上进行临时存储。以下是一个示例代码片段,它说明了 Python Requests Session

import requests

session = requests.Session()
session.get('http://example.com')

在此代码中,我们创建一个新的 Session 对象,然后使用 get() 方法向给定的 URL 发出 GET 请求。默认情况下,此请求将包含使用此 session 对象发出的先前请求中设置的相关标头和 cookie。

Sessions 对于模拟有状态会话很有用,其中 HTTP cookie 用于记住服务器端状态。另一个示例是通过重复使用相同的 TCP 连接来加速对同一服务器的请求。这意味着服务器可以立即发送响应,而无需花费时间建立新的 TCP 连接。

以下是如何向 session 添加标头的示例,该标头将在所有后续请求中出现

import requests

session = requests.Session()
session.headers.update({'x-test': 'true'})

session.get('http://httpbin.org/headers')

Session 中,我们将标头 x-test 设置为 true。然后,使用此 session 对象对 'http://httpbin.org/headers' 发出的任何后续请求都将包含此标头。

总之,Python Requests Session 提供了一种强大且灵活的方法,可以在多个 HTTP 请求中保持连接状态。对于任何使用 Python 中 HTTP 请求/响应数据的开发人员来说,它都是必备工具。

如何使用 Requests 下载文件

要使用 Python 中的 requests 模块下载文件,可以使用 get() 方法。此方法允许你向指定的 URL 发出请求并以类似文件的对象的形式检索内容。然后,你可以将内容写入本地计算机上的文件。

import requests

url = 'https://example.com/image.jpg'
response = requests.get(url)

with open('image.jpg', 'wb') as f:
    f.write(response.content)

在此示例中,我们从 URL https://example.com/image.jpg 下载图像,并将其保存到名为 image.jpg 的文件中。response.content 属性包含图像的二进制内容,我们使用 write() 方法将其写入文件。

另一个示例是下载 CSV 文件并将其保存到磁盘

import requests

url = 'https://example.com/data.csv'
response = requests.get(url)

with open('data.csv', 'wb') as f:
    f.write(response.content)

在此示例中,我们从 https://example.com/data.csv 下载 CSV 文件,并将其保存到 data.csv。与之前一样,我们使用 write() 方法将内容写入文件。

在这两个示例中,我们都使用 requests 模块向指定的 URL 发出 GET 请求,并使用 response.content 属性检索二进制内容。然后,我们使用 open() 函数和 with 块将此二进制内容写入磁盘上的文件。

因此,这就是你可以在 Python 中使用 requests 下载文件的方法。

在 Requests 中使用代理

如果你想通过代理在 Python 中发送 HTTP 请求,你可以使用 requests 库。下面是如何操作

import requests

url = 'some_url'

proxies = {
  'http': 'http://user:password@proxy:port',
  'https': 'https://user:password@proxy:port'
}

response = requests.get(url, proxies=proxies)

在上面的代码示例中,你需要用你的实际凭据和代理地址和端口号替换 userpasswordproxyport

通过在你的 Python HTTP 请求中使用这些代理设置,你可以轻松绕过对你网络施加的任何限制,并且无需任何麻烦即可访问所需的资源。此外,你可以扩展你的服务以使其更加健壮和独立,同时保护你的网络免受外部用户侵害。

如何将 curl 转换为 Python 请求

curl 命令转换为 Python 请求对于使用 API 或 Web 请求的人来说是一项常见任务。

以下是使用 requests 模块将 curl 命令转换为 Python 请求的两个示例

curl 命令

curl https://jsonplaceholder.typicode.com/posts/1

Python 请求代码

import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts/1')

print(response.json())

更复杂的 curl 命令

curl -X POST \
  https://httpbin.org/post \
  -H 'Content-Type: application/json' \
  -d '{"name": "John Doe", "age": 25}'

Python request 代码

import requests

url = 'https://httpbin.org/post'
headers = {'Content-Type': 'application/json'}
data = '{"name": "John Doe", "age": 25}'

response = requests.post(url, headers=headers, data=data)

print(response.json())

总之,使用 requests 模块可以轻松地将 curl 转换为 Python 请求。通过理解 curl 命令的正确语法和结构,可以使用几行代码在 Python 中复制相同的请求。

Rest API

由于其简单的语法和庞大的库集合,Python 是一种用于构建 RESTful API 的流行语言。使用 Python,开发人员可以轻松地进行直接 API 调用并从流行的 Web 服务中提取 data

Python API 调用示例

以下是使用 Python 进行 API 调用的示例

import requests

url = "https://api.example.com/data"
response = requests.get(url)

print(response.json())

在上面的代码片段中,我们 import Python“requests”模块,使用 API 端点的 URL 并使用“get”方法执行请求。最后,我们以 JSON 格式 print 检索到的 data

如何在 Python 中使用 RESTful API

Python 提供了一个名为 Flask 的库,该库广泛用于构建 REST API。要使用 Flask 创建 RESTful API,你需要安装 Flask 并使用路由功能来定义 API 端点。

如何使用 Flask 创建 API 端点

from flask import Flask

app = Flask(__name__)

@app.route('/api/data')
def get_data():
    data = {"name": "John", "age": 30, "city": "New York"}
    return data

if __name__ == '__main__':
    app.run(port=5000)

在上面的代码中,我们定义了一个简单的 Flask app,其中有一个用于检索 data 的端点。“get_data”函数检索一个示例 data 对象并将其作为 JSON 返回。

总之,Python 由于其易用性和广泛存在的库,是用于处理 RESTful API 的出色语言。通过使用 Python 和 Flask,开发人员可以快速构建高性能 REST API,使其成为许多开发项目的热门选择。

与我们合作!

不要犹豫,在 GitHub 上为 Python 教程做出贡献:创建 fork,更新内容并发出拉取请求。

Profile picture for user AliaksandrSumich
Python 工程师,第三方 Web 服务集成专家。
更新:05/03/2024 - 21:53
Profile picture for user angarsky
已审阅并批准