在Python中,`requests`库是一个常用的HTTP库,用于发送HTTP请求和处理响应。它使你能够轻松地与Web服务器进行交互,获取或发送数据。
在本指南中,我们将介绍如何安装`requests`库、发送GET和POST请求、处理HTTPS请求以及处理错误和异常。
1. 安装 requests 库
首先,确保你的Python环境中已经安装了`requests`库。如果没有,可以通过以下命令使用pip进行安装:
pip install requests
2. 发送GET请求
GET请求是用于从服务器获取数据的请求。以下是一个简单的例子:
import requests
response = requests.get('https://api.example.com/data')
# 输出响应内容
print(response.text)
在上面的例子中,我们使用`requests.get()`函数发送GET请求,并将URL作为参数传递。然后,我们打印出响应的内容。
3. 发送POST请求
POST请求是用于向服务器发送数据的请求。以下是一个简单的例子:
import requests
data = {'key1': 'value1', 'key2': 'value2'} # 发送的数据
response = requests.post('https://api.example.com/data', data=data)
# 输出响应内容
print(response.text)
在这个例子中,我们使用`requests.post()`函数发送POST请求,并将URL和要发送的数据作为参数传递。然后,我们打印出响应的内容。
4. 处理HTTPS请求
如果你的请求是HTTPS请求,那么你需要确认服务器是否支持SSL。`requests`库默认情况下会验证SSL证书,但你可以通过设置`verify`参数来改变这个行为。例如:
import requests
response = requests.get('https://api.example.com/data', verify=False) # 不验证SSL证书
print(response.text)
注意:不验证SSL证书可能会导致安全问题,因此不建议在生产环境中这样做。
5. 处理错误和异常
在使用`requests`库时,可能会遇到各种错误和异常。例如,如果服务器返回一个错误状态码(如404),或者网络连接失败,`requests`库会抛出一个异常。为了处理这些异常,你可以使用try/except块来捕获它们:
import requests
try:
response = requests.get('https://api.example.com/data') # 尝试发送GET请求
print(response.text) # 输出响应内容
except requests.exceptions.RequestException as e: # 捕获所有与requests相关的异常
print(f"An error occurred: {e}") # 输出错误信息到控制台
6. 定制请求头
有时,你可能需要向服务器发送特定的HTTP头。这可以通过在请求中提供一个字典来实现,其中包含你想要发送的头和对应的值。
例如,以下代码发送一个`Content-Type`为`application/json`的请求:
import requests
headers = {'Content-Type': 'application/json'}
response = requests.get('https://api.example.com/data', headers=headers)
7. 发送带有身份验证的请求
如果你需要向服务器发送身份验证信息,你可以通过在请求中提供一个字典来包含这些信息。这通常用于HTTP基本身份验证。
例如,以下代码发送一个带有基本身份验证的请求:
import requests
auth = ('username', 'password') # 用你的用户名和密码替换这些占位符
response = requests.get('https://api.example.com/data', auth=auth)
8. 发送POST请求时包含JSON数据
如果你想通过POST请求发送JSON数据,你可以通过将数据传递给`json`参数来做到这一点。
例如,以下代码发送一个包含JSON数据的POST请求:
import requests
data = {'key1': 'value1', 'key2': 'value2'} # 用你的数据替换这些占位符
response = requests.post('https://api.example.com/data', json=data)
9. 自动处理重定向
默认情况下,`requests`库会自动处理重定向。如果服务器返回一个重定向状态(如301或302),`requests`会自动跟随这个重定向。你可以通过设置`allow_redirects`参数来改变这个行为。例如,如果你想禁用自动重定向,可以这样做:
import requests
response = requests.get('https://api.example.com/data', allow_redirects=False) # 禁用自动重定向
10. 处理会话和cookies
`requests`库支持会话和cookies处理。你可以使用`Session`对象来保持会话状态,这也可以用来管理cookies。
例如,以下代码使用会话来发送多个请求:
import requests
with requests.Session() as s:
s.get('https://api.example.com/data1')
s.get('https://api.example.com/data2')
在这个例子中,`Session`对象`s`被用来发送两个GET请求。由于会话保持状态,服务器返回的cookies将被自动管理。
11. 自定义请求超时
你可以通过设置`timeout`参数来定义一个请求的超时时间。
例如,以下代码设置了一个10秒的超时时间:
import requests
response = requests.get('https://api.example.com/data', timeout=10)
如果服务器在10秒内没有响应,`requests`库将抛出一个`requests.exceptions.Timeout`异常。
12. 调试HTTP请求
如果你想查看发出的HTTP请求的详细信息,你可以通过设置`debug`参数为True来实现。这将在控制台上打印出所有的HTTP头和响应详细信息。
例如,以下代码将打印出HTTP请求的详细信息:
import requests
response = requests.get('https://api.example.com/data', debug=True)
13. 使用代理
如果你需要使用代理来发送HTTP请求,你可以通过设置`proxies`参数来实现。
例如,以下代码使用一个HTTP代理来发送请求:
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
response = requests.get('http://example.org', proxies=proxies)
14. 设置全局默认值
如果你希望所有的请求都使用相同的设置(如代理或超时),你可以设置全局默认值。
例如,以下代码设置了一个全局默认的代理:
import requests
requests.defaults.proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
之后发出的所有请求都将使用这个代理,除非它们指定了不同的设置。
15. 发送PUT和DELETE请求
除了GET和POST请求,你还可以使用`requests`库来发送PUT和DELETE请求。这可以通过使用`put`和`delete`函数来实现。
例如,以下代码发送一个PUT请求来更新资源:
import requests
response = requests.put('https://api.example.com/data/123', data={'key': 'value'})
以上就是一些基本的`requests`库的使用指南。在使用时,请确保你已经正确处理了所有的异常情况,并且遵守了服务器的任何特殊规定。
16. 发送自定义HTTP请求
如果你需要发送一个非标准的HTTP请求,你可以使用`requests`库的底层HTTP功能。这可以通过使用`Session`对象和`Request`对象来实现。
例如,以下代码创建一个自定义的HTTP请求:
import requests
session = requests.Session()
request = requests.Request('CUSTOM_METHOD', 'https://api.example.com/data', data={'key': 'value'})
prepared_request = session.prepare_request(request)
response = session.send(prepared_request)
在这个例子中,我们创建了一个使用自定义方法('CUSTOM_METHOD')的HTTP请求,并发送了它。
17. 捕获异常
当使用`requests`库时,你可能会遇到各种异常,如`ConnectionError`、`HTTPError`等。为了在发生异常时更好地处理错误,你应该捕获这些异常。
例如,以下代码在发送请求时捕获异常:
import requests
try:
response = requests.get('https://api.example.com/data')
response.raise_for_status() # 如果状态不是200, 引发HTTPError异常
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
在这个例子中,我们尝试发送一个GET请求,并捕获任何可能发生的`requests`库异常。
18. 处理响应内容
当你收到响应后,你可能需要处理响应的内容。你可以通过访问响应对象的`json`属性来自动解析JSON响应。
例如,以下代码发送一个GET请求,并处理JSON响应:
import requests
response = requests.get('https://api.example.com/data')
response.raise_for_status() # 如果状态不是200, 引发HTTPError异常
data = response.json() # 解析JSON响应
print(data)
19. 定制请求头部(Headers)
在某些情况下,你可能需要向服务器发送自定义的HTTP头。这可以通过在请求中提供一个`headers`参数来实现。
例如,以下代码发送一个包含自定义头的GET请求:
import requests
headers = {'User-Agent': 'my-app/0.0.1'} # 用你自己的用户代理字符串替换 'my-app/0.0.1'
response = requests.get('https://api.example.com/data', headers=headers)
20. 使用会话(Sessions)
如果你打算在短时间内发送多个请求,可以考虑使用`requests`库的会话功能。这可以让你保持多个请求之间的状态,并使代码更简洁。
例如,以下代码使用会话来发送多个请求:
import requests
with requests.Session() as s:
s.get('https://api.example.com/data1')
s.get('https://api.example.com/data2')
在这个例子中,`Session`对象`s`被用来发送两个GET请求。由于会话保持状态,服务器返回的cookies将被自动管理。
21. 连接池(连接池)
对于大量并发的HTTP请求,使用连接池可以有效地管理网络连接,提高性能。`requests`库默认使用连接池来重用网络连接。
22. 配置默认值(Defaults)
如果你希望所有的请求都使用相同的设置(如代理或超时),你可以设置全局默认值。这可以通过直接修改`requests`库的默认配置来实现。
23. 处理响应体(Response Body)
在接收到响应后,你可能需要处理或解析响应体。这可能涉及将JSON响应转换为Python字典,或者处理其他格式的响应。
例如,以下代码发送一个GET请求,并处理JSON响应:
import requests
response = requests.get('https://api.example.com/data')
response.raise_for_status() # 如果状态不是200, 引发HTTPError异常
data = response.json() # 解析JSON响应
print(data)
24. 设置超时(Timeouts)
如果你希望限制请求的超时时间,可以通过设置`timeout`参数来实现。这可以帮助避免请求长时间未响应的情况。
例如,以下代码设置了一个5秒的超时时间:
import requests
response = requests.get('https://api.example.com/data', timeout=5)
如果在5秒内服务器没有响应,`requests`库将抛出一个`requests.exceptions.Timeout`异常。
25. 跟踪重定向(Redirects)
默认情况下,`requests`库会自动跟踪HTTP重定向,并将最终的响应返回给用户。如果你想手动处理重定向,可以通过设置`allow_redirects`参数为False来实现。
例如,以下代码发送一个GET请求,并允许重定向:
import requests
response = requests.get('https://api.example.com/data', allow_redirects=True)
如果服务器返回一个重定向状态(如301或302),`requests`库将自动跟随重定向并返回最终响应。
26. 认证(Authentication)
如果你需要向服务器发送认证信息(如基本身份验证),你可以通过设置`auth`参数来实现。
例如,以下代码使用基本身份验证来发送GET请求:
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://api.example.com/data', auth=HTTPBasicAuth('username', 'password'))
在这个例子中,我们使用`HTTPBasicAuth`类来创建一个HTTP基本身份验证对象,并将其作为参数传递给`auth`。
27. 定制URL(Custom URL)
如果你需要向服务器发送一个自定义的URL,你可以直接将URL作为参数传递给请求方法。
例如,以下代码发送一个GET请求到自定义URL:
import requests
response = requests.get('https://api.example.com/custom-endpoint')
在这个例子中,我们向`https://api.example.com/custom-endpoint`发送一个GET请求。
28. 发送POST请求
除了GET请求,你也可以使用`requests`库来发送POST请求。这可以通过使用`requests.post`函数来实现。
例如,以下代码发送一个POST请求:
import requests
response = requests.post('https://api.example.com/data', data={'key': 'value'})
在这个例子中,我们向`https://api.example.com/data`发送一个POST请求,并将数据`{'key': 'value'}`作为参数传递给`data`。
29. 发送PUT请求
如果你需要使用PUT方法(通常用于更新资源)发送请求,你可以使用`requests.put`函数。
例如,以下代码发送一个PUT请求:
import requests
response = requests.put('https://api.example.com/data/123', data={'key': 'new-value'})
在这个例子中,我们向`https://api.example.com/data/123`发送一个PUT请求,并将数据`{'key': 'new-value'}`作为参数传递给`data`。
30. 发送DELETE请求
如果你需要使用DELETE方法(通常用于删除资源)发送请求,你可以使用`requests.delete`函数。
例如,以下代码发送一个DELETE请求:
import requests
response = requests.delete('https://api.example.com/data/123')
在这个例子中,我们向`https://api.example.com/data/123`发送一个DELETE请求。
以上就是一些常见的使用`requests`库进行HTTP请求的例子。但是请注意,这只是基础功能的一部分,`requests`库还有许多其他高级功能,例如处理HTTP响应的状态码、处理cookies、处理重定向等。
31. 处理HTTP响应的状态码
除了响应体,`requests`库还允许你检查HTTP响应的状态码,以了解请求是否成功。
例如,以下代码发送一个GET请求,并检查状态码:
import requests
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
print('Request successful')
else:
print(f'Request failed with status code {response.status_code}')
在这个例子中,我们检查`response.status_code`来确认请求是否成功。通常,200表示成功,其他任何值表示出现某种错误。
32. 处理cookies
如果你需要与服务器进行复杂的会话,可以使用`requests`库的cookies功能。这允许你在多个请求之间保留和共享状态。
例如,以下代码发送一个GET请求,并检查返回的cookies:
import requests
response = requests.get('https://api.example.com/data')
if response.cookies:
print('Cookies received: ', response.cookies)
else:
print('No cookies received')
在这个例子中,我们检查`response.cookies`来查看是否收到了cookies。
33. 处理重定向
默认情况下,`requests`库会自动处理HTTP重定向。如果你想手动处理重定向,可以将`allow_redirects`参数设置为False。
例如,以下代码发送一个GET请求,并处理重定向:
import requests
response = requests.get('https://api.example.com/data', allow_redirects=False)
if response.is_redirect:
print('Redirect detected, manual handling required')
else:
print('No redirect detected')
在这个例子中,我们检查`response.is_redirect`来查看是否收到了重定向。如果为True,说明需要进行手动处理。
34. 定制请求头(Headers)- 续
除了之前提到的`headers`参数,`requests`库还允许你通过访问`response.headers`来查看和修改HTTP响应头。
例如,以下代码发送一个GET请求,并打印响应头:
import requests
response = requests.get('https://api.example.com/data')
print(response.headers)
此外,你还可以通过`response.headers['Content-Type']`来获取特定响应头的值。
35. 发送multipart/form-data请求
如果你需要上传文件或发送包含文件的表单数据,可以使用`requests`库的`files`参数。
例如,以下代码发送一个multipart/form-data POST请求:
import requests
with open('file.txt', 'rb') as f:
response = requests.post('https://api.example.com/upload', files={'file': f})
在这个例子中,我们打开一个名为`file.txt`的文件,并将其作为名为`file`的表单字段发送。
36. 使用session对象
除了之前提到的会话功能,你还可以使用`requests.Session`对象来管理多个请求之间的状态。这可以通过在多个请求之间共享cookies来实现。
例如,以下代码使用session对象发送两个请求:
import requests
s = requests.Session()
s.get('https://api.example.com/data1')
s.get('https://api.example.com/data2')
在这个例子中,我们创建了一个会话对象`s`,并使用它在两个不同的请求之间共享cookies。
37. 定制网络超时(Timeouts)
如果你需要限制请求的超时时间,可以使用`requests`库的`timeout`参数。这可以帮助避免长时间未响应的请求阻塞你的程序。
例如,以下代码发送一个GET请求,并设置超时时间为5秒:
import requests
response = requests.get('https://api.example.com/data', timeout=5)
如果服务器在5秒内没有响应,`requests`库将引发一个`requests.exceptions.Timeout`异常。
38. 连接池(Connection Pooling)
对于高并发的网络请求,使用连接池可以有效地管理连接资源,避免频繁地创建和关闭连接。`requests`库默认使用连接池来重用HTTP连接。
例如,以下代码使用连接池发送多个请求:
import requests
for i in range(10):
response = requests.get('https://api.example.com/data')
print(response.text)
在这个例子中,尽管我们发送了10个请求,但只会创建少量的HTTP连接,因为`requests`库会重用现有的连接。
39. 跟踪请求日志(Request Logging)
如果你需要跟踪和分析HTTP请求,可以使用`logging`模块与`requests`库一起使用。你可以通过设置日志级别和添加自定义的日志处理器来实现这一点。
例如,以下代码将所有HTTP请求记录到控制台:
import logging
import requests
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s')
logging.getLogger().addHandler(logging.StreamHandler())
response = requests.get('https://api.example.com/data')
40. 发送非阻塞请求(Non-blocking Requests)
如果你需要在等待HTTP响应时执行其他任务,可以使用`requests`库的异步功能。这可以通过使用`requests.get`方法的异步版本或使用`asyncio`库来实现。
例如,以下代码使用异步方式发送一个GET请求:
import asyncio
import aiohttp
async def fetch_data():
async with aiohttp.ClientSession() as session:
async with session.get('https://api.example.com/data') as response:
return await response.text()
async def main():
data = await fetch_data()
print(data)
asyncio.run(main())
在这个例子中,我们使用`aiohttp`库来创建一个异步HTTP客户端会话,并使用`session.get`方法发送异步GET请求。然后我们等待响应的文本内容。
41. 使用HTTP代理(HTTP Proxies)
如果你需要通过HTTP代理发送请求,可以使用`requests`库的`proxies`参数。你可以传递一个字典,其中包含代理类型和代理URL。
例如,以下代码发送一个GET请求,通过一个HTTP代理:
import requests
proxies = {
'http': 'http://proxy.example.com:8080',
'https': 'http://proxy.example.com:8080',
}
response = requests.get('https://api.example.com/data', proxies=proxies)