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


当前回答

urllib和urllib2都是做URL请求相关工作的Python模块,但提供不同的功能。

1) urllib2可以接受一个Request对象来设置URL请求的头信息,urllib只接受一个URL。

2) urllib提供了用于生成GET查询字符串的urlencode方法,urllib2没有这样的函数。这就是urllib经常与urllib2一起使用的原因之一。

Requests - Requests '是一个用Python编写的简单易用的HTTP库。

1) Python请求会自动对参数进行编码,因此您只需将它们作为简单的参数传递,这与urllib不同,在urllib中,您需要在传递参数之前使用urllib.encode()方法对参数进行编码。

2)自动将应答解码为Unicode。

3)请求也有更方便的错误处理。如果身份验证失败,urllib2将引发urllib2。URLError,而请求将返回一个正常的响应对象,正如预期的那样。你所要做的就是通过布尔响应来判断请求是否成功

其他回答

您通常应该使用urllib2,因为它通过接受Request对象有时会使事情变得更容易一些,并且还会在协议错误时引发URLException。虽然谷歌应用程序引擎,你不能使用。您必须使用谷歌在其沙箱Python环境中提供的URL获取API。

只是为了补充现有的答案,我没有看到任何人提到python requests不是一个原生库。如果您可以添加依赖项,那么请求就可以了。然而,如果你试图避免添加依赖项,urllib是一个已经可用的原生python库。

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,正如您所期望的那样。

urllib和urllib2都是做URL请求相关工作的Python模块,但提供不同的功能。

1) urllib2可以接受一个Request对象来设置URL请求的头信息,urllib只接受一个URL。

2) urllib提供了用于生成GET查询字符串的urlencode方法,urllib2没有这样的函数。这就是urllib经常与urllib2一起使用的原因之一。

Requests - Requests '是一个用Python编写的简单易用的HTTP库。

1) Python请求会自动对参数进行编码,因此您只需将它们作为简单的参数传递,这与urllib不同,在urllib中,您需要在传递参数之前使用urllib.encode()方法对参数进行编码。

2)自动将应答解码为Unicode。

3)请求也有更方便的错误处理。如果身份验证失败,urllib2将引发urllib2。URLError,而请求将返回一个正常的响应对象,正如预期的那样。你所要做的就是通过布尔响应来判断请求是否成功

我发现上述答案中缺少的一个关键点是urllib返回类型为<class http.client的对象。HTTPResponse>而requests返回<class 'requests.models. response '>. HTTPResponse>。

因此,read()方法可以用于urllib,但不能用于请求。

附注:requests已经有很多方法了,几乎不需要像read();>那样再多一个