httpx 的使用

httpx 是一个可以支持 HTTP/2.0 的库

还有一个是: hyper 库

这里有一个由HTTP/2.0的网站: https://spa16.scrape.center/

使用 requests 库 进行爬取

import requests

url = 'https://spa16.scrape.center/'
response = requests.get(url)
print(response.text)

 报错:

ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

安装: httpx 

pip3 install httpx 

这样安装并不能支持 HTTP/2.0

如果想要支持,需要这样安装:

pip3 install httpx[http2]

基本使用:

import httpx

response = httpx.get('https://www.httpbin.org/get')
print(response.status_code)
print(response.headers)
print(response.text)

输出:

这里访问的HTTP/1.0的网站,并且依次打印除了 , 响应状态码(status_code),

响应头信息(headers) ,  响应体(text) 我们可以看到 User-Agent 对应的是 python-httpx/0.27.0 代表我们用的是 httpx请求的

这里换一下 User-Agent 再试一次

import httpx

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
}
response = httpx.get('https://www.httpbin.org/get', headers= headers)
print(response.text)

输出: 

使用httpx 请求 HTTP/2.0 的网站

import httpx

url = 'https://spa16.scrape.center/'
response = httpx.get(url)
print(response.text)

报错:

RemoteProtocolError: Server disconnected without sending a response.

httpx 要想支持 HTTP/2.0的访问 需要手动声明

import httpx

url = 'https://spa16.scrape.center/'
client = httpx.Client(http2=True)
response = client.get(url)
print(response.text)

输出:

这里我们声明了一个 Client 对象 复制给 client 变量, 同时显示的将 http2 参数设置为 True,这样便开启了 HTTP/2.0 的支持

对于不同类型的请求的写法其实都是大同小异的

import httpx

r = httpx.get('https://www.httpbin.org/get', params={'name' : 'germey'})

