httpx库的使用
针对某些网站使用HTTP/2.0协议,requests库是无法抓取数据的,这时就需要使用支持HTTP2.0的请求库,比如httpx
一、安装
pip3 install httpx
二、常规API
import httpx url = 'http://www.httpbin.org/get' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36' } res = httpx.get(url, headers=headers) print(res.status_code) # 状态码 print(res.text) # 响应体文本内容 print(res.content) # 响应体二进制内容 print(res.json()) # 将Json文本转换为dict类型 print(res.headers) # 响应头,是Headers对象,可像字典一样操作,比如:res.headers.get('content-type') print(res.http_version) # httpx所特有的api,返回协议版本,比如:HTTP/1.1
三、Client对象
- httpx默认使用的是HTTP/1.1,要想支持HTTP/2.0,需要声明Client对象,并显示地将http2参数设置为True
- 在声明Client对象时,还可以指定一些参数,比如headers,这样使用该对象所发起的所有请求都会默认携带这些参数配置
- 代理的设置:
- 不同于requests,键名需要更改为'http://'和'https://'
# 无验证 proxies1 = { 'http://': 'http://ip:port', 'https://': 'https://ip:port' } # 有验证 proxies2 = { 'http://': 'http://用户名:密码@ip:port', 'https://': 'https://用户名:密码@ip:port' }
- 不同于requests,键名需要更改为'http://'和'https://'
- 示例(https://spa16.scrape.center/,该网站协议均采用的h2,使用requests会报错)
import httpx url = 'https://spa16.scrape.center/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36' } proxies = { 'http://': 'http://用户名:密码@ip:port', 'https://': 'https://用户名:密码@ip:port' } with httpx.Client(http2=True, headers=headers, proxies=proxies) as client: res = client.get(url) print(res.status_code) # 200 print(res.http_version) # HTTP/2 print(res.text) # 正常响应的文本内容
四、AsyncClient对象
- httpx还支持异步请求客户端,支持Python的async请求模式,需要使用AsyncClient对象
import asyncio import httpx url = 'https://spa16.scrape.center/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36' } async def fetch(url): async with httpx.AsyncClient(http2=True, headers=headers) as client: res = await client.get(url) print(res.status_code) # 200 print(res.http_version) # HTTP/2 print(res.text) # 正常响应的文本内容 asyncio.get_event_loop().run_until_complete(fetch(url))