httpx虽然支持http2,但是默认是http1。发出高度并发的请求,可能需要考虑尝试 HTTP/2 支持(http的版本区别:从技术角度来看,两者最大的区别就是二进制框架层,其中http1.1把所有的请求和响应作为纯文本,而http2是把所有的消息封装成二进制,且仍然保持http语法,http2比http1.1传输信息更加灵活),所以在爬取的时候容易出现下面这个异常
发生异常: 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)
这样就不报错了,当然还有更好的写法。
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()
#同步
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_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"
好多东西都还没有学到,只有等以后学到了再慢慢添加了