requests库发送http请求的示例代码
作者:墨鸦_Cormorant
概述
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 证书验证。
注意:
1、即使在使用 requests
发送请求时将 verify
参数设置为 False
,仍然会进行 SSL/TLS 握手。
verify=False
只是告诉 requests
跳过 SSL 证书验证,而不会禁止 SSL/TLS 握手过程。
2、SSL/TLS 握手是建立安全连接的关键步骤,它用于协商加密算法、密钥交换和建立加密通道。
即使不验证服务器的 SSL 证书(使用 verify=False
),仍然需要进行 SSL/TLS 握手以确保通信的安全性。
3、使用 verify=False
时,SSL/TLS 握手过程会进行,但在握手过程中会跳过对服务器 SSL 证书的验证。这意味着即使服务器的证书无效或过期,握手也会继续进行,但连接可能不安全,因为无法保证正在连接到正确的服务器。
4、如果想完全跳过 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)
到此这篇关于requests库发送http请求的示例代码的文章就介绍到这了,更多相关requests发送http请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!