urllib,urllib2和请求模块之间有什么区别?

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

我知道已经说过,但我强烈推荐Requests python软件包: http : //docs.python-requests.org/en/latest/index.html

如果你使用Python以外的语言,你可能认为urllib和urllib2很容易使用,代码不多,能力也很强,这就是我以前的想法。 但是Requests包是非常有用和简短的,每个人都应该使用它。

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

这只是冰山一角。 这是来自请求站点的功能列表:

  • 国际域名和网址
  • 保持活力和连接池
  • 会话与Cookie持久性
  • 浏览器式SSL验证
  • 基本/摘要式身份验证
  • 优雅的关键/价值饼干
  • 自动解压缩
  • Unicode响应身体
  • 多部分文件上传
  • 连接超时
  • .netrc支持
  • 列表项目
  • Python 2.6-3.4
  • 线程安全的。

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抓取API的包装器。 也就是说,您仍然受限于端口,协议和允许的响应时间等相同的限制。 尽管如此,您可以像使用期望的那样使用库的核心来检索HTTP URL。

urlliburllib2都是与URL请求相关的东西,但提供不同的功能的Python模块。

1)urllib2可以接受一个Request对象来为一个URL请求设置标题,urllib只接受一个URL。

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

请求 – 请求“是一个用Python编写的简单,易于使用的HTTP库。

1)Python请求会自动对参数进行编码,所以您只需将它们作为简单的参数传递,不像urllib那样,在传递参数之前需要使用urllib.encode()方法对参数进行编码。

2)它自动将响应解码为Unicode。

3)请求也有更方便的错误处理。如果你的身份验证失败,urllib2将引发一个urllib2.URLError,而请求会返回一个正常的响应对象,如预期的那样。 所有你必须看看请求是否成功的布尔response.ok

例如参考 – https://dancallahan.info/journal/python-requests/

urllib2.urlopen接受Request类或url的实例,而urllib.urlopen只接受url。

类似的讨论发生在这里: http : //www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html

我喜欢urllib.urlencode函数,它似乎不存在于urllib2

 >>> urllib.urlencode({'abc':'d f', 'def': '-!2'}) 'abc=d+f&def=-%212' 

一个相当大的区别是将Python2移植到Python3。 urllib2不存在python3和它的方法移植到urllib。 所以你正在使用这个,而且以后想要迁移到Python3,可以考虑使用urllib。 但2to3工具将自动为您做大部分的工作。

您通常应该使用urllib2,因为这样做通过接受Request对象使事情变得容易一些,并且还会引发一个对协议错误的URLException。 不过,使用Google App Engine也不能使用。 您必须使用Google在沙箱式Python环境中提供的网址提取API 。

只是添加到现有的答案,我没有看到任何人提到,python请求不是一个本地库。 如果您可以添加依赖关系,那么请求就可以了。 但是,如果您试图避免添加依赖项,则urllib是已经可用的本机python库。