urllib、urllib2、urllib3 和 requests 模块有什么区别?
在Python中,urllib
、urllib2
、urllib3
和requests
这几个模块有什么区别呢?为什么会有三个模块?它们看起来好像都能做同样的事情……
11 个回答
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。
在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
,但它的目标是提供一个更容易使用的接口。
我知道之前已经有人提过,但我强烈推荐使用requests
这个Python库。
如果你用过其他编程语言,可能会觉得urllib
和urllib2
很简单,代码不多,而且功能强大,我以前也是这么想的。但是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
- 线程安全。