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

1041 投票
11 回答
486958 浏览
提问于 2025-04-15 17:43

在Python中,urlliburllib2urllib3requests这几个模块有什么区别呢?为什么会有三个模块?它们看起来好像都能做同样的事情……

11 个回答

229

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。

274

在Python 2的标准库中,有两个HTTP库并存。虽然名字相似,但它们其实没有关系:设计和实现方式都不同。

  • urllib是最早的Python HTTP客户端,早在Python 1.2就被加入到标准库中。关于urllib的早期文档可以在Python 1.4找到。

  • urllib2是一个更强大的HTTP客户端,在Python 1.6中加入,它的目的是替代urllib

    urllib2 - 新版的urllib,功能更强但不兼容(仍在实验阶段)。

    关于urllib2的早期文档可以在Python 2.1找到。

在Python 3的标准库中,有一个全新的 urllib,这是对之前两个模块的合并、重构和重写版本。

urllib3是一个第三方包(也就是说,它不在CPython的标准库里)。尽管名字相似,但它与标准库的包没有关系,未来也没有计划将其加入标准库。

最后,requests内部使用urllib3,但它的目标是提供一个更容易使用的接口。

875

我知道之前已经有人提过,但我强烈推荐使用requests这个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

这只是冰山一角。以下是requests网站上的功能列表:

  • 国际域名和URL支持
  • 保持连接和连接池
  • 带有Cookie持久化的会话
  • 浏览器风格的SSL验证
  • 基本/摘要认证
  • 优雅的键值对Cookies
  • 自动解压缩
  • Unicode响应体
  • 多部分文件上传
  • 连接超时设置
  • .netrc支持
  • 列表项
  • 支持Python 2.7和3.6—3.9
  • 线程安全。

撰写回答