探索 Python 库:HTTPX

发布日期:2026-07-19 08:44:02  来源 : 杭州电子商务研究院    浏览量 :0
杭州电子商务研究院 发布日期:2026-07-19 08:44:02  
0

介绍

HTTPX提供了 Requests 库中的重要功能以及对 HTTP/1.1 和 HTTP/2 的支持。您可以访问HTTPX 的网站以了解 HTTPX 拥有哪些功能。在本指南中,您将通过实际示例探索以下 HTTPX 主题:

  • 在 URL 中传递数据
  • 设置自定义标头
  • 访问不同形式的数据
  • 发布不同形式的数据
  • 处理重定向和超时

本指南中的所有代码均假定 HTTPX 库已安装并已成功导入到您当前的工作环境中,即import httpx

在 URL 中传递数据

假设您想从 Yahoo! 财经网站获取某公司的股票统计数据。关联的 URL 将是https://finance.yahoo.com/quote/ABXY/key-statistics?p=ABXY,其中“ABXY”是该公司的注册缩写。请注意,URL 由一个键值对组成,其中键为“p”,值为“ABXY”。因此,如果您想获取另一家公司的股票统计数据,只需将“ABXY”替换为您所需公司的注册缩写即可。

要实际学习这个概念,您可以获取 PS (NASDAQ: Pluralsight) 的股票统计数据。首先创建一个字典,如下所示:

      eq = {'p': 'PS'}
    

最后,使用httpx.get方法并提供包含eq变量的完整 URL

      r = httpx.get('https://finance.yahoo.com/quote/'+eq['p']+'/key-statistics', params=eq)
    

您可以使用url属性查看结果 URL,如下所示:

      print(r.url)
# https://finance.yahoo.com/quote/PS/key-statistics?p=PS
    

设置自定义标头

如果您想让客户端和服务器通过 HTTP 请求传递其他数据,可以使用 HTTPX 库设置自定义 HTTP 标头。例如,考虑 YouTube,其标头可以按如下所示提取:

      url = 'https://youtube.com'
r = httpx.get(url) 
print(r.headers)
    

上述代码的结果是以下 YouTube 标题:

      Headers([('x-frame-options', 'SAMEORIGIN'), ('strict-transport-security', 'max-age=31536000'), ('expires', 'Tue, 27 Apr 1971 19:44:06 GMT'), ('x-content-type-options', 'nosniff'), ('content-encoding', 'gzip'), ('p3p', 'CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en-GB for more info."'), ('content-type', 'text/html; charset=utf-8'), ('cache-control', 'no-cache'), ('date', 'Sat, 27 Jun 2020 07:17:08 GMT'), ('server', 'YouTube Frontend Proxy'), ('x-xss-protection', '0'), ('set-cookie', 'YSC=QxCnrEi_49U; path=/; domain=.youtube.com; secure; httponly; samesite=None'), ('set-cookie', 'VISITOR_INFO1_LIVE=L4qLJ2-3U18; path=/; domain=.youtube.com; secure; expires=Thu, 24-Dec-2020 07:17:08 GMT; httponly; samesite=None'), ('set-cookie', 'GPS=1; path=/; domain=.youtube.com; expires=Sat, 27-Jun-2020 07:47:08 GMT'), ('alt-svc', 'h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"'), ('transfer-encoding', 'chunked')])
    

注意,内容编码标头的默认值gzip。如果你想使用其他替代方案(例如br ) ,该怎么办?

要更新标题的值,请将新值存储在字典中,并将字典传递给get方法的headers参数,如下所示:

      headers = {'accept-encoding': 'br'}
print(httpx.get(url, headers=headers).headers) # The updated content encoding is br
    

