1、SSL证书验证
requests在请求HTTPS接口时,默认验证SSL证书,请求方法中默认参数为verify=True,如果想要关闭证书验证,可以设置为False,示例如下。
requests.get('https://www.baidu.com', verify=False)
2、不自动重定向
当遇到重定向接口,requests默认跟随重定向,返回所重定向接口的响应对象(
import requests
res = requests.get('https://httpbin.org/status/302')
print(res)
res = requests.get('https://httpbin.org/status/302', allow_redirects=False)
print(res)
第一个自动跟随重定向,返回
3、代理设置
requests支持使用代理,对于HTTP和HTTPS分别使用不同的代理,使用方式如下。
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
4、超时设置
requests支持对请求设置超时时间,以防止请求长时间无响应而阻塞,设置方法如下。
import requests
requests.get('https://github.com', timeout=5) # 设置整体的超时时间5s
requests.get('https://github.com', timeout=(3, 2)) # 分别设置连接和下载响应内容的超时时间3s,2s。
如果在超时时间内未完成响应,则抛出TimeoutError
5、授权设置(身份认证)
授权是请求身份验证的一些开放协议标准,授权协议很多,包括Basic Auth基础授权,Digist Auth摘要授权,Oauth等。
Basic Auth
Basic Auth基础授权使用用户名和密码来验证身份,在requests中使用方法如下。
import requests
requests.get('https://api.github.com/user', auth=('githab账号', '密码'))
OAuth2.0
需要使用requests-oauthlib,参考链接:https://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html
6、会话保持及默认配置
会话Session一般指客户端和服务端的一次连接交互过程。在使用requests.get()等方法时,每次会建立一个新的会话与服务器进行连接。这样不便于保持会话(如登录)状态,如果想要保持会话状态,可以使用同一个会话对象来请求所有接口,示例如下。
import requests
s = requests.Session() # 新建一个会话对象
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') # 使用该会话对象请求
r = s.get("http://httpbin.org/cookies") # 使用同样的会话对象请求
print(r.text)
会话对象还可以用来设置默认的请求头等HTTP配置,示例如下。
s = requests.Session()
s.auth = ('user', 'pass') # 在会话中设置默认授权
s.headers.update({'x-test': 'true'}) # 在会话中设置默认请求头
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'}) # 默认请求头也会被发送
7、预制请求Preprared-request
假设有多个请求需要先准备好,再逐个发送,可以使用requests.Request()对象的prepare()方法生成预制请求对象,然后使用会话发送即可,示例如下。
import requests
s = request.Session()
req1 = requests.Request('GET', 'https://httpbin.org/get').prepare()
req2 = requests.Request('POST', 'https://httpbin.org/post', data={'a':1}).prepare()
s.send(req1) # 发送预制请求
s.send(req2, headers={'x-test': 'true'}) # 支持添加额外项
8、使用适配器
适配器用于对匹配到的指定形式的请求做特殊处理,可以直接使用requests.adapters中的HTTPAdapter给定响应参数,也可以继承HTTPAdapter或BaseAdapter自定义处理方式,示例如下
import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(max_retries=3) # 设置最大重试3次
s.mount('http://', a) # 对该会话所有http://开头的请求使用
并发请求
requests本身并不支持异步。想要并发请求常用的有多线程多进程或gevent方式。
多线程
直接使用threading的Thread对象即可,通过target指定要运行的方法,示例如下。
import requests
from threading import Thread
def print_res(res, *args, **kwargs):
print(res.text)
s = requests.Session()
s.hooks={'response': print_res}
t1 = Thread(target=s.get, args=('https://httpbin.org/get',)) # 指定线程运行方法
t2 = Thread(target=s.post, args=('https://httpbin.org/post',), kwargs={'data': {'a': 1}})
t1.start() # 启动线程
t2.start()
t1.join() # 连接主线程
t2.join()
默认线程运行无法获取target函数的运行结果,这里给会话添加了默认hooks方法,来打印响应文本(也可以通过自定义请求方法来实现)。
如果想获取线程结果,需要继承Thread并编写自己的线程处理类,示例如下。
import requests
from threading import Thread
class MyThread(Thread):
def __init__(self, func, *args, **kwargs): # 改变线程的使用方式,可以直接传递函数方法和函数参数
super(MyThread, self).__init__()
self.func = func
self.args = args
self.kwargs = kwargs
self.result = None
def run(self):
self.result = self.func(*self.args, **self.kwargs) # 为线程添加属性result存储运行结果
t1 = MyThread(requests.get, 'https://httpbin.org/get')
t2 = MyThread(requests.post, 'https://httpbin.org/post', data={'a':1})
t1.start()
t2.start()
t1.join()
t2.join()
print(t1.result) # 响应对象
print(t2.result.text) # 响应对象的text属性即响应文本
使用gevent
安装 pip install gevent
示例如下。
from gevent import monkey;monkey.patch_all() # 要放import requests上面
import requests
import gevent
g1 = gevent.spawn(requests.get, 'https://httpbin.org/get')
g2 = gevent.spawn(requests.post, 'https://httpbin.org/post', data={'a': 1})
gevent.joinall([g1, g2])
print(g1.value) # 响应对象
print(g2.value)
使用grequests
安装 pip install grequests
grequests封装了gevent和requests方法,用起来更简单,示例如下。
import grequests
req_list = [
grequests.get('https://httpbin.org/get', ),
grequests.post('https://httpbin.org/post', data={'a': 1})
]
res_list = grequests.map(req_list)
print(res_list)
本章主要讲了一些常用的场景,起始真正项目中很少使用这些参数,但是这是我们出去面试时说出来增加自己能知识广度,吸引面试官的一种方式。
加v一起学习,vx:18547673653 QQ:1270059901