requests 库(发送 http 请求)基本使用指南

概述

requests 是一个 Python 第三方库,用于发送 HTTP 请求。它提供了一种简单和方便的方法来与 Web 服务进行交互,如获取网页内容、发送数据、处理 Cookie 等。

  • requests 是 用 python 语言编写的,比 urllib2 模块更简洁
  • requests 支持 HTTP 连接保持和连接池,支持使用 cookie 保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL 和 POST 数据自动编码。
  • 在 python 内置模块的基础上进行了高度的封装,从而使得 python 进行网络请求时,变得人性化,使用 Requests 可以轻而易举的完成浏览器可有的任何操作。
  • requests 会自动实现持久连接 keep-alive

requests 常用 API

常用方法

  • request() :构造一个请求,支持 GET、POST、PUT、DELETE 等方式,返回一个 Response 对象

    第一个参数默认为 method,第二个参数默认为 url

  • get() :发送 Get 请求,返回一个 Response 对象

    第一个参数均默认为 url

    # 发送GET请求并获取响应内容
    response = requests.get("https://www.example.com")
    # 发送带参数的GET请求。字典传递参数,如果值为None的键不会被添加到url中
    params = {'key1': 'value1', 'key2': 'value2'}
    response = requests.get("https://www.example.com", params=params)
    
  • post() :发送 Post 请求,返回一个 Response 对象

    第一个参数均默认为 url

    import requests
    import json
    
    # 发送POST请求并传递数据
    data = {'key1': 'value1', 'key2': 'value2'}
    response = requests.post("https://www.example.com", data=data)
    # 发送JSON数据
    headers = {'Content-Type': 'application/json'}
    response = requests.post("https://www.example.com", data=json.dumps(data), headers=headers)
    
  • Session() :获取会话对象。能够跨请求保持某些参数

    requests.get() 或 requests.post() 等都是一次性请求,如果需要传参 cookies 或 headers,则每次请求都需要传参。

    如果使用 session 来发起请求,session 实例在请求了一个网站后,对方服务器设置在本地的 cookie 会自动保存在 session 对象中,下一次再使用 session 请求对方服务器的时候,会直接带上前一次的 cookie,从而实现回话保持。

    session = requests.Session()  # cookies或者session或者token保存于session对象中
    session.auth = ('auth','passwd')
    session.headers = {'key':'value'}
    response = session.get('url')
    

方法常用参数

  • url :请求地址。发送请求方法的第一个参数均默认为 url

  • data :设置请求体,格式默认为字典

  • params:设置查询参数字典

  • headers:设置请求体,格式为字典

  • timeout :设置秒数超时,仅对于连接有效

    一旦超过这个时间还没获得响应内容,就会提示错误(需要异常处理)

    try:
    	res = requests.get(url = 'url',timeout=1)
    except exceptions.Timeout as e:
        print(e)
    except exceptions.HTTPError as e:
        print(e)
    
  • cookies :设置 cookies

  • proxies :设置访问代理。通过代理可设置抓包

    proxies = requests.get('url', proxies={'http':'[协议:]ip1:端口','https':'[协议:]ip2:端口'})
    
    # 如果代理需要用户名和密码,则需要这样:
    proxies = {"http": "http://user:password@ip:端口", }
    
  • files :设置文件发送

    files = {'file': open('report.xls', 'rb')}
    #files = {'file': ('report.jpg', open('report.xls', 'rb'))}     # 显式的设置文件名
    r = requests.post('http://m.ctrip.com', files=files)
    
  • auth :设置身份验证

    import requests
    from requests.auth import HTTPBasicAuth
     
    resp = requests.get('url', auth=HTTPBasicAuth('user', 'passwd'))
    #resp = requests.get('url', auth=('user', 'passwd'))    # 简写
    #resp = requests.get(URL, auth=HTTPDigestAuth('user', 'pass')	# 摘要式身份认证
    

requests.Response 常用 API

  • 常用属性:

    • encoding :获取当前的编码

    • encoding = ‘utf-8’ :设置编码

    • text :以 encoding 的编码解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。

    • content :以字节形式(二进制)返回。字节方式的响应体,会自动解码 gzip 和 deflate 压缩。

    • headers :以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回 None

    • status_code :响应状态码

    • raw :返回原始响应体,也就是 urllib 的 response 对象,使用 response .raw.read()

    • ok :布尔值,查看 http 请求是否成功(状态码:200)

    • cookies :cookie 信息

    • history :返回重定向信息

      注:可以在请求时加上 allow_redirects = false 阻止重定向

  • 特殊方法:

    • json() :Requests 中内置的 JSON 解码器,以 json 形式返回

      前提返回的内容确保是 json 格式的,不然解析出错会抛异常

    • raise_for_status() :失败请求(非 200 响应)抛出异常


拓展

发送 https 请求并忽略 SSL 证书校验

