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框架 服务 ...
随机推荐
- dotnet UNO 如何在调试下输出界面层级结构
本文将告诉大家如何在 UNO 里面将界面的层级结构输出到调试窗口 实现方法非常简单,和 WPF 或 UWP 等的方法是一样的,那就是通过可视化树遍历的方式,如以下代码 static class UIS ...
- 2019-8-31-How-to-output-the-target-message-in-dotnet-build-command-line
title author date CreateTime categories How to output the target message in dotnet build command lin ...
- EPAI手绘建模APP介绍
本软件是一个基于OpenCASCADE.android JNI开发的APP.底层用c++实现,UI层用android实现.底层和UI层之间通过JNI接口和json数据格式通信. ...
- 接私活利器!推荐一个基于SpringBoot3的后台管理框架
大家好,我是 Java陈序员. 今天,给大家推荐一个后台管理框架,适合二次定制开发.接私活.源码学习等场景. 关注微信公众号:[Java陈序员],获取开源项目分享.AI副业分享.超200本经典计算机电 ...
- 14、web 中间件加固-Tomcat 加固
1.用户配置 如果不需要控制台管理,请更改控制台用户文件注销账号信息:如果需要,请更改账户信息 修改 tomcat/conf/tomcat-user.xml 文件 注释或修改如下信息 <role ...
- 命令行创建vue项目
vue -h vue create learn-vue ❯ Manually select features 选择下面的组件(空格为选中/取消)回车确认 使用 history mode 使用node ...
- C#.Net筑基-基础知识
01.C#基础概念 1.1.C#简介 C# (读作C Sharp)是由微软公司开发的一种面向对象.类型安全.高效且简单的编程语言,最初于 2000 年发布,并随后成为 .NET 框架的一部分.所以学习 ...
- P2421-荒岛野人Savage题解
好久没写题解了啊 洛谷P2421 荒岛野人 题目大意:有一个有很多洞的岛上,住了\(n\)个野人,每个野人的初始位置为\(c[i]\),换洞的速度为\(p[i]\),寿命为\(l[i]\).要求求出洞 ...
- 密码学—RSA公钥算法Python程序
RSA流程 选取两个素数p,q,保密p,q 计算出n = p×q ,公开n 计算φ(n)=(p-1)(q-1) ,保密φ(n) 选择一个数e ,e满足:e < φ(n) , gcd(e,φ(n) ...
- 通过XML标记生成word
思路 word生成可以通过标签,也可以通过XML元素. word文档实际上是由文档对象模型描述的,因此我们能够通过对文档对象进行操作去生成word. 由于word允许我们附加XML结构(元素),如下: ...