httpx的使用
urllib和requests库已经可以爬取大多数网站的数据,但对于一些强制使用HTTP/2.0协议访问,这时urllib和requests是无法爬取数据的,因为只支持HTTP/1.1,不支持HTTP/2.0。可以使用一些支持HTTP/2.0的请求库,比较有代表性的是hyper和httpx,后者用起来方便也更强大,requests已有的功能几乎都支持。
示例
https://spa16.scrape.center/就是强制使用HTTP/2.0访问的一个网站,在Network面板中可以看到Protocol一列为h2,。

尝试使用request爬取
import requests url = 'https://spa16.scrape.center/'
response = requests.get(url)
print(response.text)

抛出RemoteDisconnected错误,请求失败。
安装
Python3.6及以上,httpx可以直接使用pip工具安装
pip3 install httpx
但是这样安装不支持HTTP/2.0,如果想支持可以这样安装
pip3 install "httpx[http2]"
这样即安装了httpx,又安装了HTTP/2.0支持模块
基本使用
httpx和requests的很多API存在相似之处,下面是GET请求
import httpx response = httpx.get(url='https://www.httpbin.org/get')
print(response.status_code)
print(response.headers)
print(response.text)

可以看到User-Agent是python-httpx/0.27.0,表示使用httpx请求的
换一个User-Agent再请求一次
import httpx
headers = {
'User-Agent' : 'Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.188 Safari/537.36 CrKey/1.54.250320'
}
response = httpx.get(url='https://www.httpbin.org/get', headers=headers)
print(response.text)
User-Agent生效后,尝试用户httpx请求刚才的网站
import httpx
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.188 Safari/537.36 CrKey/1.54.250320'
}
response = httpx.get(url='https://spa16.scrape.center', headers=headers)
print(response.text)

抛出了和使用requests请求时类似的错误,httpx默认不会开启对HTTP/2.0的支持,默认使用的是HTTP/1.1,需要手动声明一下才能使用HTTP/2.0,改写代码:
import httpx client = httpx.Client(http2=True)
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.188 Safari/537.36 CrKey/1.54.250320'
} response = client.get(url='https://spa16.scrape.center', headers=headers)
print(response.text)