https 和 SSL 证书介绍

  • HTTPS(HyperText Transfer Protocol Secure)是一种安全的超文本传输协议,它结合了 HTTP 协议和 SSL/TLS 协议。HTTPS 使用 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)协议来加密和保护通信数据的传输。SSL 和 TLS 用于建立加密连接,保护数据传输的安全性和完整性。

  • HTTPS 和 SSL 证书的关系及工作流程:

    1. 建立安全连接: 客户端发起 HTTPS 请求时,客户端和服务器首先建立一个安全连接。
    2. 握手过程: 这个连接的建立通过 SSL/TLS 握手过程实现。在这个过程中,服务器将自己的 SSL 证书发送给客户端。
    3. 证书验证: 客户端收到服务器的 SSL 证书后,会验证证书的有效性,包括验证证书的签名是否有效,是否过期,是否与请求的域名匹配等。
    4. 密钥交换: 客户端和服务器通过 SSL/TLS 握手过程协商加密算法和密钥,以建立一个加密通道。
    5. 加密通信: 一旦加密通道建立,客户端和服务器之间的数据传输将通过选定的加密算法加密,确保通信的安全性。

    SSL 证书在这个过程中起到关键作用,它用于验证服务器的身份,并确定加密通道的加密参数。服务器的 SSL 证书由受信任的第三方机构(CA)签发,客户端通过信任这些 CA 来验证服务器的身份。

    要实现 HTTPS 通信,需要向一个受信任的 CA 申请 SSL 证书,并将其安装到服务器上。当客户端通过 HTTPS 请求网站时,它们会验证服务器的 SSL 证书,并确保连接是安全的。


requests 发送 https 请求并忽略 SSL 证书校验

  • 在某些情况下,可能需要在使用 requests 发送 HTTPS 请求时忽略 SSL 证书验证,例如在测试环境或自签名证书的情况下。

    可以通过设置 verify 参数为 False 来实现忽略 SSL 证书验证。

    注意:

    • 即使在使用 requests 发送请求时将 verify 参数设置为 False,仍然会进行 SSL/TLS 握手。

      verify=False 只是告诉 requests 跳过 SSL 证书验证,而不会禁止 SSL/TLS 握手过程。

    • SSL/TLS 握手是建立安全连接的关键步骤,它用于协商加密算法、密钥交换和建立加密通道。

      即使不验证服务器的 SSL 证书(使用 verify=False),仍然需要进行 SSL/TLS 握手以确保通信的安全性。

    • 使用 verify=False 时,SSL/TLS 握手过程会进行,但在握手过程中会跳过对服务器 SSL 证书的验证。这意味着即使服务器的证书无效或过期,握手也会继续进行,但连接可能不安全,因为无法保证正在连接到正确的服务器。

    • 如果想完全跳过 SSL/TLS 握手,而不建立安全连接,可以考虑直接使用普通的 HTTP 连接,而不是 HTTPS。

      但这样会使通信不安全,不推荐在生产环境中使用。如果需要安全连接,建议使用合法有效的 SSL 证书,并允许 SSL/TLS 握手过程来确保连接的安全性。

  • [SSL: DH_KEY_TOO_SMALL] dh key too small 报错

    SSL/TLS 握手过程中可能会出现 DH(即 Diffie-Hellman,密钥交换协议/算法)密钥长度过小的问题。这通常是由于使用过小的 DH 密钥长度或不安全的DH密钥交换算法导致的。

    在新的 SSL/TLS 标准中,强制要求使用安全的密钥长度和加密算法,以确保通信的安全性。一些旧的、不安全的加密算法或密钥长度会被标记为不安全,因此会导致类似的错误。

    **解决方案:**在请求中设置合适的 ciphers 来排除 DH 密钥长度过小的加密套件。但这并不是安全的解决办法,因为它会降低通信的安全性。

    • 方式1:使用 ssl_default_context 指定允许的加密算法

      import requests
      import ssl
      
      url = 'https://example.com'  # 替换为你要请求的 HTTPS URL
      # 禁用 SSL 校验
      ssl_context = ssl.create_default_context()
      ssl_context.check_hostname = False
      ssl_context.verify_mode = ssl.CERT_NONE
      # 指定允许的加密算法
      ciphers = 'HIGH:!DH:!aNULL'
      ssl_context.set_ciphers(ciphers)
      # 忽略警告
      urllib3.disable_warnings()
      # 发送 HTTPS 请求
      response = requests.get(url, verify=ssl_context)
      
    • 方式2:使用 requests.packages.urllib3 包指定允许的加密算法

      可以使用 requests.packages.urllib3 包来处理与 SSL 相关的功能。在这种情况下,可以使用 DEFAULT_CIPHERS 常量来设置默认的加密算法。

      注意:requests.packages.urllib3 静态编译可能会显示找不到,忽略即可,因为其可能是动态加载的

      import requests
      
      url = 'https://example.com'  # 替换为你要请求的 HTTPS URL
      # 设置默认加密算法为 HIGH:!DH:!aNULL。
      requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':HIGH:!DH:!aNULL'
      # 忽略警告
      requests.packages.urllib3.disable_warnings()
      # 发送 HTTPS 请求
      response = requests.get(url, verify=False)
      

你可能感兴趣的:(Python,http,网络协议,网络,python,requests)