在Python中,urllib, urllib2, urllib3和请求模块之间有什么区别?为什么有三个?他们似乎在做同样的事情……
当前回答
一个相当大的区别是关于将Python2移植到Python3。python3及其移植到urllib的方法不存在Urllib2。 因此,如果你正在大量使用它,并希望将来迁移到Python3,请考虑使用urllib。 然而,2to3工具将自动为您做大部分工作。
其他回答
我发现上述答案中缺少的一个关键点是urllib返回类型为<class http.client的对象。HTTPResponse>而requests返回<class 'requests.models. response '>. HTTPResponse>。
因此,read()方法可以用于urllib,但不能用于请求。
附注:requests已经有很多方法了,几乎不需要像read();>那样再多一个
在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的标准库中)。尽管有这个名字,但它与标准库包无关,将来也不打算将它包括在标准库中。
最后,请求在内部使用urllib3,但它的目标是更易于使用的API。
获取url的内容:
try: # Try importing requests first.
import requests
except ImportError:
try: # Try importing Python3 urllib
import urllib.request
except AttributeError: # Now importing Python2 urllib
import urllib
def get_content(url):
try: # Using requests.
return requests.get(url).content # Returns requests.models.Response.
except NameError:
try: # Using Python3 urllib.
with urllib.request.urlopen(index_url) as response:
return response.read() # Returns http.client.HTTPResponse.
except AttributeError: # Using Python3 urllib.
return urllib.urlopen(url).read() # Returns an instance.
很难为响应编写Python2和Python3和请求依赖代码,因为它们的urlopen()函数和requests.get()函数返回不同的类型:
Python2 urllib.request.urlopen()返回一个http.client.HTTPResponse Python3 urllib.urlopen(url)返回一个实例 Request Request .get(url)返回一个requests.models.Response
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。
奖金的答案 与谷歌应用程序引擎,你可以使用任何的httplib, urllib或urllib2,但他们都只是包装谷歌的URL获取API。也就是说,您仍然受到相同的限制,如端口、协议和允许的响应长度。不过,您可以使用库的核心来检索HTTP url,正如您所期望的那样。
您通常应该使用urllib2,因为它通过接受Request对象有时会使事情变得更容易一些,并且还会在协议错误时引发URLException。虽然谷歌应用程序引擎,你不能使用。您必须使用谷歌在其沙箱Python环境中提供的URL获取API。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录