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

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


答案 1

我知道已经说过了,但我强烈推荐请求Python包。

如果你使用过python以外的语言,你可能会认为并且易于使用,没有太多代码,而且能力很强,这就是我过去的想法。但是这个软件包是如此令人难以置信的有用和简短,每个人都应该使用它。urlliburllib2requests

首先,它支持一个完全宁静的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

这只是冰山一角。以下是请求站点中的功能列表:

  • 国际域名和网址
  • Keep-Alive & Connection Pooling
  • 具有 Cookie 持久性的会话
  • 浏览器式 SSL 验证
  • 基本/摘要式身份验证
  • 优雅的键/值饼干
  • 自动解压
  • Unicode Response Body
  • 分段文件上传
  • 连接超时
  • .netrc 支持
  • 列表项
  • Python 2.7, 3.6—3.9
  • 线程安全。

答案 2

urllib2提供了一些额外的功能,即该函数可以允许您指定标头(通常您过去必须使用httplib,这要详细得多。更重要的是,urllib2提供了该类,它允许使用更具声明性的方法来执行请求:urlopen()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)

请注意,这仅在 urllib 中,而不是 urllib2 中。urlencode()

还有一些处理程序用于在urllib2中实现更高级的URL支持。简短的回答是,除非您正在使用遗留代码,否则您可能希望使用urllib2中的URL打开器,但是对于某些实用程序函数,您仍然需要导入到urllib中。

奖金答案使用Google App Engine,您可以使用任何httplib,urllib或urllib2,但它们都只是Google的URL Fetch API的包装器。也就是说,您仍然受到相同的限制,例如端口、协议和允许的响应长度。不过,您可以使用库的核心,就像您期望的那样检索HTTP URL。