HTTPX从入门到放弃

2023-11-07

1. 什么是HTTPX?

HTTPX是一款Python栈HTTP客户端库,它提供了比标准库更高级别、更先进的功能,如连接重用、连接池、超时控制、自动繁衍请求等等。HTTPX同时也支持同步和异步两种方式,因此可以在同步代码和异步代码中通用。

HTTPX功能如下:

1. 发送HTTP请求:HTTPX支持发送HTTP GET、POST等请求,并提供了丰富的选项进行定制化。

2. 请求头和查询参数:HTTPX可以方便地添加请求头和查询参数到HTTP请求中。

3. 超时设置:HTTPX支持对HTTP请求的超时时间进行设置,以避免长时间等待响应。

4. SSL/TLS证书验证:当使用HTTPS协议时,HTTPX可以验证SSL/TLS证书。

5. 文件上传和下载:HTTPX可以用于上传和下载文件。

6. Cookie管理:HTTPX可以管理cookie。

7. 连接池:HTTPX提供连接池以提高性能。

8. 异步请求:HTTPX支持异步请求,在异步代码中提供了更好的性能表现。

相比其他HTTP客户端库,HTTPX有以下优势:

  1. 性能更好:HTTPX采用异步IO模型实现高效的并发处理,使得其在处理大量数据和并发请求时比同类库要快得多。
  2. 功能更全面:HTTPX提供了更多的功能,如连接池、自动繁衍请求等等,使得它可以胜任更多不同的HTTP场景。
  3. 更为灵活:HTTPX提供了更多可用的选项以满足不同的HTTP场景和使用需求,从而使得它更为灵活。
  4. 更加安全:HTTPX在处理HTTPS请求时提供更完善的SSL/TLS证书验证机制,从而更加安全。

2. HTTPX功能

1. 发送HTTP请求

import httpx

# 发送GET请求
response = httpx.get('https://www.example.com')
print(response.status_code)  # 状态码
print(response.text)  # 响应内容

# 发送POST请求
data = {'name': 'example', 'age': 18}
response = httpx.post('https://www.example.com', data=data)
print(response.status_code)  # 状态码
print(response.text)  # 响应内容

2. 请求头和查询参数

HTTPX发送HTTP请求时往往需要在请求中添加一些头部信息或查询参数,下面介绍如何在HTTPX中添加和定制这些信息。

添加请求头

可以通过headers参数向HTTP请求中添加头部信息。以下是一个示例代码:

import httpx

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

response = httpx.get('https://www.example.com', headers=headers)

print(response.status_code)
print(response.text)

可以看到,在发送GET请求时,使用了一个 headers 字典来指定请求头。其中 User-Agent 是模拟浏览器发送请求的标准请求头之一。可以根据实际需求添加更多的请求头信息。

添加查询参数

除了请求头外,还可以通过 params 参数向HTTP请求中添加查询参数。以下是一个示例代码:

import httpx

params = {'key1': 'value1', 'key2': 'value2'}

response = httpx.get('https://www.example.com', params=params)

print(response.status_code)
print(response.text)

在上述代码中,params 参数被用于将查询参数添加到 GET 请求中。具体而言,HTTPX 会根据键值对自动生成查询字符串并将其附加到 URL 的末尾,就像在浏览器中一样。

3. 超时设置

在发送HTTP请求时,往往需要设置超时时间以避免等待过长时间的响应。HTTPX 提供了设置超时时间的方法,下面介绍如何在 HTTPX 中设置超时时间:

发送单次请求时设置超时时间

可以通过 timeout 参数来设置单个请求的超时时间,单位为秒(s)。以下是一个示例代码:

import httpx

# 设置 5 秒超时时间
timeout = httpx.Timeout(5)

response = httpx.get('https://www.example.com', timeout=timeout)

print(response.status_code)
print(response.text)

