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

て烟熏妆下的殇ゞ 提交于 2019-12-25 18:35:53

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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


#1楼

我知道已经有人说过,但我强烈建议您使用Python封装的requests

如果您使用的不是python语言,那么您可能会认为urlliburllib2易于使用,代码不多且功能强大,这就是我以前的想法。 但是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

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

  • 国际域名和URL
  • 保持活动和连接池
  • Cookie持久性会话
  • 浏览器样式的SSL验证
  • 基本/摘要身份验证
  • 优雅的键/值Cookie
  • 自动减压
  • Unicode响应机构
  • 分段文件上传
  • 连接超时
  • .netrc支持
  • 项目清单
  • python 2.6—3.4
  • 线程安全的。

#2楼

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

此处也进行了类似的讨论: http : //www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html


#3楼

通常,您应该使用urllib2,因为这有时会通过接受Request对象使事情变得容易一些,并且还会在协议错误时引发URLException。 但是,借助Google App Engine,您将无法使用任何一种。 您必须使用Google在其沙盒Python环境中提供的URL Fetch API


#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 Fetch API的包装。 也就是说,您仍然受到端口,协议和允许的响应时间之类的相同限制。 不过,您可以像期望的那样使用库的核心来获取HTTP URL。


#5楼

我喜欢urllib.urlencode函数,并且在urllib2似乎不存在。

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!