前面介绍的urllib库和requests库的使用,已经可以应对大多数的情况,但是有一些的网站它是强制使用HTTP/2.0协议访问的,这个时候前面两个库是不支持HTTP/2.0的,这个时候就需要用到支持这个协议的库来爬取网页了,其中httpx具有代表性,也更方便。
谈到这里,我来简单的说一下2和1.1的一些主要区别,想知道更多的可以自行上网去查阅。
从技术角度来看,两者最大的区别就是二进制框架层,其中http1.1把所有的请求和响应作为纯文本,而http2是把所有的消息封装成二进制,且仍然保持http语法,http2比http1.1传输信息更加灵活。
httpx的安装可以直接使用pip工具安装,但是需要Python版本要在3.6及其以上
这里并不能直接使用如下安装命令:
pip install httpx
因为这样安装的话,你所安装的httpx是不支持HTTP/2.0的,应该这样安装:
pip install 'httpx[http2]'
我们尝试一些使用httpx请求一个网站
import httpx
response = httpx.get('https://spa16.scrape.center')
print(response.text)
它运行的结果为:
Traceback (most recent call last):
...
raise mapped_exc(message) from exc
httpx.RemoteProtocolError: Server disconnected without sending a response.
可以看出报错了,虽然前面说httpx支持HTTP2.0,并且我们也安装了对应支持它的库,但是httpx默认是使用HTTP1.1的,我们需要手动的说明一下才可以让它正常支持HTTP2.0
import httpx
client = httpx.Client(http2=True)
response = client.get('https://spa16.scrape.center')
print(response.text)
它运行的结果为:
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta name=referrer content=no-referrer><link rel=icon href=/favicon.ico><title>Scrape | Book</title><link href=/css/chunk-50522e84.e4e1dae6.css rel=prefetch><link href=/css/chunk-f52d396c.4f574d24.css rel=prefetch><link href=/js/chunk-50522e84.6b3e24aa.js rel=prefetch><link href=/js/chunk-f52d396c.f8f41620.js rel=prefetch><link href=/css/app.ea9d802a.css rel=preload as=style><link href=/js/app.b93891e2.js rel=preload as=script><link href=/js/chunk-vendors.a02ff921.js rel=preload as=script><link href=/css/app.ea9d802a.css rel=stylesheet></head><body><noscript><strong>We're sorry but portal doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.a02ff921.js></script><script src=/js/app.b93891e2.js></script></body></html>
现在我们发现可以成功的获取HTML代码了,所以以后使用httpx的时候需要开启对HTTP2.0的支持才行。
上面我们使用的是GET方法,另外对于POST请求等方法来说,实现的方法类似,在这里就不做过多示范,httpx的一些基本方法也和requests极其类似,想要更加深入了解的可以自行去官网查阅资料
官网地址我放在这里:http://www.python-httpx.org/quickstart
来说一下http跟requests中不相似的,其中httpx中有一个Client对象。
可以用httpx.Client()来类比requests.Session()
举个例子:
import httpx
with httpx.Client() as client:
response = client.get('https://www.httpbin.org/get')
print(response)
它运行的结果为:
<Response [200 OK]>
这个用法等价于;
import httpx
client = httpx.Client()
try:
response = client.get('https://www.httpbin.org/get')
finally:
client.close()
另外声明Client对象时可以指定一些参数
import httpx
url = 'http://httpbin.org/headers'
headers = {'user-agent': 'my-app/0.0.1'}
with httpx.Client(headers=headers) as client:
r = client.get(url)
var = r.json()['headers']['User-Agent']
print(var)
它运行的结果为:
my-app/0.0.1
可以看到,headers成功赋值了。
另外,我想说,如果使用httpx进行客户端和服务器的连接,两者的HTTP协议要进行匹配才能成功连接和传输信息。
httpx还支持异步客户端请求,在这里就先了解一下,等以后学习的时候再进行总结。
httpx的用法和requests用法非常相似,我们可以多进行类比学习,但也要注意两者的区别,灵活使用,更多的用法可以去官方文档里面去学习,比起眼花缭乱的各种资料视频,官网文档有时候可能更有利于学习。