在上述代码中,timeout 参数被用于将超时时间设置为 5 秒。如果在 5 秒内没有收到服务器的响应,HTTPX 将自动取消该请求并抛出 httpx.ReadTimeout 异常。

全局设置超时时间

除了可以在单个请求中设置超时时间外,还可以全局设置所有请求的超时时间。可以通过创建一个 Client 实例并指定超时时间来实现。以下是一个示例代码:

import httpx

# 全局设置 5 秒超时时间
client = httpx.Client(timeout=5)

response = client.get('https://www.example.com')

print(response.status_code)
print(response.text)

在上述代码中,创建了一个 Client 实例,并将超时时间设置为 5 秒。在之后的所有请求中,都会默认使用这个超时时间。需要注意的是,全局设置会影响所有请求,因此需要根据实际情况合理地设置超时时间。

4. 异步请求

异步请求示例

首先,需要安装异步标准库 asyncio 和 HTTPX 库。

安装完成后,就可以在 Python 脚本中使用异步请求了。以下是一个简单的异步 GET 请求示例:

import asyncio
import httpx

async def main():
    async with httpx.AsyncClient() as client:
        response = await client.get('https://www.example.com')
        print(response.status_code)
        print(response.text)

asyncio.run(main())

在上述代码中,我们使用异步函数 main() 来发送异步 GET 请求。其中,使用了 httpx.AsyncClient() 创建了一个异步客户端实例,然后调用了 client.get() 函数来发送 GET 请求。

在异步请求中,需要使用关键字 await 等待异步操作执行完成,这样才能保证程序按照正确的顺序执行。

进一步使用示例

除了简单的 GET 请求外,HTTPX 还支持复杂的异步操作和定制化需求。以下是一个使用异步 POST 请求并上传文件的示例:

import asyncio
import httpx

async def main():
    async with httpx.AsyncClient() as client:
        # 上传文件
        files = {'file': ('example.txt', 'Hello, world!')}
        response = await client.post('https://www.example.com/upload', files=files)

        # 显示响应信息
        print(response.status_code)
        print(response.text)

asyncio.run(main())

在上述代码中,使用了 client.post() 函数向服务器上传文件。其中,files 参数被用于指定上传的文件信息。

需要注意的是,在异步请求过程中,需使用 async with httpx.AsyncClient() as client: 的方式创建异步客户端实例,并通过 async/await 关键字等待异步操作完成,这样才能确保程序正确执行。

5. SSL/TLS证书验证

SSL/TLS证书验证是保证HTTP通信安全的重要手段之一。HTTPX提供了对SSL/TLS证书的验证机制,下面介绍如何在HTTPX中进行SSL/TLS证书验证:

验证服务器证书

HTTPX 默认会验证服务器证书,如果证书无效或不可信,则会抛出 httpx.RemoteProtocolError 异常。以下是一个示例代码:

import httpx

response = httpx.get('https://www.example.com')

print(response.status_code)
print(response.text)

在上述代码中,使用 httpx.get() 函数向服务器发送 GET 请求,并默认启动 SSL/TLS 证书验证。如果服务器证书无效,则 HTTPX 会抛出 httpx.RemoteProtocolError 异常。

禁用服务器证书验证

虽然 SSL/TLS 证书验证是确保通信安全的重要手段,但在一些特殊情况下需要禁用证书验证,例如调试时使用自签名证书等。可以通过将 verify 参数设置为 False 来禁用 SSL/TLS 证书验证。以下是一个示例代码:

import httpx

response = httpx.get('https://www.example.com', verify=False)

print(response.status_code)
print(response.text)

在上述代码中,verify=False 参数被用于禁用服务器证书验证。需要注意的是,这种方法会降低通信安全性,应谨慎使用。

指定客户端证书

除了验证服务器证书外,HTTPX 还支持指定客户端证书。可以通过 cert 参数来指定客户端证书和私钥文件的路径。以下是一个示例代码:

import httpx

client_cert = ('path/to/cert.pem', 'path/to/key.pem')

