Python3中进行HTTP请求的4种方式

简介:

Python3中进行HTTP请求的4种方式


python包索引(PyPI)提供了超过10万个代码库的包,它能够帮助python程序员完成许多工作,无论是构建web应用程序还是分析数据。另外PyPI还提供了很多诸如 twilio 之类的API的辅助库。

下面让我们通过使用4个不同的 Python HTTP 库来学习如何从 RESTful API 检索和解析 JSON 数据,以此来演示PyPI包的强大功能。

文中的每个示例都包含以下内容:

  1. 定义要解析的URL,我们将使用Spotify API,因为它不需要在请求时进行身份验证。
  2. 创建一个 HTTP GET 去请求这个URL。
  3. 解析返回的JSON数据。

我们将要使用的四个库用了不同的方法得到同一个结果。如果你把结果输出,将会看到一个有Spotify搜索结果的字典:

*注意:结果可能会根据你使用的Python版本而有所不同。在这篇文章中,所有的代码都使用Python 3编写。 如果你仍在使用Python 2.X,那么请考虑为Python 3设置一个virtualenv。

以下说明将帮助您使用virtualenv与Python 3:

  1. 为Python 3测试创建一个名为pythreetest的目录。
  2. 一旦安装了virtualenv,从项目目录中执行以下命令:

使用以下命令创建一个新的virtualenv:


 
 
  1. virtualenv -p python3 myvenv 

使用source命令激活myvenv:


 
 
  1. source myvenv/bin/activate 

现在你将能够使用pip安装需要的库,并在virtualenv中使用Python 3启动解释器,在那里您可以成功导入包。

urllib

urllib是一个内置在Python标准库中的模块,并使用http.client来实现HTTP和HTTPS协议的客户端。 由于urllib是同Python一起进行分发和安装的,因此无需使用 pip 进行安装。 如果你重视稳定性,那么这就是给你准备的。 twilio-python助手库就使用了urllib。

urllib同其他库比起来需要做更多的工作。 例如:你必须在发出HTTP请求之前创建一个URL对象。


 
 
  1. import urllib.request 
  2. import urllib.parse 
  3.  
  4. url = 'https://api.spotify.com/v1/search?type=artist&q=snoop' 
  5. f = urllib.request.urlopen(url) 
  6. print(f.read().decode('utf-8'))  

在上面的例子中,我们将请求URL发送到CGI的stdin,并读取返回给我们的数据。

Requests

Requests是Python社区中最喜欢的库,因为它简洁易用。 Requests由urllib3提供支持,有玩笑说这是“唯一的非转基因HTTP库,适合人类消费”。

Requests 抽象了大量的程式化的代码,使得HTTP请求比使用内置urllib库更简单。

首先用pip进行安装


 
 
  1. pip install requests 

