urllib、urllib2、urllib3 和 request 模块之间有什么区别?
- 2024-12-17 08:31:00
- admin 原创
- 158
问题描述:
urllib
在 Python 中,、、urllib2
和模块之间有什么区别?为什么有三个?它们似乎做同样的事情urllib3
……requests
解决方案 1:
我知道已经有人这么说过,但我强烈推荐requests
Python 包。
如果您使用过 Python 以外的语言,您可能会认为urllib
它urllib2
易于使用、代码量少且功能强大,我以前也是这么想的。但是这个requests
包非常有用且简短,每个人都应该使用它。
首先,它支持完全 RESTful API,并且非常简单:
import requests
resp = requests.get('http://www.mywebsite.com/user')
resp = requests.post('http://www.mywebsite.com/user')
resp = requests.put('http://www.mywebsite.com/user/put')
resp = requests.delete('http://www.mywebsite.com/user/delete')
无论是 GET / POST,您都无需再次编码参数,它只需将字典作为参数即可:
userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)
另外它甚至有一个内置的 JSON 解码器(同样,我知道json.loads()
不需要写太多,但这确实很方便):
resp.json()
或者,如果您的响应数据只是文本,请使用:
resp.text
这只是冰山一角。以下是来自请求站点的功能列表:
国际域名和 URL
保持活动和连接池
具有 Cookie 持久性的会话
浏览器样式的 SSL 验证
基本/摘要身份验证
优雅的键/值 Cookie
自动减压
Unicode 响应主体
分段文件上传
连接超时
.netrc 支持
列表项
Python 2.7、3.6—3.9
线程安全的。
解决方案 2:
在 Python 2 标准库中,有两个并存的 HTTP 库。尽管名称相似,但它们毫无关联:它们的设计和实现都不同。
urllib
是最初的 Python HTTP 客户端,在Python 1.2中被添加到标准库中。 早期的文档可以在Python 1.4urllib
中找到。urllib2
是一个功能更强大的 HTTP 客户端,已添加到 Python 1.6 中,旨在替代urllib
:
urllib2 - urllib 的新版本和改进版本,但不兼容(仍处于实验阶段)。
早期的文档可以在Python 2.1urllib2
中找到。
Python 3 标准库有一个新的 urllib
,它是旧模块的合并/重构/重写的版本。
urllib3
是第三方包(即不在 CPython 的标准库中)。尽管名字如此,但它与标准库包无关,并且将来没有打算将其包含在标准库中。
最后,requests
内部使用urllib3
,但其目标是提供更易于使用的 API。
解决方案 3:
urllib2 提供了一些额外的功能,即urlopen()
函数可以让你指定标头(通常你以前必须使用 httplib,它要冗长得多。)但更重要的是,urllib2 提供了类Request
,它允许使用更具声明性的方式来执行请求:
r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)
请注意,这urlencode()
仅在 urllib 中,而不是 urllib2 中。
urllib2 中还有用于实现更高级 URL 支持的处理程序。简而言之,除非您使用的是旧代码,否则您可能希望使用 urllib2 中的 URL 打开器,但您仍需要将某些实用函数导入 urllib。
附加答案
使用 Google App Engine,您可以使用 httplib、urllib 或 urllib2 中的任何一个,但它们都只是 Google 的 URL Fetch API 的包装器。也就是说,您仍然受到相同的限制,例如端口、协议和允许的响应长度。不过,您可以像预期的那样使用库的核心来检索 HTTP URL。
解决方案 4:
urllib和urllib2都是执行 URL 请求相关操作但提供不同功能的 Python 模块。
1)urllib2 可以接受一个 Request 对象来设置 URL 请求的标头,urllib 仅接受 URL。
2)urllib 提供了urlencode方法,用于生成 GET 查询字符串,urllib2 没有此功能。这也是 urllib 经常与 urllib2 一起使用的原因之一。
Requests - Requests 是一个用 Python 编写的简单、易于使用的 HTTP 库。
1)Python Requests 会自动对参数进行编码,因此您只需将它们作为简单参数传递即可,而使用 urllib 时则需要先使用urllib.encode()方法对参数进行编码,然后再传递它们。
2)它自动将响应解码为Unicode。
3) Requests 还具有更方便的错误处理功能。如果您的身份验证失败,urllib2 将引发 urllib2.URLError,而 Requests 将返回正常的响应对象,正如预期的那样。您只需通过布尔值response.ok来查看请求是否成功
解决方案 5:
只是为了补充现有的答案,我没有看到任何人提到 python 请求不是本机库。 如果您同意添加依赖项,那么请求就可以了。 但是,如果您试图避免添加依赖项,urllib 是一个已经可供您使用的本机 python 库。
解决方案 6:
一个显著的区别是将 Python2 移植到 Python3。urllib2 不适用于 Python3,其方法已移植到 urllib。因此,如果您大量使用 urllib,并且希望将来迁移到 Python3,请考虑使用 urllib。但是 2to3 工具会自动为您完成大部分工作。
解决方案 7:
我认为所有答案都很好。但关于 urllib3 的详细信息较少。urllib3 是一款非常强大的 Python HTTP 客户端。要安装以下两个命令都可以,
urllib3
使用 pip,
pip install urllib3
或者你可以从 Github 获取最新代码并使用以下方式安装它们,
$ git clone git://github.com/urllib3/urllib3.git
$ cd urllib3
$ python setup.py install
然后你就可以出发了,
只需使用以下方式导入 urllib3:
import urllib3
在这里,您不需要直接创建连接,而是需要一个 PoolManager 实例来发出请求。这将为您处理连接池和线程安全。还有一个 ProxyManager 对象用于通过 HTTP/HTTPS 代理路由请求。您可以在此处参考文档。示例用法:
>>> from urllib3 import PoolManager
>>> manager = PoolManager(10)
>>> r = manager.request('GET', 'http://google.com/')
>>> r.headers['server']
'gws'
>>> r = manager.request('GET', 'http://yahoo.com/')
>>> r.headers['server']
'YTS/1.20.0'
>>> r = manager.request('POST', 'http://google.com/mail')
>>> r = manager.request('HEAD', 'http://google.com/calendar')
>>> len(manager.pools)
2
>>> conn = manager.connection_from_host('google.com')
>>> conn.num_requests
3
正如urrlib3
文档中提到的,urllib3
它带来了许多 Python 标准库中缺少的关键功能。
线程安全。
连接池。
客户端 SSL/TLS 验证。
使用多部分编码上传文件。
用于重试请求和处理 HTTP 重定向的助手。
支持 gzip 和 deflate 编码。
HTTP 和 SOCKS 的代理支持。
100%测试覆盖率。
按照用户指南获取更多详细信息。
响应内容(HTTPResponse 对象提供状态、数据和标头属性)
使用带有响应内容的 io Wrappers
创建查询参数
urllib3 的高级用法
requests
请求urllib3
在后台使用,使创建requests
和检索数据变得更加简单。首先,keep-alive 是 100% 自动的,而urllib3
不是。它还具有事件挂钩,当触发事件(如接收响应)时会调用回调函数。在 中requests
,每种请求类型都有自己的功能。因此,您无需创建连接或池,而是直接获取 URL。
要requests
使用 pip 安装,只需运行
pip install requests
或者你也可以直接通过源代码安装,
$ git clone git://github.com/psf/requests.git
$ cd requests
$ python setup.py install
然后,import requests
您可以在此处参考官方文档,有关会话对象,SSL 验证和事件挂钩等一些高级用法,请参考此网址。
解决方案 8:
我喜欢这个urllib.urlencode
功能,但它似乎不存在urllib2
。
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
解决方案 9:
获取 URL 的内容:
try: # Try importing requests first.
import requests
except ImportError:
try: # Try importing Python3 urllib
import urllib.request
except AttributeError: # Now importing Python2 urllib
import urllib
def get_content(url):
try: # Using requests.
return requests.get(url).content # Returns requests.models.Response.
except NameError:
try: # Using Python3 urllib.
with urllib.request.urlopen(index_url) as response:
return response.read() # Returns http.client.HTTPResponse.
except AttributeError: # Using Python3 urllib.
return urllib.urlopen(url).read() # Returns an instance.
request
为响应编写 Python2 和 Python3 及其依赖项代码很困难,因为它们的urlopen()
函数和requests.get()
函数返回不同的类型:
Python2
urllib.request.urlopen()
返回http.client.HTTPResponse
Python3
urllib.urlopen(url)
返回instance
请求
request.get(url)
返回requests.models.Response
解决方案 10:
您通常应该使用 urllib2,因为它有时会通过接受 Request 对象使事情变得更容易一些,并且还会在协议错误时引发 URLException。但是对于 Google App Engine,您不能使用任何一个。您必须使用Google 在其沙盒 Python 环境中提供的URL Fetch API。
解决方案 11:
我发现上述答案中缺少的一个关键点是 urllib 返回一个类型为 的对象,<class http.client.HTTPResponse>
而requests
返回<class 'requests.models.Response'>
。
因此,read() 方法可以与 一起使用urllib
,但不能与 一起使用requests
。
PS :requests
已经拥有如此多的方法,几乎不需要再多一个了read()
;>
解决方案 12:
简而言之:各有各的理由
为什么要分别使用 urllib
、和urllib2
?urllib3
`requests`
requests
是常见情况下的首选(第三方)库,因为它提供了最易于使用的编程接口。urllib3
如果您需要在复杂情况下编写高度专业化和/或高度优化的代码,那么(也是第三方并由 内部使用requests
)是首选库。urllib
如果您出于某种原因需要避免外部依赖,那么(来自 Python 标准库)是最好的选择。如果您只是想避免外部依赖,请再想一想;这可能不是最好的主意。urllib2
只有当您仍然使用 Python 2 时才是最好的,如果可以的话您应该今天避免这样做,因为 Python 2 不再维护。