response = httpx.get('https://www.example.com', cert=client_cert)

print(response.status_code)
print(response.text)

在上述代码中,client_cert 变量被用于指定客户端证书和私钥的路径。需要注意的是,客户端证书应该由受信任的第三方机构颁发,并且应该进行保护。

6. 文件上传和下载

HTTPX支持文件上传和下载,可以通过httpx.post() 和 httpx.get() 函数向服务器上传和下载文件。下面分别介绍如何在 HTTPX 中进行文件上传和下载:

  1. 文件上传示例
    可以通过 files 参数来实现文件上传功能。以下是一个文件上传的示例代码:
import httpx

with open('example.txt', 'rb') as f:
files = {'file': ('example.txt', f)}
response = httpx.post('https://www.example.com/upload', files=files)

print(response.status_code)
print(response.text)


在上述代码中,使用了 open() 函数打开本地文件,并将文件数据添加到 files 参数中。然后,使用 httpx.post() 函数向服务器发送 POST 请求并上传文件。

需要注意的是,('example.txt', f) 中,第一个参数是文件名,第二个参数是文件内容。具体而言,文件内容应该以二进制格式表示。

文件下载示例
可以通过 stream=True 参数将文件下载至内存中,并逐步写入本地文件。以下是一个文件下载的示例代码:

import httpx

response = httpx.get('https://www.example.com/image.jpg', stream=True)

with open('image.jpg', 'wb') as f:
for chunk in response.iter_bytes():
f.write(chunk)

print(response.status_code)

在上述代码中,使用了 httpx.get() 函数向服务器发送 GET 请求。其中,stream=True 参数被用于启动响应流模式,这样可以将文件下载到内存中,然后逐步写入本地文件。需要注意的是,在下载大文件时,响应流模式可以减少内存占用并提高性能。

Cookie管理

HTTPX提供了用于管理Cookie的工具,可以通过httpx.CookieJar()对象来管理Cookie。下面介绍如何在HTTPX中进行Cookie管理:

使用CookieJar管理Cookie

可以使用 httpx.CookieJar() 对象来管理 Cookie。以下是一个示例代码:

import httpx

# 创建 CookieJar 实例
cookie_jar = httpx.CookieJar()

# 将 Cookie 添加到 CookieJar 中
cookie = httpx.cookies.Cookie(name='name', value='value')
cookie_jar.set_cookie(cookie)

# 使用 CookieJar 发送请求
with httpx.Client(cookie_jar=cookie_jar) as client:
    response = client.get('https://www.example.com')

print(response.status_code)

在上述代码中,首先创建了一个 httpx.CookieJar() 实例,并将 httpx.cookies.Cookie() 对象添加到 CookieJar 中。然后,在使用 HTTPX 发送请求时,通过 cookie_jar=cookie_jar 参数来指定使用 CookieJar 管理 Cookie。

需要注意的是,通过 set_cookie() 方法向 httpx.CookieJar() 添加 Cookie 后,这些 Cookie 将被自动附加到后续的 HTTP 请求中。

使用Session管理Cookie

除了使用 httpx.CookieJar() 对象管理 Cookie 外,还可以使用 httpx.Client() 对象的 Session 来管理 Cookie。以下是一个示例代码:

import httpx

# 创建 Session 实例
session = httpx.Client()

# 向 Session 中添加 Cookie
cookie = httpx.cookies.Cookie(name='name', value='value')
session.cookies.set_cookie(cookie)

# 使用 Session 发送请求
response = session.get('https://www.example.com')

print(response.status_code)

在上述代码中,通过 httpx.Client() 创建了一个 HTTP 客户端实例,并使用 session.cookies.set_cookie() 方法向 Session 中添加 Cookie。然后,在使用 HTTPX 发送请求时,不需要指定 cookie_jar 参数,而是使用 Session 自动管理 Cookie。

