1、requests 库介绍

requests 库是Python 的一个常用的 HTTP 请求库,可以轻松发送各种 HTTP 请求(如 GET、POST、PUT、DELETE 等)。

版本要求:Python 3.7+. 

官网文档:Requests: HTTP for Humans™ — Requests 2.31.0 documentation

安装requests库:

pip install requests

下面是 requests 库中常用的一些方法:

  • request(method, url, **kwargs):通用的请求方法,可以发送各种类型的HTTP请求,例如GET、POST、PUT、DELETE等。使用method参数指定具体的请求方法。
  • 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 对象。

2、requests库常见方法使用示例

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)

3、header请求头信息介绍

在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请求头元素,不同的接口会有不同的请求头元素要求。在开发中,需要根据具体的接口文档来设置和修改请求头参数,避免出现无法识别或格式错误等问题。

4、什么时候需要带上header?

在使用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字段。如果情况需要,还可以添加其他的字段。

 5、使用Session对象保持会话

在 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()` 方法关闭会话并释放所有连接,从而避免可能的资源泄露。

6、异常处理

在 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请求时,正确处理可能出现的异常是一项必不可少的技能。

7、带有文件的接口请求

在 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库提供了一种非常方便的方式来处理带有文件的接口请求,包括单个文件、多个文件,以及其他表单数据。

8、使用代理

使用代理是在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:password@proxy.server.com:port',
    'https': 'http://username:password@proxy.server.com:port'
}  

response = requests.get('http://www.example.com', proxies=proxies)

在上面的代码中,我们定义了一个包含用户名和密码的代理字典,并将其传递给`requests.get()`函数的`proxies`参数。请注意,在代理URL中指定用户名和密码时,请使用该格式:`http://username:password@proxy.server.com:port`,其中的'port'为代理服务器端口。


reference:

Requests: HTTP for Humans™ — Requests 2.31.0 documentation

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