r = httpx.post('https://www.httpbin.org/post', data={'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')

基于获取到 Reponse 对象 可以用如下属性和方法 获取想要的内容

status_code :  状态码

text : 响应体内容

content : 响应体二进制内容,当请求目标是二进制数据(如图片,视频)可以使用此属性获取

headers ; 响应头。 是 Headers 对象, 可以像获取字典内容一样获取某个 Header 的值

json :  方法 . 可以调用此方法将文本结果转化为 JSON 对象

具体其他用法参考官网: QuickStart - HTTPX

Client 对象

官方比较推荐的使用方式是 with as 

import httpx

with httpx.Client() as client:
    response = client.get('https://www.httpbin.org/get')
    print(response)

等价于:

import httpx

client = httpx.Client()
try:
    response = client.get('https://www.httpbin.org/get')
    print(response)
finally:
    client.close()

输出: 

<Response [200 OK]>

两种方式的运行结果是一样的,不过后一种需要显示的调用 close 方法来关闭Client对象

另外,再声明Client 对象时可以指定一些参数, 例如headers

import httpx

url = 'https://www.httpbin.org/headers'
headers =  {'User-Agent' : 'my-app/0.0.1'}
with httpx.Client(headers=headers) as client:
    r = client.get(url)
    print(r.json()['headers']['User-Agent'])

输出:

my-app/0.0.1

我们声明了一个 headers 变量, 内容为User-Agent 属性, 然后将此变量传递给 headers 参数初始化了一个 Client 对象, 并复制给了 client 变量, 最后用 client 变量请求了测试网站, 并打印返回结果中的 User-Agent 的内容

更多的用法参考官网: https://www.python-httpx.org/advanced/

支持 HTTP/2.0

就像前面小节里面说的一样,需要显示的开启对HTTP/2.0的支持,不然默认是不支持的

import httpx

url = 'https://www.httpbin.org/get'
client = httpx.Client(http2=True)
response = client.get(url)
print(response.text)
print(response.http_version)

输出:

{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Host": "www.httpbin.org", "User-Agent": "python-httpx/0.27.0", "X-Amzn-Trace-Id": "Root=1-6694ce46-2ececd2f69066e9336840987"}, "origin": "117.152.25.76", "url": "https://www.httpbin.org/get"
}HTTP/2

注意: 在客户端的 httpx 上启用对 HTTP/2.0 的支持, 并不意味着请求和响应都将通过HTTP/2.0传输, 这得客户端和服务端都支持HTTP/2.0才行。 如果客户端链接到仅支持HTTP/1.0的服务端, 那么也要改用 HTTP/1.0

支持异步请求

httpx 还支持异步客户端请求 (AsyncClient), 支持python的 async 请求模式

import httpx
import asyncio
import nest_asyncio

nest_asyncio.apply()

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'))

输出:

{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Host": "www.httpbin.org", "User-Agent": "python-httpx/0.27.0", "X-Amzn-Trace-Id": "Root=1-6694d0ef-779505ae5e5b42715b76c643"}, "origin": "117.152.25.76", "url": "https://www.httpbin.org/get"
}

说明: 

import nest_asyncio

nest_asyncio.apply()

这两行代码是因为 报错: 

RuntimeError: This event loop is already running

才加上的

关于异步请求可以参考       https://www.python-httpx.org/async/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库的系统视图v$arch_file

达梦数据库的系统视图v$arch_file 在达梦数据库中&#xff0c;V$ARCH_FILE 是一个动态性能视图&#xff0c;用于显示当前数据库的归档日志文件信息。这个视图可以帮助数据库管理员监控和管理归档日志文件&#xff0c;确保数据库的备份和恢复过程顺利进行。 查询本地归档日志信…

Unity UGUI Image Maskable

在Unity的UGUI系统中&#xff0c;Maskable属性用于控制UI元素是否受到父级遮罩组件的影响。以下是关于这个属性的详细说明和如何使用&#xff1a; Maskable属性 Maskable属性&#xff1a; 当你在GameObject上添加一个Image组件&#xff08;比如UI面板或按钮&#xff09;时&…

ctfshow-web入门-php特性(web127-web131)

目录 1、web127 2、web128 3、web129 4、web130 5、web131 1、web127 代码审计&#xff1a; $ctf_show md5($flag); 将 $flag 变量进行 MD5 哈希运算&#xff0c;并将结果赋值给 $ctf_show。 $url $_SERVER[QUERY_STRING]; 获取当前请求的查询字符串&#xff08;que…

开源防病毒工具--ClamAV

产品文档&#xff1a;简介 - ClamAV 文档 开源地址&#xff1a;Cisco-Talos/clamav&#xff1a;ClamAV - 文档在这里&#xff1a;https://docs.clamav.net (github.com) 一、引言 ClamAV&#xff08;Clam AntiVirus&#xff09;是一个开源的防病毒工具&#xff0c;广泛应用…

【算法专题】归并排序

目录 1. 排序数组 2. 交易逆序对的总数 3. 计算右侧小于当前元素的个数 4. 翻转对 总结 1. 排序数组 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 今天我们使用归并排序来对数组进行排序&#xff0c;实际上&#xff0c;归并排序和快速排序是有一定相似之处的&a…

Android View的绘制流程

1.不管是View的添加&#xff0c;还是调用View的刷新方法invalidate()或者requestLayout()&#xff0c;绘制都是从ViewRootImpl的scheduleTraversals()方法开始 void scheduleTraversals() {if (!mTraversalScheduled) {mTraversalScheduled true;mTraversalBarrier mHandler…

讲解js的call、apply和bind区别?

在 JavaScript 中&#xff0c;call、apply 和 bind 是用于改变函数执行上下文&#xff08;this 指向&#xff09;的方法&#xff0c;它们之间的区别如下&#xff1a; call&#xff1a; call() 方法调用一个函数&#xff0c;其第一个参数是要设置为函数执行上下文的…

Linux中nohup(no hang up)不挂起,用于在系统后台不挂断地运行命令,即使退出终端也不会影响程序的运行。

nohup的英文全称是 no hang up&#xff0c;即“不挂起”。这个命令在Linux或Unix系统中非常有用&#xff0c;主要用于在系统后台不挂断地运行命令&#xff0c;即使退出终端也不会影响程序的运行。默认情况下&#xff08;非重定向时&#xff09;&#xff0c;nohup会将输出写入一…

根据非满秩校验矩阵H在GF(2^m)上求解生成矩阵G

注1:如果校验矩阵H满秩,请参考:根据H在有限域GF(2^m)上求解生成矩阵G 注2:如果校验矩阵H不满秩,即存在冗余行。在这种情况下,编码时可以采用H的零空间上的一组基来编码,在译码时可以使用所有行做校验。 冗余行直观上构造了高列重的LDPC码,它们和编码时用到的一组基底…

Nim 游戏

文章目录 思路结论代码 题目链接 思路 大家可以去哔哩哔哩看董晓算法讲的 结论 1.Nim 游戏 当堆数的异或和等于零时&#xff0c;则必败 a1 ^a2 ^a3 ^a4… ^an0 当堆数的异或和不等于零时&#xff0c;则必胜 a1 ^a2 ^a3 ^a4… ^an!0 2.台阶型Nim游戏 有n个台阶&#xff0c;第…

C++之类与对象(1)

目录 前言 1.类的定义 1.1类定义的格式 1.2访问限定符 1.3类域 1.3.1类定义一个作用域 1.3.2类成员在类的作用域中 1.3.3在类体外定义成员 2.实例化 2.1实例化概念 2.2对象大小 3.this指针 4.选择题补充练习 结束语 前言 Hello&#xff0c;友友们&#xff0c;好久…

Linux安装mysql(超详细版)

步骤1&#xff1a;新建一个文件夹&#xff0c;专放从网络下载的文件 [rootiZ2zeh6vyxsq620zifz8jaZ home]#mkdir soft #在根目录下创建也可以 步骤2&#xff1a;切换目录&#xff0c;进入soft文件中 [rootiZ2zeh6vyxsq620zifz8jaZ /]# cd home/ #若第一步文件建在根目…

Solana的账户模型

Solana的账户模型与其他区块链平台&#xff08;如以太坊&#xff09;有所不同&#xff0c;其设计旨在提高性能和扩展性。以下是Solana账户模型的主要特点和工作原理&#xff1a; Solana账户模型概述 账户类型&#xff1a; 普通账户&#xff08;User Accounts&#xff09;&…

Java在JSON字符串中提取值

为了从给定的JSON字符串中提取SummarizedData中的Value值&#xff0c;可以使用Java中的Jackson库或Gson库。下面是使用Jackson库的示例&#xff1a; 步骤 添加Jackson依赖。使用ObjectMapper解析JSON字符串。导航到SummarizedData对象并提取Value值。 代码示例 1. 添加Jack…

牛客周赛 Round 51

目录 A.小红的同余 B.小红的三倍数 C.小红充电 D.小红的gcd E.小红走矩阵 F.小红的数组 这次周赛题目比较简单&#xff0c;算法题也基本上是板子题&#xff0c;出得很好(&#xff5e;&#xffe3;▽&#xffe3;)&#xff5e; A.小红的同余 思路&#xff1a;签到题&am…

Android Studio 不再支持windows 7

Android Studio 一打开就报错&#xff1a; 无法找到入口 无法定位程序输入点 CreateAppContainerProfle 于动态链接库USERENV.dII 上。 截图如下&#xff1a; 经调查&#xff0c;是因为系统版本不兼容。 我目前的电脑环境&#xff1a;windows 7,但是现在的Android Studio要…

24年Hvv准备,6大方向,33篇技战法

进去不少小伙伴后台留言说需要技战法&#xff0c;因此小编对市面上的技战法进行了收集和总结&#xff0c;并对收集来的技战法进行了分类&#xff0c;总共分了6大类&#xff0c;共计33篇&#xff1a; 有需要的小伙伴关注我&#xff0c;点击在看&#xff0c;并私信回复“技战法”…

基于Java的原创歌曲分享平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyEclipse 工具&#xff1a;MyEclipse、B/S架构 系统展示 首页 用户注册界面 音乐分享…

【python】OpenCV—Coordinates Sorted Clockwise

文章目录 1、需求介绍2、算法实现3、完整代码 1、需求介绍 调用 opencv 库&#xff0c;绘制轮廓的矩形边框&#xff0c;坐标顺序为右下→左下→左上→右上&#xff0c;我们实现一下转化为熟悉的 左上→右上→右下→左下 形式 按照这样的顺序组织边界框坐标是执行透视转换或匹…

21天学通C++:第十三、十四章节

第十三章&#xff1a;类型转换运算符 类型转换是一种机制&#xff0c;让程序员能够暂时或永久性改变编译器对对象的解释。注意&#xff0c;这并不意味着程序员改变了对象本身&#xff0c;而只是改变了对对象的解释。可改变对象解释方式的运算符称为类型转换运算符。 为何需要…