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

时间: 2024-10-27 13:08:10

Python3中进行HTTP请求的4种方式的相关文章

Android平台中实现数据存储的5种方式_Android

本文介绍Android中的5种数据存储方式,具体内容如下   数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是:  1 使用SharedPreferences存储数据  2 文件存储数据  3 SQLite数据库存储数据  4 使用ContentProvider存储数据  5 网络存储数据   下面将为大家一一详细介绍.   第一种:使用SharedPreferences存储数据  SharedPreferences是Android平台上一个轻量级

用excel高级筛选中选择不重复记录两种方式的差异图解

  excel中高级筛选中选择不重复记录两种方式的差异 高级筛选分为两种方式 在原有区域显示筛选结果 将筛选结果复制到其他位置 在原有区域显示筛选结果被筛选掉的行只是被隐藏了 第二种方式 将筛选结果复制到其他位置 被筛选掉的行已经是被删除的 选中数据区域 观察这个数据区域中有两个行是有重复的 并且分别出现过两次 而且是挨着的 鼠标点按a1单元格 拖动鼠标到e25单元格 松开鼠标 点击菜单栏 数据 筛选 高级筛选命令 在弹出的高级筛选对话框的方式 选择为将筛选结果复制到其他位置 点击复制位置后面的

从流程的自动化中获得最大价值的10种方式

本文讲的是 :从流程的自动化中获得最大价值的10种方式,流程自动化很好,如果它可以节省时间并减少错误.但是如果它不能在业务流程中"很好地契合",那么会难以得到普及.问问有谁没有对语音助手感到伤脑筋. 所幸的是,某些最佳实践让你可以从流程自动化中获得最大价值,以下就是其中的10项. 1.保持简单 一个流程自动化项目越复杂,那么就会出现越来越多的故障点,就越难以修复.当数据切换简单易行,你不要做太多干预的时候,自动化的效果是最好的. 2.如果是语音自动化,必须是单音节! 转向采用基于语音技

ajax中data传参的两种方式分析

本文实例讲述了ajax中data传参的两种方式.分享给大家供大家参考,具体如下: 1. POST方式: /** * 订单取消 * @return {Boolean} 处理是否成功 */ function orderCancel(orderId, commant){ var flag = false; $.ajax({ type: "POST", url: "../order/orderCancel.action", //orderModifyStatus data:

ajax中data传参的两种方式分析_AJAX相关

本文实例讲述了ajax中data传参的两种方式.分享给大家供大家参考,具体如下: 1. POST方式: /** * 订单取消 * @return {Boolean} 处理是否成功 */ function orderCancel(orderId, commant){ var flag = false; $.ajax({ type: "POST", url: "../order/orderCancel.action", //orderModifyStatus data:

android中Webview实现截屏三种方式小结

本人最近学习了android中Webview实现截屏三种方式,下面我来记录一下,有需要了解的朋友可参考.希望此文章对各位有所帮助. 第一种方式 通过调用webview.capturePicture(),得到一个picture对象,根据图像的宽和高创建一个Bitmap,再创建一个canvas,绑定bitmap,最后用picture去绘制. //获取Picture对象 Picture picture = wv_capture.capturePicture(); //得到图片的宽和高(没有reflec

Webx系列之Ajax请求的四种方式

在我们做Web开发中,用到Ajax的地方可谓是随处可见.在Webx的官方文档中,对于Ajax没有明确的支持说明,但是我们可以用另外的两种请求方式来变相实现这种效果.一种是.do请求,一种是.json请求,另一种还是json请求,一种是.htm请求.下面我们来对这四种请求方式做个说明. .do请求 对于.do请求官方的说明是不需要有返回页面的请求,注意了:不需要返回页面的请求,和我们的需求有点相似啊.因为Ajax请求也是不要返回页面,只需要把数据输出到 浏览器端就行了.OK,下面我们用一个城市二级

浅谈PHP发送HTTP请求的几种方式

PHP 开发中我们常用 cURL 方式封装 HTTP 请求,什么是 cURL? cURL 是一个用来传输数据的工具,支持多种协议,如在 Linux 下用 curl 命令行可以发送各种 HTTP 请求.PHP 的 cURL 是一个底层的库,它能根据不同协议跟各种服务器通讯,HTTP 协议是其中一种. 现代化的 PHP 开发框架中经常会用到一个包,叫做 GuzzleHttp,它是一个 HTTP 客户端,也可以用来发送各种 HTTP 请求,那么它的实现原理是什么,与 cURL 有何不同呢? Does

获得数据库连接池中数据连接资源的两种方式

相比于从数据库中直接获取数据库连接,使用数据库连接池的方式可以很大程度的提高数据库连接的效率.因此我们在实际开发中通常会采用数据库连接池的方式获取数据库的连接,在使用完成后这些资源再返还给数据库连接池.下面我们就来看一看常用的数据库连接池的简单的方法. 使用DBCP方式 话不多说,直接上代码.这里仅仅是一个简单的效果呈现,所以只需要打印出一句话即可. package jdbcpool; import java.sql.Connection; import org.apache.commons.d