urllib、urllib2、urllib3 和 request 模块之间有什么区别?

2024-12-17 08:31:00
admin
原创
158
摘要:问题描述:urllib在 Python 中,、、urllib2和模块之间有什么区别?为什么有三个?它们似乎做同样的事情urllib3……requests解决方案 1:我知道已经有人这么说过,但我强烈推荐requestsPython 包。如果您使用过 Python 以外的语言,您可能会认为urllib它urll...

问题描述:

urllib在 Python 中,、、urllib2和模块之间有什么区别?为什么有三个?它们似乎做同样的事情urllib3……requests


解决方案 1:

我知道已经有人这么说过,但我强烈推荐requestsPython 包。

如果您使用过 Python 以外的语言,您可能会认为urlliburllib2易于使用、代码量少且功能强大,我以前也是这么想的。但是这个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:

urlliburllib2都是执行 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()函数返回不同的类型:

  • Python2urllib.request.urlopen()返回http.client.HTTPResponse

  • Python3urllib.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、和urllib2urllib3`requests`

  • requests是常见情况下的首选(第三方)库,因为它提供了最易于使用的编程接口。

  • urllib3如果您需要在复杂情况下编写高度专业化和/或高度优化的代码,那么(也是第三方并由 内部使用requests)是首选库。

  • urllib如果您出于某种原因需要避免外部依赖,那么(来自 Python 标准库)是最好的选择。如果您只是避免外部依赖,请再想一想;这可能不是最好的主意。

  • urllib2只有当您仍然使用 Python 2 时才是最好的,如果可以的话您应该今天避免这样做,因为 Python 2 不再维护。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用