python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > requests发送http请求

requests库发送http请求的示例代码

作者:墨鸦_Cormorant

这篇文章主要介绍了Python requests发送http请求的相关知识,requests是一个Python的第三方库,用于发送HTTP请求,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

概述

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

requests常用API

常用方法

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

第一个参数均默认为 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)

第一个参数均默认为 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)

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')

方法常用参数

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

try:
	res = requests.get(url = 'url',timeout=1)
except exceptions.Timeout as e:
    print(e)
except exceptions.HTTPError as e:
    print(e)
proxies = requests.get('url', proxies={'http':'[协议:]ip1:端口','https':'[协议:]ip2:端口'})
# 如果代理需要用户名和密码,则需要这样:
proxies = {"http": "http://user:password@ip:端口", }
files = {'file': open('report.xls', 'rb')}
#files = {'file': ('report.jpg', open('report.xls', 'rb'))}     # 显式的设置文件名
r = requests.post('http://m.ctrip.com', files=files)
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

常用属性:

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

特殊方法:

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

发送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 证书的关系及工作流程:

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请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文