What are the differences between the urllib, urllib2, and requests module?
在python中,
我知道已经说过了,但是我强烈推荐requests python包:http://docs.python-requests.org/en/latest/index.html
如果您使用的语言不是python,那么您可能会认为urlib和urlib2很容易使用,代码不多,而且功能很强,这就是我以前的想法。但是请求包是如此的有用和短,以至于每个人都应该使用它。
首先,它支持完全RESTfulAPI,并且非常简单:
1 2 3 4 5 6 7 | 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是否永远不需要再次编码参数,它只需要一个字典作为参数,这样做很好。
1 2 | userdata = {"firstname":"John","lastname":"Doe","password":"jdoe123"} resp = requests.post('http://www.mywebsite.com/user', data=userdata) |
另外,它甚至还有内置的JSON解码器(同样,我知道json.loads()编写起来并不多,但这确实很方便):
1 | resp.json() |
或者,如果您的响应数据只是文本,请使用:
1 | resp.text |
这只是冰山一角。这是来自请求站点的功能列表:
- 国际域名和网址
- 保持活动连接池
- 具有cookie持久性的会话
- 浏览器样式的SSL验证
- 基本/摘要式身份验证
- 优雅的钥匙/价值饼干
- 自动减压
- Unicode响应正文
- 多部分文件上载
- 连接超时
- NETRC支持
- 列表项
- Python2.6-3.4
- 线程安全。
urllib2提供了一些额外的功能,即
1 2 3 4 | r = Request(url='http://www.mysite.com') r.add_header('User-Agent', 'awesome fetcher') r.add_data(urllib.urlencode({'foo': 'bar'}) response = urlopen(r) |
请注意,
在URLLIB2中还有实现更高级的URL支持的处理程序。简短的回答是,除非您使用的是旧代码,否则您可能希望使用urllib2中的url opener,但对于某些实用程序函数,您仍然需要导入到urllib中。
奖金答案使用Google应用引擎,你可以使用httplib、urllib或urlib2中的任何一个,但它们都只是Google的URL获取API的包装器。也就是说,您仍然受到相同的限制,如端口、协议和允许的响应长度。不过,您可以像检索HTTP URL那样使用库的核心。
urllib和Python模块,做urllib2是两个相关但不同的URL请求的东西functionalities提供。
1)urllib2 CAN accept a请求对象到一个URL请求头字段设置,urllib接受只有一个URL。
2)《urllib提供urlencode方法是使用GET查询字符串的一代,urllib2没有搜索功能。这是一个原因为什么urllib随着urllib2是经常使用的。
请求,请求的是一个简单,易于使用的HTTP库写的Python。
1)encodes Python参数自动请求这样的人你只是简单的参数为不同的护照,urllib案例中,你需要使用方法(一)urllib.encode编码参数在传递他们。
2)自动响应信息的decoded为Unicode。
3)请求,所以安切洛蒂远更多的方便您的错误处理。如果认证失败,将引发一urllib2 urllib2.urlerror,而请求会返回一个正常的响应对象的预期。所有你必须看看请求是成功的response.ok布尔
例如https://dancallahan.info参考Python请求/杂志/ /
urlib2.urlopen接受请求类或URL的实例,而urlib.urlopen只接受URL。
这里也进行了类似的讨论:http://www.velocityreviews.com/forums/t326690-urllib-urlib2-what-is-the-difference.html
我喜欢
1 2 | >>> urllib.urlencode({'abc':'d f', 'def': '-!2'}) 'abc=d+f&def=-%212' |
一个相当大的区别是移植python2到python3。python3不存在urlib2,其方法移植到urlib。因此,你使用的量很大,希望将来迁移到python3,考虑使用urllib。但是,2to3工具将自动为您完成大部分工作。
只是添加到现有的答案,我不提任何请求那湖不是一个土生土长的Python库。如果你是一个好的添加依赖关系,然后请求是精细。然而,如果你试图避免添加依赖关系,urllib母语是Python库,已经提供给你。
to get the content of a网址:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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和
- a
http.client.HTTPResponse python2urllib.request.urlopen() 归来 - python3
urllib.urlopen(url) 返回instance - a
requests.models.Response 请求request.get(url) 归来
您通常应该使用URLLIB2,因为这有时通过接受请求对象使事情变得更简单,而且还会引发协议错误的URLException。不过,使用谷歌应用引擎,你也不能使用。您必须使用Google在其沙盒python环境中提供的URL获取API。
A我找到失踪的关键点在上面的答案是urllib返回对象的类型而
由于这个read()方法,可以用一个
附注: