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…

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

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

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/ #若第一步文件建在根目…

牛客周赛 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;而只是改变了对对象的解释。可改变对象解释方式的运算符称为类型转换运算符。 为何需要…

数据库端口LookUp功能:从数据库中获取并添加数据到XML

本文将为大家介绍如何使用知行之桥EDI系统数据库端口的Lookup功能&#xff0c;从数据库中获取数据&#xff0c;并添加进输入的XML中。 使用场景&#xff1a;期待以输入xml中的值为判断条件从数据库中获取数据&#xff0c;并添加进输入xml中。 例如&#xff1a;接收到包含采购…

简述乐观锁和悲观锁——Java

悲观锁和乐观锁 悲观就是任何事都认为会往坏处发生&#xff0c;乐观就是认为任何事都会往好处发生。 打个比方&#xff0c;假如一个公司里只有一台打印机&#xff0c;如果多个人同时打印文件&#xff0c;可能出现混乱的问题&#xff0c;他的资料打印在了我的资料上&#xff0…

Yolov8网络结构学习

详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署 深入解析YOLOv8&#xff1a;网络结构与推理过程 YOLO? You Know! --YOLOV8详解 一&#xff1a;yolov8总体结构 1.Backbone:它采用了一系列卷积和 反卷积层只来提取特征&#xff0c;同时也使用了残差连接和…

网站开发:使用VScode安装yarn包和运行前端项目

一、首先打开PowerShell-管理员身份运行ISE 输入命令&#xff1a; set-ExecutionPolicy RemoteSigned 选择“全是”&#xff0c;表示允许在本地计算机上运行由本地用户创建的脚本&#xff0c;没有报错就行了 二、接着打开VScode集成终端 输入 npm install -g yarn 再次输入以…

小程序-3(页面导航+页面事件+生命周期+WXS)

目录 1.页面导航 声明式导航 导航到tabBar页面 导航到非tabBar页面 后退导航 编程式导航 后退导航 导航传参 声明式导航传参 编程式导航传参 在onload中接收导航参数 2.页面事件 下拉刷新 停止下拉刷新的效果 ​编辑 上拉触底 配置上拉触底距离 上拉触底的节…