需要注意的是,httpx.Client() 的 Session 会自动保存并发送所有 Cookie,因此在发送多个 HTTP 请求时,可以方便地管理 Cookie。

连接池

HTTPX 是一个 Python 的异步 HTTP 客户端库。它支持连接池来重用已建立的 HTTP 连接,从而提高性能并减少网络延迟。

创建连接池

要创建连接池,请使用 httpx.AsyncClient() 构造函数并指定 limits 参数。

import httpx

limits = httpx.Limits(max_connections=100, max_keepalive=10)
client = httpx.AsyncClient(limits=limits)

此代码将创建一个最大连接数为 100,最大保持活动连接数为 10 的连接池。

使用连接池

一旦你创建了连接池,你可以像正常地发送请求一样使用 httpx.AsyncClient() 实例发送请求。在创建客户端时,HTTPX 将自动管理连接池中的连接。

response = await client.get("https://www.example.com")
print(response.text)

这将使用连接池中的空闲连接来发送 HTTP GET 请求,并返回响应。如果没有可用的连接,HTTPX 将自动创建一个新连接。

3. 使用HTTPX编写Web爬虫

import asyncio

import httpx
from bs4 import BeautifulSoup


async def fetch(url):
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        return response.text


async def scrape():
    url = "https://book.douban.com/top250"
    html = await fetch(url)
    soup = BeautifulSoup(html, "html.parser")
    books = []
    for book in soup.select(".indent > table"):
        title = book.select_one(".pl2 > a")["title"]
        link = book.select_one(".pl2 > a")["href"]
        rating = book.select_one(".rating_num").text.strip()
        author = book.select_one(".pl").text.strip().split("/")[0]
        books.append({"title": title, "link": link, "rating": rating, "author": author})
    return books


if __name__ == "__main__":
    books = asyncio.run(scrape())
    for book in books:
        print(book)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTPX从入门到放弃 的相关文章