更新后的标题如下所示:

      Headers([
...
('content-encoding', 'br'), 
...
    

访问不同形式的数据

您可以使用 HTTPX 库来获取文本、图像和 JSON 数据。在本节中,您将学习如何获取大小不一的文本和图像数据。对于较大的数据,您可以执行流式传输,本节将进一步解释这一点。

1. 获取文本数据

假设您想从包含不超过 5-10 行文本的网页中获取 HTML 格式的数据,如图所示:

      # https://archive.ics.uci.edu/ml/datasets/Container+Crane+Controller+Data+Set
fetch = httpx.get('https://archive.ics.uci.edu/ml/machine-learning-databases/00436/')
print(fetch.text)
    

输出

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /ml/machine-learning-databases/00436</title>
 </head>
 <body>
<h1>Index of /ml/machine-learning-databases/00436</h1>
<ul><li><a href="/ml/machine-learning-databases/"> Parent Directory</a></li>
<li><a href="Container_Crane_Controller_Data_Set.csv"> Container_Crane_Controller_Data_Set.csv</a></li>
</ul>
<address>Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips SVN/1.7.14 Phusion_Passenger/4.0.53 mod_perl/2.0.11 Perl/v5.16.3 Server at archive.ics.uci.edu Port 443</address>
</body></html>
    

2. 流式文本数据

要获取大量文本数据,您可以执行流式传输,即一次获取有限量的数据,直到到达页面末尾。为了理解这个主题,假设您想从 Wikipedia 页面中提取有关捉鬼敢死队的所有文本数据。为此,您可以在嵌套在httpx.stream方法中的for循环内逐行获取数据,如下所示:

      with httpx.stream("GET", "https://en.wikipedia.org/wiki/Ghostbusters") as r:
    count = 0
    for line in r.iter_lines():
#         print(line)
        count += 1
print(count)        
# 1166
    

在上面的代码中,print(line)语句被注释掉了。您可以取消注释并观察其输出流。最后一行print(count)描述了流期间提取的总行数 (1166)。

3.获取图像数据

获取图像数据的过程与获取文本数据的过程类似。但是,唯一的区别在于在 Python 环境中获取数据后如何读取它。假设您需要从 Pixabay 网站获取企鹅图像。为此,请在 httpx.get 方法中传递图像 URL 然后使用PILio方法读取和显示数据,如下所示:

      from PIL import Image
from io import BytesIO

# https://pixabay.com/photos/penguin-figure-christmas-santa-hat-1843544/
g = httpx.get('https://cdn.pixabay.com/photo/2016/11/20/19/02/penguin-1843544_1280.jpg')
Image.open(BytesIO(g.content)).show()
    

4. 流图像数据

您可以使用httpx.stream方法来获取大型图像数据。与流式传输文本数据的唯一区别是,这次for循环会遍历iter_bytes,如下所示:

      with httpx.stream("GET", "https://cdn.pixabay.com/photo/2016/11/20/19/02/penguin-1843544_1280.jpg") as r:    
    for data in r.iter_bytes():
        print(data)
    

发布不同形式的数据

HTTPX 可用于在网页上的表单内发布数据。在本节中,您将了解如何将文本和文件数据上传到网页。

1. 上传文本数据

假设您想使用 HTTPX 在网页上输入“Hello, World!”。输入区域将如下所示,颜色为绿色:

为此,请使用post方法并提供数据参数中的信息,如下所示:

      data = {'htmlString': 'Hello, World!'}
 # Locate a correct node, for me it is "htmlString"
r = httpx.post("<URL>", data=data)
print(str(r.content).replace('\\n','').replace('\\t','').replace('\\r',''))
    

上述代码生成 HTML 输出。由于输出太大,下面给出的是格式正确的网页,其中所需框中包含“Hello, World!”字符串:

2.上传文件

很多网站都需要你上传文件到他们的服务器。下面就是一个绿色方框中突出显示的例子:

要上传完整文件而不是仅仅编写字符串,您可以使用post方法的files参数。假设您的驱动器上存储了一个 HTML 文件upload.html。您可以使用给定的代码将其上传到此网页:

<div class
以上内容来自杭州电子商务研究院推送
分享到:

长按或扫码识别 分享给好友

长按或扫码识别 分享给好友
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据