社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python新一代爬虫请求库!!

Python编程 • 3 年前 • 352 次点击  
来自公众号:Python编程与实战

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

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

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

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

简单用法

首先需要使用 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={'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
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 支持可用于ClientAsyncClient, 如果要发送大并发请求,使用异步效果会更好

但是不是所有的网站都支持 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 的功能更加丰富,赶紧用起来!


--- EOF ---



推荐↓↓↓
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/125065
 
352 次点击