requests · PyPI
Python 的 requests 库是一个常用的 HTTP 请求库,可以轻松发送各种 HTTP 请求(如 GET、POST、PUT、DELETE 等)。它简化了编写 HTTP 客户端的代码,并且支持 SSL 和连接池等特性。
安装requests库:
pip install requests
版本要求:Python 3.7+.
下面是 requests 库中常用的一些方法:
requests.get(url, params=None, **kwargs):发送 GET 请求并返回响应对象。
requests.post(url, data=None, json=None, **kwargs):发送 POST 请求并返回响应对象。
response.status_code:获取服务器响应的状态码。
response.content:获取服务器响应的内容(字节流形式)。
response.text:获取服务器响应的内容(字符串形式)。
response.json():将服务器响应的 JSON 数据转换成 Python 对象。
1. 发送 GET 请求并获取响应内容:
import requests
response = requests.get('http://www.example.com')
print(response.text)
2. 发送 POST 请求:
import requests
# 表单方式
data = {'name': 'John', 'age': 25}
response = requests.post('http://www.example.com', data=data)
print(response.status_code)
# JSON格式
import json
headers = {'content-type': 'application/json'}
data = {'name': 'John', 'age': 25}
json_data = json.dumps(data)
response = requests.post('http://www.example.com/api', data=json_data, headers=headers)
print(response.json())
3. 发送带有自定义 headers 的请求:
import requests
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get('http://www.example.com', headers=headers)
print(response.content)
4. 发送带有参数的 GET 请求:
import requests
params = {'page': '2', 'count': '30'}
response = requests.get('http://www.example.com', params=params)
print(response.content)
5. 发送带有 cookie 的请求:
import requests
cookies = {'user_id': '123'}
response = requests.get('http://www.example.com', cookies=cookies)
print(response.content)
6. 发送带有文件上传的请求:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('http://www.example.com/upload', files=files)
print(response.status_code)
7.设置代理服务器:
import requests
proxies = {'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080'}
response = requests.get('http://www.example.com', proxies=proxies)
print(response.content)
在使用requests模块调用接口时,可能需要在请求中添加一些header头信息。以下是一些常见的情况:
1. 接口需要身份验证:当调用需要身份验证的接口时,通常需要在header中设置Authentication字段来提供身份认证信息。
2. 接口需要携带特定的User-Agent信息:有些服务器可能会根据User-Agent识别不同的客户端类型或版本,并响应不同内容。此时需要设置User-Agent字段。
3. 接口需要特定的加密方式:有些API要求使用特定的加密方式,例如HMAC-SHA1或MD5算法。在这些情况下,需要设置相应的Encryption字段。
4. 接口禁止盗链:某些API可能有防盗链机制(referrer check),只允许特定来源的请求。此时需要在header中传入Referer字段。
5. 接口需要传输特定格式的数据:如果接口需要按照特定格式(如JSON、XML)传送数据,需要在headers中设置Content-Type字段。
6. 其他:还可以在header中添加一些自定义的字段,比如Accept、Cookie、Accept-Encoding等。
注意:在设置header时,请确保遵循接口文档中指定的格式和要求,否则可能导致请求错误或被拒绝。
以下是一个示例,展示了如何使用requests库发送带有headers的GET请求:
import requests
url = 'https://api.example.com/v1/users'
headers = {'User-Agent': 'Mozilla/5.0', 'Authorization': 'Bearer TOKEN'}
response = requests.get(url, headers=headers)
在上面的代码中,我们向url发送GET请求,并将header头信息保存在headers字典对象中,其中包括了User-Agent和Authorization字段。如果情况需要,还可以添加其他的字段。
在HTTP请求中,header头信息是一些额外的元数据,包含了关于请求、响应实体和其他操作的信息。下面介绍一些常见的请求头元素:
1. User-Agent:用于识别浏览器或用户代理程序的类型和版本号,供服务器进行处理。
2. Accept:表明客户端可接受的响应类型,比如text/html、application/xml。
3. Connection:指示是否要保持连接,以及空闲时要等待多长时间才能关闭连接。
4. Accept-Encoding:表明客户端可接受的压缩算法,例如gzip、deflate。
5. Referer:表明当前请求来源,通常用于防盗链检查(referrer check)或提交数据来源追踪。
6. Authorization:用于提供身份认证信息,比如Access Token等。
7. Content-Type:表明请求或响应的实体类型,例如application/json或multipart/form-data。
8. Content-Length:表明请求或响应实体的长度。
9. Cache-Control:用于控制缓存行为,可设置public、private、no-cache等值。
10. Cookie:一组键值对,用于保存会话信息并跨请求进行传递。
11. Date:请求发送的日期和时间。
12. Host:表明请求的主机名和端口号。
以上是一些常见的HTTP请求头元素,不同的接口会有不同的请求头元素要求。在开发中,需要根据具体的接口文档来设置和修改请求头参数,避免出现无法识别或格式错误等问题。
在 requests 模块中,Session 对象提供了一种方式来保持连接信息(例如cookie、HTTP认证等),同时允许重新使用相同连接进行多个请求。通过 Session 对象执行请求时,会话级别的参数,如headers、auth(身份验证)、cookies和proxies等会自动应用到所有请求上,从而使API请求变得更加简单和高效。
下面是一个例子:
import requests
# 创建 Session 对象
session = requests.Session()
# 第一个请求
session.get('http://example.com/login', auth=('user', 'pass'))
# session级别的参数在后续请求中也可以自动应用
response1 = session.get('http://example.com/resource1')
response2 = session.get('http://example.com/resource2')
# 关闭 Session 对象,释放连接
session.close()
在上面的示例中,我们创建了一个 Session 对象 s,并向其发送了两个 GET 请求。第一个请求需要进行身份验证,因此传递了 `auth` 参数来设置用户名和密码。由于这是 Session 级别的参数,所以在后续请求中不需要再次设置。
在接下来的两个请求中,我们只需指定资源的URL,而不必再次指定 `auth` 参数或其他会话级别的参数。这些参数将从会话中自动获取并应用,从而简化了代码并提高了可维护性和易用性。
最后,当我们不再需要使用该 Session 对象时,我们可以调用 `close()` 方法关闭会话并释放所有连接,从而避免可能的资源泄露。
在 requests 模块中,我们可以使用 try-except 块来处理可能发生的异常,例如网络连接错误、超时等情况。requests 模块抛出以下异常:
- `requests.exceptions.RequestException`: 所有异常的基类,捕获异常是建议使用该基类,
- `requests.exceptions.Timeout`: 发生请求超时时引发的异常
- `requests.exceptions.ConnectionError`: 发生网络连接错误时引发的异常。
- `requests.exceptions.HTTPError`:未成功获取HTTP响应时引发的异常。
下面是一个简单的例子:
import requests
try:
response = requests.get('https://www.example.com', timeout=4)
response.raise_for_status() # 检查HTTP状态码是否为200
except requests.exceptions.Timeout:
print("请求超时")
except requests.exceptions.ConnectionError:
print("网络连接错误")
except requests.exceptions.HTTPError as http_error:
print(f"HTTP错误: {http_error}")
except requests.exceptions.RequestException as e:
print(f"其他异常: {e}")
在上面的例子中,我们向 `https://www.example.com` 发送了一个 GET 请求,并将超时时间设置为 4 秒。如果发生超时或连接错误,会引发相应的异常并打印相应的错误消息。
此外,`raise_for_status()` 方法是非常有用的一个方法,它检查 HTTP 响应的状态码是否为 200(表示“OK”)。如果状态码不是200,则会引发 `HTTPError` 异常。因此,`raise_for_status()` 方法可用来检查请求是否成功,从而更好地处理某些错误场景。
总体来说,使用合适的异常处理是保证代码可靠性和健壮性的关键点之一。在处理requests请求时,正确处理可能出现的异常是一项必不可少的技能。
在 requests 库中,如果需要发送包含文件的 POST 请求,可以使用 `requests.post()` 方法,并在 `files` 参数中指定文件名和内容。下面是一个简单的例子:
import requests
url = 'https://example.com/upload'
filename = 'example.txt'
with open(filename, 'rb') as f:
files = {'file': (filename, f)}
response = requests.post(url, files=files)
print(response.text)
在上面的代码中,我们向 `https://example.com/upload` 发送了一个 POST请求,并将文件 `example.txt` 作为参数传递到 `files` 字典中。第二个元组元素应该是一个打开的二进制文件句柄,其中读取了要上传的文件。
请注意,我们没有设置Content-Type头,因为Request库会自动检测并配置这个头部。此外,我们不需要显式地设置文件类型,因为Request会从文件名中自动猜测文件类型。
payload = {'name': 'Alice'}
files = {'file': (filename, open(filename, 'rb'), 'text/plain')}
response = requests.post(url, data=payload, files=files)
在这个示例中,我们定义了一个参数字典(payload),让我们能够在同一请求中传输其他数据项。只需在请求中将新定义的表单数据与传递的文件结合起来即可。
总之,Requests库提供了一种非常方便的方式来处理带有文件的接口请求,包括单个文件、多个文件,以及其他表单数据。
使用代理是在Requests库中发送HTTP请求时很常见的用例之一。您可以通过将代理信息指定为一个字典来使用代理。下面是一个简单的示例:
import requests
proxy_dict = {
'http': 'http://127.0.0.1:8888', # HTTP代理
'https': 'http://127.0.0.1:8888' # HTTPS代理
}
response = requests.get('https://www.google.com', proxies=proxy_dict)
print(response.text)
在上面的示例中,我们定义了一个名为`proxy_dict`的字典,并将其传递给`proxies`关键字参数。该字典包含了使用HTTP代理和HTTPS代理所必需的信息。在这个例子中,我们使用本地主机上的代理(默认端口号为8888)。请求被发送到`https://www.google.com`。
如果您需要在代理URL中使用用户名和密码,则可以将它们作为一个字符串传递给`proxies`字典中的相应代理选项。例如:
import requests
proxies = {
'http': 'http://username:[email protected]:port',
'https': 'http://username:[email protected]:port'
}
response = requests.get('http://www.example.com', proxies=proxies)
在上面的代码中,我们定义了一个包含用户名和密码的代理字典,并将其传递给`requests.get()`函数的`proxies`参数。请注意,在代理URL中指定用户名和密码时,请使用该格式:`http://username:[email protected]:port`,其中的'port'为代理服务器端口。
reference:
Requests: HTTP for Humans™ — Requests 2.31.0 documentation