• [和ChatGPT学编程]Python Requests 简介


    requests 是一个流行的 Python 库,用于发送 HTTP 请求。它提供了简洁而友好的 API,使得发送 HTTP 请求变得简单而直观。requests 具有许多强大的功能,适用于各种 HTTP 请求场景,包括 GET、POST、PUT、DELETE 等。

    requests 库的主要特点和使用示例

    1. 安装:
      你可以使用 pip 安装 requests:
    pip install requests
    
    • 1
    1. 发送 GET 请求:
    import requests
    
    response = requests.get('https://www.example.com')
    print(response.text)
    
    • 1
    • 2
    • 3
    • 4
    1. 发送 POST 请求:
    import requests
    
    data = {'key1': 'value1', 'key2': 'value2'}
    response = requests.post('https://www.example.com/post-endpoint', data=data)
    print(response.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 处理 JSON 响应:
    import requests
    
    response = requests.get('https://api.example.com/data')
    json_data = response.json()
    
    • 1
    • 2
    • 3
    • 4
    1. 设置请求头:
    import requests
    
    headers = {'User-Agent': 'MyApp/1.0'}
    response = requests.get('https://www.example.com', headers=headers)
    
    • 1
    • 2
    • 3
    • 4
    1. 处理响应状态码和异常:
    import requests
    try:
        response = requests.get('https://www.example.com')
        response.raise_for_status()  # 抛出 HTTPError 异常,如果响应状态码不是 2xx
    except requests.exceptions.HTTPError as err:
        print(f"HTTP Error: {err}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 传递 URL 查询参数:
    import requests
    
    params = {'key1': 'value1', 'key2': 'value2'}
    response = requests.get('https://www.example.com', params=params)
    
    • 1
    • 2
    • 3
    • 4
    1. 处理响应流(Streaming):
    import requests
    
    with requests.get('https://www.example.com/large_file.zip', stream=True) as response:
        with open('large_file.zip', 'wb') as file:
            for chunk in response.iter_content(chunk_size=128):
                file.write(chunk)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 使用 Session:
    import requests
    
    with requests.Session() as session:
        session.get('https://www.example.com/login', params={'user': 'username', 'password': 'password'})
        response = session.get('https://www.example.com/dashboard')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 文件上传:
    import requests
    
    files = {'file': ('filename.txt', open('filename.txt', 'rb'))}
    response = requests.post('https://www.example.com/upload', files=files)
    
    • 1
    • 2
    • 3
    • 4

    requests 是一个功能强大且易于使用的库,适用于各种网络请求场景。通过上述示例,你可以看到它提供了简单而灵活的 API,用于处理 HTTP 请求和响应。

    requests 相关配置项

    1. params:

    用于向 URL 中传递查询参数的字典或字节序列。例如:params={‘key1’: ‘value1’, ‘key2’: ‘value2’}。

    1. headers:

    用于设置请求头的字典,包含了一些额外的信息,如用户代理、认证信息等。例如:headers={‘User-Agent’: ‘Mozilla/5.0’}。

    1. data:

    发送 POST 请求时,用于发送表单数据或 JSON 数据的字典、字节序列或文件。例如:data={‘key1’: ‘value1’, ‘key2’: ‘value2’}。
    json:

    发送 POST 请求时,用于发送 JSON 数据的字典。requests 会自动将其转为 JSON 格式。例如:json={‘key1’: ‘value1’, ‘key2’: ‘value2’}。

    1. auth:

    用于设置 HTTP 基本认证的元组,包含用户名和密码。例如:auth=(‘username’, ‘password’)。

    1. cookies:

    用于发送请求时携带的 cookies 的字典。例如:cookies={‘cookie1’: ‘value1’, ‘cookie2’: ‘value2’}。

    1. timeout:

    用于设置请求超时时间,以秒为单位。如果在指定时间内没有得到响应,将引发 requests.Timeout 异常。例如:timeout=5。

    1. allow_redirects:

    用于设置是否允许重定向,默认为 True。如果设置为 False,则禁止重定向。例如:allow_redirects=False。

    1. proxies:

    用于设置代理服务器的字典。例如:proxies={‘http’: ‘http://proxy.example.com’, ‘https’: ‘https://proxy.example.com’}。

    1. verify:

    用于设置是否验证 SSL 证书,默认为 True。如果设置为 False,将忽略 SSL 证书验证。例如:verify=True。

    1. stream:

    用于控制是否立即下载响应体,默认为 False。如果设置为 True,则可以逐块地处理响应体。例如:stream=True。

    1. files:

    用于上传文件的字典,包含文件名和文件内容。例如:files={‘file’: (‘filename.txt’, open(‘filename.txt’, ‘rb’))}。

    1. hooks:

    用于设置回调钩子函数的字典,用于处理请求和响应。例如:hooks={‘response’: callback_function}。

    什么时候设置 stream=True

    在使用 Python 中的 requests 库时,设置 stream=True 通常适用于以下情况:

    下载大文件或数据流:

    • 当你需要下载大型文件或处理数据流时,使用 stream=True 可以避免将整个响应体一次性加载到内存中,而是逐块地处理响应体。
      长时间运行的请求:

    • 对于可能需要很长时间才能完成的请求,使用 stream=True 可以逐步获取响应,而不需要等待整个响应完全下载才能开始处理数据。
      逐块处理响应体:

    • 如果你希望逐块处理响应体,而不是等整个响应体下载完成,可以使用 stream=True 并通过 iter_content() 或 iter_lines() 方法逐块地获取响应体。

    • 避免大内存占用:

    • 当响应体非常大时,将其一次性加载到内存中可能导致内存占用过大,甚至引发 MemoryError。使用 stream=True 可以有效地减小内存占用,提高程序的稳定性。

    如何设置连接池

    在 Python 的 requests 库中,可以通过定制 HTTPAdapter 来设置连接池的相关参数,以控制 HTTP 连接的行为。

    创建连接池:

    import requests
    from requests.adapters import HTTPAdapter
    
    # 创建一个自定义的 HTTPAdapter
    custom_adapter = HTTPAdapter(
        pool_connections=5,   # 设置连接池的大小,即最大同时保持的连接数
        pool_maxsize=10,       # 设置每个主机的最大连接数,即每个目标主机允许保持的最大连接数
        pool_block=True,       # 如果连接池达到最大容量,并且没有可用连接,设置为 True 时,请求将会阻塞直到有可用的连接
        pool_timeout=30        # 设置获取连接的超时时间,单位为秒
    )
    
    # 创建一个 Session,并将自定义的 HTTPAdapter 添加到 Session
    session = requests.Session()
    session.mount('http://', custom_adapter)
    session.mount('https://', custom_adapter)
    
    # 使用带有自定义适配器的 Session 发送请求
    response = session.get('https://www.example.com')
    print(response.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    HTTPAdapter详解

    在 Python 的 requests 库中,HTTPAdapter 是一个适配器类,用于为 requests.Session 提供更灵活的 HTTP 连接池和持久性连接的配置。HTTPAdapter 允许你自定义 HTTP 连接的行为,例如设置连接池的大小、设置连接的生存时间等。

    以下是对 HTTPAdapter 的详细介绍:

    创建和使用 HTTPAdapter:

    import requests
    from requests.adapters import HTTPAdapter
    
    url = 'https://www.example.com'
    
    # 创建一个 Session
    session = requests.Session()
    
    # 创建一个自定义的 HTTPAdapter
    adapter = HTTPAdapter(max_retries=3, pool_connections=10, pool_maxsize=10, pool_block=True)
    
    # 将自定义的 HTTPAdapter 添加到 Session
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    
    # 使用带有自定义适配器的 Session 发送请求
    response = session.get(url)
    print(response.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    HTTPAdapter 的主要参数和方法:

    • max_retries:
      设置重试次数,当请求失败时自动重试。默认为 0,即不进行重试。
    • pool_connections:
      设置连接池的大小,即最大同时保持的连接数。
    • pool_maxsize:
      设置每个主机的最大连接数,即每个目标主机允许保持的最大连接数。
    • pool_block:
      如果连接池达到最大容量,并且没有可用连接,设置为 True 时,请求将会阻塞直到有可用的连接。设置为 False 时,会引发 ConnectionError。默认为 True。
    • pool_block:
      如果连接池达到最大容量,并且没有可用连接,设置为 True 时,请求将会阻塞直到有可用的连接。设置为 False 时,会引发 ConnectionError。默认为 True。
    • pool_timeout:
      设置获取连接的超时时间,单位为秒。
    • close():
      关闭适配器,并关闭其所有的连接。

    使用 HTTPAdapter 的好处:

    • 连接池控制:
      通过 HTTPAdapter 可以自定义连接池的大小和连接数,以便更好地控制和优化 HTTP 连接的使用。
    • 重试机制:
      可以通过设置 max_retries 参数启用重试机制,确保在发生连接错误时进行自动重试。
    • 持久性连接:
      可以通过适配器来实现持久性连接,提高多次请求同一主机时的性能。
    • 定制化配置:
      可以通过适配器提供的参数来定制化配置,以满足特定的请求需求。
      使用 HTTPAdapter 可以使得请求更加灵活和可定制,特别是在处理大量请求、需要精细控制连接的情况下,可以通过适配器来优化连接的管理。

    max_retries=3时多久会报超时

    在 requests 中,max_retries 参数用于设置在请求失败时的最大重试次数。重试时会等待一段时间再次尝试请求,这个等待时间由 Retry 实例的 backoff_factor 和 total 参数控制。

    默认情况下,backoff_factor 是 0,即每次重试之间的等待时间是固定的。如果设置了 backoff_factor,则等待时间会指数增加,以实现一种指数退避的效果。

    import requests
    from requests.adapters import HTTPAdapter
    from requests.packages.urllib3.util.retry import Retry
    
    # 创建一个自定义的 Retry 实例,设置最大重试次数为 3,backoff_factor 为 1
    retry = Retry(total=3, backoff_factor=1)
    
    # 创建一个自定义的 HTTPAdapter,使用自定义的 Retry 实例
    custom_adapter = HTTPAdapter(max_retries=retry)
    
    # 创建一个 Session,并将自定义的 HTTPAdapter 添加到 Session
    session = requests.Session()
    session.mount('http://', custom_adapter)
    session.mount('https://', custom_adapter)
    
    url = 'https://www.example.com'
    
    # 使用带有自定义适配器的 Session 发送请求
    try:
        response = session.get(url, timeout=5)  # 设置超时时间为 5 秒
        response.raise_for_status()
        print(response.text)
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

  • 相关阅读:
    python生成CAPTCHA验证码图像实战、生成英文CAPTCHA验证码图像
    动态规划进阶——LeetCode53. 最大子数组的和
    前端工具和模板网站
    记录一次mysql死锁
    分布式数据库Cassandra
    《SpringBoot篇》16.SpringBoot整合Elasticsearch超详细教程
    kafka基本知识
    【JavaWeb】-- thymeleaf视图模板技术
    vuex的使用
    【2022.7月份停更说明 && 总结】
  • 原文地址:https://blog.csdn.net/weixin_43700866/article/details/134505108