向 Spotify 发送请求


 
 
  1. import requests 
  2.  
  3. r = requests.get('https://api.spotify.com/v1/search?type=artist&q=snoop'
  4.  
  5. r.json()  

输出结果:


 
 
  1. from pprint import pprint 
  2.  
  3. pprint(r.json())  

我们刚刚向Spotify发出了一个GET请求,同时创建了一个名为r的Response 对象,之后使用内置的JSON解码器来处理我们请求的内容。

Octopus

Octopus是为想要GET一切的开发人员准备的。它允许你多任务去访问Spotify。就像它的名字一样,这个库使用线程并发地检索和报告HTTP请求的完成情况,同时可以使用你所熟悉的库。

或者,你可以使用 Tornado 的 IOLoop 进行异步请求,不过在这里就不尽兴尝试了。

通过pip安装:


 
 
  1. pip install octopus-http 

Octopus的设置比前面的例子稍微多一些。 我们必须构建一个响应处理器,并使用内置的JSON库对JSON进行编码。


 
 
  1. import json 
  2.   
  3. from pprint import pprint 
  4. from octopus import Octopus 
  5.   
  6.   
  7. def create_request(urls): 
  8.     data = [] 
  9.   
  10.     otto = Octopus( 
  11.            concurrency=4, auto_start=True, cache=True, expiration_in_seconds=10 
  12.     ) 
  13.   
  14.     def handle_url_response(url, response): 
  15.         if "Not found" == response.text: 
  16.             print ("URL Not Found: %s" % url) 
  17.         else
  18.             data.append(response.text) 
  19.   
  20.     for url in urls: 
  21.         otto.enqueue(url, handle_url_response) 
  22.   
  23.     otto.wait() 
  24.   
  25.     json_data = json.JSONEncoder(indent=None, 
  26.                                  separators=(','': ')).encode(data) 
  27.   
  28.     return pprint(json_data) 
  29.   
  30.   
  31. print(create_request(['https://api.spotify.com/v1/search?type=artist&q=snoop'
  32.                      'https://api.spotify.com/v1/search?type=artist&q=dre']))  

在上面的代码片段中,我们定义了create_requests函数来使用线程Octopus请求。 我们从一个空的list开始,data,并创建Octopus类的一个实例dotto。 最后配置了默认设置。

然后我们构建响应处理器,其中的response参数是Octopus.Response的一个实例。 当每个请求成功后,响应内容将被添加到数据列表中。在响应处理器内部,我们可以使用Octopus类的主要方法。.enqueue方法用于加入新的URL。

我们指定.wait方法等待队列中的所有URL完成加载,然后对JSON列表进行JSON编码并打印结果。

吁,终于结束了。

HTTPie

HTTPie适用于希望快速与HTTP服务器、RESTful API 和 Web 服务进行交互的开发人员,它仅仅需要一行代码。 这个库是“一个可以让你微笑的开源 CLI HTTP客户端:用户友好的 curl 替代方案”。虽然它可以不依赖Python环境,但是它可以通过Pip安装,并用来创建HTTP请求。


 
 
  1. pip install httpie 

默认协议是HTTP,但您可以创建一个别名,并重置HTTPS为默认值,如下所示:


 
 
  1. alias https='http —default-scheme=https' 

之后创建请求:


 
 
  1. https "https://api.spotify.com/v1/search?type=artist&q=snoop" 

使用HTTPie仅需要URL就够了。

最后的想法

Python 生态提供了许多与 JSON api 交互的选择。虽然这些方法对于最简单的请求是相似的, 但随着 HTTP 请求的复杂性增加, 这些差异变得更加明显。多进行尝试, 看看哪一个最适合你的需求。你甚至可以尝试用另一种语言, 如 Ruby。


作者:疯狂的技术宅

来源:51CTO

相关文章
|
2天前
|
缓存 应用服务中间件 Apache
HTTP 范围Range请求
HTTP范围请求是一种强大的技术,允许客户端请求资源的部分内容,提高了传输效率和用户体验。通过正确配置服务器和实现范围请求,可以在视频流、断点续传下载等场景中发挥重要作用。希望本文提供的详细介绍和示例代码能帮助您更好地理解和应用这一技术。
37 19
|
29天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
84 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
10天前
|
JSON JavaScript 前端开发
什么是HTTP POST请求?初学者指南与示范
HTTP POST请求是一种常用的HTTP方法,主要用于向服务器发送数据。通过合理设置请求头和请求主体,可以实现数据的可靠传输。无论是在客户端使用JavaScript,还是在服务器端使用Node.js,理解和掌握POST请求的工作原理和应用场景,对于Web开发至关重要。
126 18
|
13天前
|
数据采集 网络安全 Python
【Python】怎么解决:urllib.error.HTTPError: HTTP Error 403: Forbidden
解决 `urllib.error.HTTPError: HTTP Error 403: Forbidden`错误需要根据具体情况进行不同的尝试。通过检查URL、模拟浏览器请求、使用代理服务器和Cookies、减慢请求速度、使用随机的User-Agent以及使用更加方便的 `requests`库,可以有效解决此类问题。通过逐步分析和调试,可以找到最合适的解决方案。
85 18
|
16天前
|
存储 应用服务中间件 开发工具
对象存储OSS-Python设置代理访问请求
通过 Python SDK 配置 nginx 代理地址请求阿里云 OSS 存储桶服务。示例代码展示了如何使用 RAM 账号进行身份验证,并通过代理下载指定对象到本地文件。
65 15
|
10天前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
54 2
|
27天前
|
Web App开发 大数据 应用服务中间件
什么是 HTTP Range请求(范围请求)
HTTP Range 请求是一种非常有用的 HTTP 功能,允许客户端请求资源的特定部分,从而提高传输效率和用户体验。通过合理使用 Range 请求,可以实现断点续传、视频流播放和按需加载等功能。了解并掌握 HTTP Range 请求的工作原理和应用场景,对开发高效的网络应用至关重要。
65 15
|
27天前
|
数据采集 数据安全/隐私保护 Python
【Python】已解决:urllib.error.HTTPError: HTTP Error 403: Forbidden
通过上述方法,可以有效解决 `urllib.error.HTTPError: HTTP Error 403: Forbidden` 错误。具体选择哪种方法取决于服务器对请求的限制。通常情况下,添加用户代理和模拟浏览器请求是最常见且有效的解决方案。
118 10
|
1月前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
42 3
|
8天前
|
JSON 前端开发 JavaScript
Python中如何判断是否为AJAX请求
AJAX请求是Web开发中常见的异步数据交互方式,允许不重新加载页面即与服务器通信。在Python的Django和Flask框架中,判断AJAX请求可通过检查请求头中的`X-Requested-With`字段实现。Django提供`request.is_ajax()`方法,Flask则需手动检查该头部。本文详解这两种框架的实现方法,并附带代码示例,涵盖安全性、兼容性、调试及前端配合等内容,帮助开发者提升Web应用性能与用户体验。
30 0