urllib,urllib2和请求模块之间有什么区别?
在Python中, urllib
, urllib2
和requests
模块之间有什么区别? 为什么有三个? 他们似乎做同样的事情…
我知道已经说过,但我强烈推荐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。
urllib和urllib2都是与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
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库。