协慌网

登录 贡献 社区

urllib,urllib2,urllib3 和请求模块之间有什么区别?

在 Python 中, urlliburllib2urllib3requests模块之间有什么区别?为什么有三个?他们似乎在做同样的事情...

答案

我知道已经有人说过了,但是我强烈建议使用 Python 封装requests

如果您使用的是除 python 之外的语言,您可能会认为urlliburllib2易于使用,代码不多且功能强大,这就是我以前的想法。但是requests包是如此有用,而且太短了,每个人都应该使用它。

首先,它支持完全宁静的 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.6—3.4
  • 线程安全的。

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。

这是我对各种 “urllib” 之间的关系的理解:

在 Python 2 标准库中,并排存在两个 HTTP 库。尽管名称相似,但它们是无关的:它们具有不同的设计和不同的实现。

  • urllib是原始的 Python HTTP 客户端,已添加到 Python 1.2 的标准库中。
  • urllib2是在 Python 1.6 中添加的功能更强大的 HTTP 库,旨在最终替代 urllib。

Python 3 标准库具有一个新的 urllib ,它是这两个软件包的合并 / 重构 / 重写的版本。

urllib3是第三方软件包。尽管有名称,但它与标准库软件包无关,并且将来无意将其包含在标准库中。

最后,请求在内部使用 urllib3,但其目标是使用更易于使用的 API。