随机推荐

  • 2023牛客暑期多校训练营7 I We Love Strings

    https ac nowcoder com acm contest 57361 I 分治 容斥原理 include
  • [es6] 模板字符串内添加if判断

    我之前一只知道模板字符串中可以用三目运算符做判断 但今天有个需求要在模板字符串中添加if条件语句 于是百度了一下 在此记录一下 直接看代码吧 var html div class p 1 p p 2 p p 3 p p function i
  • Mybatis返回自增主键id的值,2种方式

    1 方式一 不建议使用 有BUG的方式 通过useGeneratedKeys true keyProperty id 来设置返回新的id值 这里有个问题就是 通过这种方式插入的值 经常会返回1 原因是因为他这里的意思是返回当前影响的行数 不
  • lc marathon 7.16

    文章目录 138 复制带随机指针的链表 https leetcode cn problems copy list with random pointer 剑指 Offer II 092 翻转字符 https leetcode cn prob
  • c++ 自定义时间格式

    1 自定义时间格式 我们可以使用strftime 函数将时间格式化为我们想要的格式 它的原型如下 size t strftime char strDest size t maxsize const char format const str
  • 关于HR系统升级为集团版的设计总结

    刚刚完了公司HR系统的升级 系统实现了从单一公司使用到多公司使用的转变 在升级的一个多月的时间内 虽然很苦 但感觉自已在系统架构上受益非浅 具体有以下感悟 一 MVC还是很重要 系统框架是五年前用delphi设计的 采用的基类加扩展类的模式
  • fluent p1模型_Fluent辐射传热模型理论以及相关设置(一)

    原标题 Fluent辐射传热模型理论以及相关设置 一 本文来源于网络 原作者 Libo CHen 感谢作者的辛苦整理和撰写 1概述 在传热的仿真中 有时候会不可避免的涉及到辐射传热 而我们对Fluent中辐射模型的了解甚少 很难得到可靠的计
  • 关于Unity-Web的Development build。

    Unity转手游之后是否该勾选development Build 首先看一看官方文档的解释 Development Build When you check the Development Build checkbox Unity gene
  • 【杂记】EMC、EMI、EMS、TVS、ESD概念学习总结

    注 杂记 系列为日常网搜资料的简单堆砌而积累成之 如有错误恭谢指出 标识为 原创 其实不完全是 只是多引用再整理 大都引自网络 侵删 EMC EMC Electromagnetic Compatibility 属于概念 为电磁兼容性 电磁兼
  • java 中unsigned类型的转换

    java 中unsigned类型的转换
  • oh-my-zsh安装与常用插件

    zsh 介绍 工欲善其事 必先利其器 zsh也是一种 shell 兼容最常用的 bash 这种 shell 的命令和操作 bash 虽然很标准 但是自己日常使用方便更重要 oh my zsh 提供了丰富的插件和提 安装 先使用命令查看系统支
  • whisper:robust speech recognition via large-sacle weak supervision

    OpenAI Whisper 精读 论文精读 45 哔哩哔哩 bilibili更多论文 https github com mli paper reading 视频播放量 68331 弹幕量 327 点赞数 2332 投硬币枚数 1192 收
  • QJsonObject的使用示例

    介绍 负责封装JSON对象 是键 值对列表 其中键是惟一的字符串 值由QJsonValue表示 1 QJsonObjec 封装了Json里的对象 接口与QMap相似 都具有size insert 和remove 等操作 还可以使用标准C 迭
  • SQL Server(三)-查询数据(2)

    函数与分组查询数据 一 系统函数 在SQL Server 2008中系统函数是指在SQL Server 2008中自带的函数 主要分为聚合函数 数据类型转换函数 日期函数 数学函数及其他一些常用的函数 1 聚合函数 对一组值进行计算 然后返
  • 雅思词汇表8000词版_你别不信,雅思光靠背单词也能上6.5!

    点击上方蓝字关注我哦 打算备考雅思 大家都是知道IELTS考试对词汇量要求是比较高的 如果自身的英语基础薄弱 想短时间内在雅思成绩上有所突破是很困难的一件事情 因此很多考生会 病急乱投医 购买各式各样雅思词汇手册进行疯狂记忆 每本单词手册都
  • Keil 重定向 fputc 函数 以及 printf 函数的代码尺寸测试

    本文的开发环境为 Keil Cortex M3 内核处理器 重定向 fputc 函数方法 如果想使用库函数 printf 必须要将 fputc 重定向到自己的串口上 术语 重定向 可以理解为用户重写 fputc 函数 在重写的函数体内调用自
  • vulnhub-KIOPTRIX: LEVEL 1.3 (#4)-KioptrixVM4靶场

    以下演示均在测试环境进行 遵纪守法 靶场下载地址 Kioptrix Level 1 3 4 VulnHub 镜像下载解压之后是一个 vhd文件 需要新建虚拟机 虚拟机操作系统任选一个linux系列的系统 一直下一步 到了设置磁盘 按照截图设
  • Qt系列文章之(十) ui文件的使用

    上一篇文章在主函数中构造了一个简单的主窗口界面 继承了一些基本元素 如菜单栏 工具栏 悬浮窗口 主界面等元素 不过这些元素都是在栈区开辟的临时变量 放在主函数里面来实现 这不是一种标准的UI界面开发手段 一般在界面项目开发之中有几个典型的开
  • PyCharm远程连接失败、错误,报错:Can‘t connect...【解决方法与错误分析】

    学习网站推荐 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 文章目录 一 前言 二 报错 2018版 2020版 三 错误分析 我的错误原因 其他3种可能因粗心导致的原因 四 如果你不想再
  • HTTPX从入门到放弃

    1 什么是HTTPX HTTPX是一款Python栈HTTP客户端库 它提供了比标准库更高级别 更先进的功能 如连接重用 连接池 超时控制 自动繁衍请求等等 HTTPX同时也支持同步和异步两种方式 因此可以在同步代码和异步代码中通用 HTT