Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,使用Requests可以轻而易举的完成浏览器可有的任何操作。
但是在python3.6之后,出现了一个requests的替代选项;
httpx
httpx是Python新一代的网络请求库, 是一个几乎继承了所有 requests 的特性并且支持 "异步" http 请求的开源库。可以认为 httpx 是强化版 requests。
主要包含以下特点:
基于Python3的功能齐全的http请求模块
既能发送同步请求,也能发送异步请求
支持HTTP/1.1和HTTP/2
能够直接向WSGI应用程序或者ASGI应用程序发送请求
注意,httpx只支持python3.6+
安装使用httpx需要Python3.6+,如果要使用异步请求还需要版本是Python3.8+
- 安装httpx
推荐使用pip安装,在安装了pip之后,执行以下命令即可
pip install httpx
关于pip的安装方式,可以查看之前的文章或官方文档;
另外:如果需要使用HTTP/2,则需要安装http2的相关依赖
pip install httpx[http2]
- 使用httpx
httpx的用法基本和requests库一样,基本用法可以参考requests模块的用法;原有代码只需要替换requests单词为httpx就行;
不同的地方有:
httpx提供了Client
httpx提供了Client解决了requests每次发送请求都需要建立一个新的连接问题,Client是基于HTTP连接池实现的,这意味着当你对一个网站发送多次请求的时候,Client会保持原有的TCP连接,从而提升程序的执行效率。
使用Client的伪代码如下:
将请求头字符串转化为字典
headers = dict([line.split(": ",1) for line in headers.split("\n")])
#print(headers)
def httpx_req():
with httpx.Client(headers=headers) as client:
data_url = f'https://www.****.com/'
res = client.get(url=data_url).json()
#print(res)
print(res['has_more'])
print(res['max_cursor'])
print(res['aweme_list'][0]['video']['play_addr'])
httpx_req()
httpx提供了异步支持
httpx提供了异步client来发送相关请求。异步client还支持WebSocket等长网络连接。使用异步client比使用多线程发送请求更加高效;
异步请求需要使用async/await语句来进行异步操作,同时一般情况下会用到一个库
asyncio
官网介绍说:
asyncio 是用来编写并发代码的库,使用 async/await 语法。其用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。
执行异步请求
首先是创建一个httpx.AsyncClient()对象;然后是asyncio收集任务,最后执行请求;
async def async_httpx_req(sign):
async with httpx.AsyncClient() as client: # 创建一个异步client
r = await client.get('https://www.***.com/')
print(f'async_httpx_req: {sign}:{r.status_code}')
def run():
loop = asyncio.get_event_loop()
tasks = [async_httpx_req(sign=i) for i in range(200)]
task_start = time.time()
loop.run_until_complete(asyncio.wait(tasks))
task_end = time.time()
loop.close()
print(task_end - task_start)
run()
输入结果如下:
最后
如果要比较效率是否提高,可以编码同步请求的方法,比较以下耗时时间,就可发现效率提高了50%以上;