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

新手上路,请多包涵

In Python, what are the differences between the urllib , urllib2 , urllib3 and requests modules?为什么是三个?他们似乎在做同样的事情……

原文由 Paul Biggar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

我知道已经有人说过了,但我强烈推荐 requests Python 包。

如果你使用过 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.7、3.6—3.9
  • 线程安全的。

原文由 Hutch 发布,翻译遵循 CC BY-SA 4.0 许可协议

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。

原文由 Crast 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题