声明了一个Client对象,赋值为client变量,同时显式地将http2参数设置为True,这样便开启了对HTTP/2.0的支持,就发现可以成功获取HTML代码。
httpx和requests有很多类似API,上面实现GET请求,对于POST请求、PUT请求和DELETE请求实现方式是一样的。
import httpx
r = httpx.get('https://www.httpbin.org/get', params={'name':'germey'})
r = httpx.post('https://www.httpbin.org/post', params={'name':'germey'})
r = httpx.put('https://www.httpbin.org/put')
r = httpx.delete('https://www.httpbin.org/delete')
r = httpx.patch('https://www.httpbin.org/patch')
基于得到的Response对象,可以使用以下书型盒方法获取想要的内容
- status_code:状态码
- text:响应体的文本内容
- content:相应体的二进制内容,当请求体的目标是二进制数据(如图片)时,可以使用此属性获取
- headers:相应头,是Headers对象,可以使用像获取字典中的内容一样获取期中某个Header的值
- json:方法,可以调用此方法将文本结果转换为JSON对象
官方文档:https://www.python-httpx.org/quickstart/
Client对象
httpx中有一些基本的API和requests中的非常相似,但也有一些API不相似,例如httpx中的Client对象,就可以和Session对象类比学习
下面介绍Client的使用
import httpx with httpx.Client() as client:
response = client.get(url='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()
两种方式运行结果一样,只不过需要再最后显式地调用close方法关闭Client对象。
在声明Client对象时可以指定一些参数,例如headers,这样使用该对象发起的所有请求都会默认带上这些参数配置。示例如下:
import httpx url = 'http://www.httpbin.org/headers'
headers = {'User-Agent': 'Mozilla/5.0'}
with httpx.Client(headers=headers) as client:
r = client.get(url)
print(r.json()['headers']['User-Agent'])
声明了一个headers变量,内容为User-Agent属性,然后将此变量传递给headers参数,初始化了一个Client对象,并赋值为client变量,最后用client变量请求了测试网站,并打印返回结果
Mozilla/5.0
官方文档:https://www.python-httpx.org/advanced/
支持HTTP/2.0
import httpx client = httpx.Client(http2=True)
res = client.get(url='https://httpbin.org/get')
print(res.text)
print(res.http_version)

支持异步请求
httpx还支持异步客户端请求(即AsyncCkient)支持Python的async请求的模式:
import httpx
import asyncio async def fetch(url):
async with httpx.AsyncClient(http2=True) as client:
response = await client.get(url)
print(response.text)
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(fetch('https://www.httpbin.org/get'))

httpx的使用的更多相关文章
- 异步http接口调用库:httpx
谈到http接口调用,Requests大家并不陌生,例如,robotframework-requests.HttpRunner等HTTP接口测试库/框架都是基于它开发.这里将介绍另一款http接口测试 ...
- httpx和requests之间有什么区别?
requests只能发送同步请求,httpx能够发送同步和异步请求. httpx的api和requests是兼容的,切换的成本几乎是零.在异步模式下,测试大量接口的话,httpx的速度是能够显著得到提 ...
- Python 的 Requests 和 Httpx 在爬取应用中的一个区别
HTTPX是功能齐全的Python3的HTTP客户端,支持同步和异步API,支持HTTP/1.1 和 HTTP/2. 一般情况下,在爬取网页内容的时候,httpx 与 requests 的基本使用方法 ...
- windows下编译chromium浏览器的15个流程整理
编译chromium 系统为windows, 国内在windows上编译chromium的资料比较少, 我这篇文章只能作为参考, 记录我遇到的一些问题,因为chromium团队也会修改了代码,或者编译 ...
- Yii2 restful api创建,认证授权以及速率控制
Yii2 restful api创建,认证授权以及速率控制 下面是对restful从创建到速率控制的一个详细流程介绍,里面的步骤以及截图尽可能详细,熟悉restful的盆友可能觉得过于繁琐,新手不妨耐 ...
- Python 并发总结,多线程,多进程,异步IO
1 测量函数运行时间 import time def profile(func): def wrapper(*args, **kwargs): import time start = time.tim ...
- python 异步 I/O
如果你想了解异步编程,那么必然会涉及出许多相关概念. 堵塞/非堵塞 同步/异步 多进程/多线程/协程 为什么我要学习这个话,因为我想搞懂异步框架和异步接口的调用.所以,我的学习路线是这样的: 1.py ...
- 使用websocket开发智能聊天机器人
前面我们学习了异步web框架(sanic)和http异步调用库httpx,今天我们学习websocket技术. websocket简介 我们知道HTTP协议是:请求->响应,如果没有响应就一直等 ...
- 有哪些开源的 Python 库让你相见恨晚?
Arrow 我们知道 Python 已经内置了好几个处理时间相关的库,但是对于时间以及时区间的转换并不清晰,操作起来略繁琐,而 Arrow 可以弥补这个问题,它提供了更友好的方法,方便我们对时间,日期 ...
- go-zero之web框架
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,其中rest是web框架模块,基于Go语言原生的http包进行构建,是一个轻量的,高性能的,功能完整的,简单易用的web框架 服务 ...
随机推荐
- K8s集群中部署SpringCloud在线购物平台(三)
五.SpringCloud概述 springcloud架构图 5.1 SpringCloud是什么? 官网: https://spring.io/projects/spring-cloud Sprin ...
- ClickHouse常用Sql
-- 删除字段 ALTER TABLE 表名 DROP COLUMN 字段名; -- 新增字段,和字段备注 ALTER TABLE 表名 ADD COLUMN IF NOT EXISTS 字段名 St ...
- 【AI新趋势期刊#2】AI发明计算机算法,如何给大模型排行,照片秒变二维码,视频一键动漫风
前言 每天都要浏览大量AI相关新闻,是不是感到信息量爆炸,有效信息少? 这么多新产品和新工具,到底哪些是真正是有价值的,哪些只是浮躁的一时热点? 想参与AI产品和工具的开发,从哪里能够获得大量的灵感和 ...
- rails 之下载
控制器 def index #传给前端展示层当前的id @id = 6 end # http://127.0.0.1:3000/admin/category_statistics/export_tab ...
- docker-compose 安装redis
一. docker 拉去最新版本的redis `docker pull redis:6.0.6` #后面可以带上tag号, 默认拉取最新版本 二. docker安装redis 执行命令: mkdir ...
- ansible(11)--ansible的user和group模块
1. group模块 功能:管理被控端用户组: 主要参数如下: 参数 说明 name 指定创建的组名 gid 为组设置gid state 是否将组创建在远程主机上,创建:present(Default ...
- 当字符遇上 scanf() 要当心
当字符遇上 scanf() 要当心 看一下程序 char ch1,ch2; printf("请输入ch1,ch2的值:"); scanf("%c %c",&am ...
- 服务器root密码忘记,使用centos7 紧急模式修改root密码
一.实战场景 公司一台centos7服务器root密码忘记了,需要你修改root密码,找回root身份. 二.进入紧急模式修改root密码 首先重启服务器,看到这界面时选择第一项,按下e键进行编辑 2 ...
- objectarx 之让用户自定义插件命令
#include <iostream> #include <fstream> virtual AcRx::AppRetCode On_kInitAppMsg (void *pk ...
- 多进程池Flask实战应用
多进程池Flask实战应用 import json import math import flask from concurrent.futures import ProcessPoolExecuto ...