拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 requests过时了?快看Python新一代爬虫请求库

requests过时了?快看Python新一代爬虫请求库

白鹭 - 2022-02-11 2130 0 0

在 Python3 网络爬虫领域最新的比较火的工具莫过于 httpx 了,号称新一代网络请求神库

对比大家常用的 requests, 除了支持 requests 的所有操作之外,还具有以下特点:

  • 同时支持同步和异步请求
  • 支持 HTTP1.0/HTTP2.0
  • 可直接向 WSGI 程序或 ASGI 程序发出请求
  • 型别注释

从以上可以看出在 requests 的所有功能之上,增加了更多新的功能,相当于一个功能更强大的 requests !!

很多人学习Python,不知道从何学起,

很多人学习python,掌握了基本语法之后,不知道在哪里寻找案例上手,

很多已经做了案例的人,却不知道如何去学习更多高深的知识,

那么针对这三类人,我给大家提供一个好的学习平台,免费获取视频教程,电子书,以及课程的源代码!

QQ群:101677771

欢迎加入,一起讨论一起学习

 

简单用法

首先需要使用 pip 进行安装pip insatll httpx

如果使用支持 HTTP/2 的功能, 使用以下安装pip install httpx[http2]

基本的使用方法和 requests 非常类似

r = httpx.get('https://httpbin.org/post')
r.text
r.status_code
r.content

上面是 get 请求,post 请求也是一样

r = httpx.post('https://httpbin.org/post', data=https://www.cnblogs.com/sn520/p/{'key': 'value'})
r.json()
r.status_code
r.content

除了上面的发送表单格式资料之外,发送 json 型别资料时候使用 json 自变量

requests 中我们习惯使用 requests.Session(), 在 httpx 中用 httpx.Client() 来代替,代码如下:

>>> with httpx.Client() as client:
... r = client.get('https://example.com')
...
>>> r
<Response [200 OK]>

另外使用 Client 具有更高的性能,在使用 httpx 发送请求的时候会为每一个请求建立一个新的连接,如果你的请求量很大,效率相对于Client 会变得低效

因为Client实体使用HTTP 连接池!在向同一主机发出多个请求时,Client 将重用底层 TCP 连接,而不是为每个请求重新创建一个,

所以它的性能会更好

  • 减少跨请求的延迟
  • 减少 CPU 使用率和往返次数
  • 减少网络拥塞

同时还多了好几个功能,比如保持会话功能,维持整个请求程序中 cookie的一致性等

事件监听

HTTPX 支持在请求和回应端监听的功能,常说的 hook 功能

可以非常方便的进行日志记录、监控或跟踪等

def log_request(request):
    print(f"Request event hook: {request.method} {request.url} - Waiting for response")

def log_response(response):
    request = response.request
    print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}")

client = httpx.Client(event_hooks={'request': [log_request], 'response': [log_response]})

如在请求完全准备好之后,但还未被发送到网络之前会呼叫 log_request 函式

在网络获取回应回传之后,但还未发送到呼叫着之前会呼叫 log_response 函式

通过上面两个函式,可以实作日志记录,请求监控等等功能

可以看到上面传参是通过串列 [log_request] 的方式,所以我们可以注册多个 hook函式

异步请求

默认情况下,HTTPX 使用同步 API 进行请求,但其也支持异步请求,

异步请求的方式如下,使用AsyncClient

import asyncio
import httpx

async def main():
    async with httpx.AsyncClient() as client:
        response = await client.get('https://www.example.com/')
        print(response)

asyncio.run(main())

HTTP/2

HTTP/2 是 HTTP 协议的主要新迭代,它提供了更高效的传输,并具有潜在的性能优势,HTTP/2 不会改变请求或回应的核心语意,但会改变资料发送到服务器和从服务器发送的方式

使用 httpx 客户端时,默认情况下不启用 HTTP/2 , 在安装 HTTP/2 依赖后可使用,方法也很简单

async with httpx.AsyncClient(http2=True) as client:
    ...

在安装好依赖之后,将 http2 自变量设为 True即可,非常的方便

HTTP/2 支持可用于Client和AsyncClient, 如果要发送大并发请求,使用异步效果会更好

但是不是所有的网站都支持 HTTP/2 协议, 可通过下面代码判断

client = httpx.AsyncClient(http2=True)
response = await client.get(...)
print(response.http_version)
# "HTTP/1.0", "HTTP/1.1", or "HTTP/2".

以上便是 httpx 的常见用法,和 requests 用法是不是非常的相似,不过 httpx 的功能更加丰富,赶紧用起来!

 

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *