概述
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 证书的关系及工作流程:
- 建立安全连接: 客户端发起 HTTPS 请求时,客户端和服务器首先建立一个安全连接。
- 握手过程: 这个连接的建立通过 SSL/TLS 握手过程实现。在这个过程中,服务器将自己的 SSL 证书发送给客户端。
- 证书验证: 客户端收到服务器的 SSL 证书后,会验证证书的有效性,包括验证证书的签名是否有效,是否过期,是否与请求的域名匹配等。
- 密钥交换: 客户端和服务器通过 SSL/TLS 握手过程协商加密算法和密钥,以建立一个加密通道。
- 加密通信: 一旦加密通道建立,客户端和服务器之间的数据传输将通过选定的加密算法加密,确保通信的安全性。
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 常量来设置默认的加密算法。文章来源:https://www.toymoban.com/news/detail-727305.html
注意:requests.packages.urllib3 静态编译可能会显示找不到,忽略即可,因为其可能是动态加载的文章来源地址https://www.toymoban.com/news/detail-727305.html
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)
-
到了这里,关于requests 库(发送 http 请求)基本使用指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!