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

 在客户端上开启对HTTP/2.0的支持,同样是声明Client对象,然后将http2参数设置为True,若不设置默认支持HTTP/1.1
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的使用的更多相关文章

  1. 异步http接口调用库:httpx

    谈到http接口调用,Requests大家并不陌生,例如,robotframework-requests.HttpRunner等HTTP接口测试库/框架都是基于它开发.这里将介绍另一款http接口测试 ...

  2. httpx和requests之间有什么区别?

    requests只能发送同步请求,httpx能够发送同步和异步请求. httpx的api和requests是兼容的,切换的成本几乎是零.在异步模式下,测试大量接口的话,httpx的速度是能够显著得到提 ...

  3. Python 的 Requests 和 Httpx 在爬取应用中的一个区别

    HTTPX是功能齐全的Python3的HTTP客户端,支持同步和异步API,支持HTTP/1.1 和 HTTP/2. 一般情况下,在爬取网页内容的时候,httpx 与 requests 的基本使用方法 ...

  4. windows下编译chromium浏览器的15个流程整理

    编译chromium 系统为windows, 国内在windows上编译chromium的资料比较少, 我这篇文章只能作为参考, 记录我遇到的一些问题,因为chromium团队也会修改了代码,或者编译 ...

  5. Yii2 restful api创建,认证授权以及速率控制

    Yii2 restful api创建,认证授权以及速率控制 下面是对restful从创建到速率控制的一个详细流程介绍,里面的步骤以及截图尽可能详细,熟悉restful的盆友可能觉得过于繁琐,新手不妨耐 ...

  6. Python 并发总结,多线程,多进程,异步IO

    1 测量函数运行时间 import time def profile(func): def wrapper(*args, **kwargs): import time start = time.tim ...

  7. python 异步 I/O

    如果你想了解异步编程,那么必然会涉及出许多相关概念. 堵塞/非堵塞 同步/异步 多进程/多线程/协程 为什么我要学习这个话,因为我想搞懂异步框架和异步接口的调用.所以,我的学习路线是这样的: 1.py ...

  8. 使用websocket开发智能聊天机器人

    前面我们学习了异步web框架(sanic)和http异步调用库httpx,今天我们学习websocket技术. websocket简介 我们知道HTTP协议是:请求->响应,如果没有响应就一直等 ...

  9. 有哪些开源的 Python 库让你相见恨晚?

    Arrow 我们知道 Python 已经内置了好几个处理时间相关的库,但是对于时间以及时区间的转换并不清晰,操作起来略繁琐,而 Arrow 可以弥补这个问题,它提供了更友好的方法,方便我们对时间,日期 ...

  10. go-zero之web框架

    go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,其中rest是web框架模块,基于Go语言原生的http包进行构建,是一个轻量的,高性能的,功能完整的,简单易用的web框架 服务 ...

随机推荐

  1. dotnet UNO 如何在调试下输出界面层级结构

    本文将告诉大家如何在 UNO 里面将界面的层级结构输出到调试窗口 实现方法非常简单,和 WPF 或 UWP 等的方法是一样的,那就是通过可视化树遍历的方式,如以下代码 static class UIS ...

  2. 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 ...

  3. EPAI手绘建模APP介绍

    ​        本软件是一个基于OpenCASCADE.android JNI开发的APP.底层用c++实现,UI层用android实现.底层和UI层之间通过JNI接口和json数据格式通信.    ...

  4. 接私活利器!推荐一个基于SpringBoot3的后台管理框架

    大家好,我是 Java陈序员. 今天,给大家推荐一个后台管理框架,适合二次定制开发.接私活.源码学习等场景. 关注微信公众号:[Java陈序员],获取开源项目分享.AI副业分享.超200本经典计算机电 ...

  5. 14、web 中间件加固-Tomcat 加固

    1.用户配置 如果不需要控制台管理,请更改控制台用户文件注销账号信息:如果需要,请更改账户信息 修改 tomcat/conf/tomcat-user.xml 文件 注释或修改如下信息 <role ...

  6. 命令行创建vue项目

    vue -h vue create learn-vue ❯ Manually select features 选择下面的组件(空格为选中/取消)回车确认 使用 history mode 使用node ...

  7. C#.Net筑基-基础知识

    01.C#基础概念 1.1.C#简介 C# (读作C Sharp)是由微软公司开发的一种面向对象.类型安全.高效且简单的编程语言,最初于 2000 年发布,并随后成为 .NET 框架的一部分.所以学习 ...

  8. P2421-荒岛野人Savage题解

    好久没写题解了啊 洛谷P2421 荒岛野人 题目大意:有一个有很多洞的岛上,住了\(n\)个野人,每个野人的初始位置为\(c[i]\),换洞的速度为\(p[i]\),寿命为\(l[i]\).要求求出洞 ...

  9. 密码学—RSA公钥算法Python程序

    RSA流程 选取两个素数p,q,保密p,q 计算出n = p×q ,公开n 计算φ(n)=(p-1)(q-1) ,保密φ(n) 选择一个数e ,e满足:e < φ(n) , gcd(e,φ(n) ...

  10. 通过XML标记生成word

    思路 word生成可以通过标签,也可以通过XML元素. word文档实际上是由文档对象模型描述的,因此我们能够通过对文档对象进行操作去生成word. 由于word允许我们附加XML结构(元素),如下: ...