当前位置: 首页 > 工具软件 > Httpx > 使用案例 >

httpx的http版本问题

邹德泽
2023-12-01

httpx简单介绍(http1和http2)

httpx虽然支持http2,但是默认是http1。发出高度并发的请求,可能需要考虑尝试 HTTP/2 支持(http的版本区别:从技术角度来看,两者最大的区别就是二进制框架层,其中http1.1把所有的请求和响应作为纯文本,而http2是把所有的消息封装成二进制,且仍然保持http语法,http2比http1.1传输信息更加灵活),所以在爬取的时候容易出现下面这个异常

httpx爬取数据时发生异常

发生异常: RemoteProtocolError
Server disconnected without sending a response.

#发生异常: RemoteProtocolError
#Server disconnected without sending a response.

简单的解决(同步写法)

这个时候就需要去了解一下httpx的特殊的Client对象问题:
我们可以使用这种写法来简单指定httpx使用的http版本

Client_1=httpx.Client(http2=True)#将http1转换为http2
response_write = Client_1.get(url=dict, headers=headers, timeout=10)

这样就不报错了,当然还有更好的写法。

httpx的Client对象

import httpx

with httpx.Client() as client:
    response = client.get('https://www.httpbin.org/get')
    print(response)
#等同于
import httpx

client = httpx.Client()
try:
    response = client.get('https://www.httpbin.org/get')
finally:
    client.close()
自我理解httpx的同步与异步的问题
#同步
headers = {'X-Auth': 'from-client'}
params = {'client_id': 'client1'}
with httpx.Client(headers=headers, params=params, http2=True) as client:
     # with 内部请求共用一个client,参数也共用
	 # 替换client的参数
     headers = {'X-Custom': 'from-request'}
     params = {'request_id': 'request1'}
     r = client.get('https://example.com', headers=headers, params=params)


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

通过自动检测http的版本来进行请求

可以通过检查.http_version响应上的属性来确定使用了哪个版本的 HTTP 协议(在客户端启用 HTTP/2 支持并不一定意味着请求和响应将通过 HTTP/2 传输,因为客户端 和服务器都需要支持 HTTP/2。如果连接到仅支持 HTTP/1.1 的服务器,则客户端将改为使用标准 HTTP/1.1 连接)

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

好多东西都还没有学到,只有等以后学到了再慢慢添加了

 类似资料: