在Python中, urllib , urllib2 和requests模块之间有什么区别?为什么有三个?他们似乎做同样的事情......
urllib
urllib2
我知道它已经说过,但我强烈推荐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
这只是冰山一角 . 这是请求站点的功能列表:
国际域名和URL
Keep-Alive&Connection Pooling
使用Cookie持久性的会话
浏览器式SSL验证
基本/摘要式身份验证
优雅的钥匙/ Value Cookies
自动减压
Unicode响应机构
多部分文件上传
连接超时
.netrc支持
列出项目
Python 2.6-3.4
线程安全 .
一个相当大的区别是将Python2移植到Python3 . 对于python3,urllib2不存在,并且其方法移植到urllib . 因此,您正在大量使用它并希望将来迁移到Python3,请考虑使用urllib . 但是2to3工具会自动为您完成大部分工作 .
urllib 和 urllib2 都是Python模块,它们执行URL请求相关的东西,但提供不同的功能 .
1)urllib2可以接受Request对象来设置URL请求的头,urllib只接受一个URL .
2)urllib提供 urlencode 方法,用于生成GET查询字符串,urllib2没有这样的功能 . 这是urllib经常与urllib2一起使用的原因之一 .
Requests - Requests'是一个用Python编写的简单易用的HTTP库 .
1)Python请求自动对参数进行编码,因此您只需将它们作为简单参数传递,与urllib的情况不同,在urllib中,您需要使用方法 urllib.encode() 在传递参数之前对其进行编码 .
2)它自动将响应解码为Unicode .
3)请求也有更方便的错误处理 . 如果您的身份验证失败,urllib2将引发urllib2.URLError,而Requests将返回正常的响应对象,如预期的那样 . 所有你必须通过布尔 response.ok 查看请求是否成功
例如参考 - https://dancallahan.info/journal/python-requests/
我喜欢 urllib.urlencode 函数,它似乎不存在于 urllib2 中 .
urllib.urlencode
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'}) 'abc=d+f&def=-%212'
urllib2.urlopen接受Request类或url的实例,而urllib.urlopen只接受url .
这里也进行了类似的讨论:http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html
要获取网址的内容:
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以及 request 依赖项代码,因为它们 urlopen() 函数和 requests.get() 函数返回不同的类型:
request
urlopen()
requests.get()
Python2 urllib.request.urlopen() 返回 http.client.HTTPResponse
urllib.request.urlopen()
http.client.HTTPResponse
Python3 urllib.urlopen(url) 返回 instance
urllib.urlopen(url)
instance
请求 request.get(url) 返回 requests.models.Response
request.get(url)
requests.models.Response
您通常应该使用urllib2,因为这有时会通过接受Request对象使事情变得容易一些,并且还会引发协议错误的URLException . 但是,使用Google App Engine,您也无法使用它们 . 您必须使用Google在其沙盒Python环境中提供的URL Fetch API .
urllib2提供了一些额外的功能,即 urlopen() 函数可以允许你指定 Headers (通常你以前必须使用httplib,这更加冗长 . )更重要的是,urllib2提供 Request 类,允许执行请求的更具声明性的方法:
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 .
urlencode()
还有一些处理程序用于在urllib2中实现更高级的URL支持 . 简短的回答是,除非您使用遗留代码,否则您可能希望使用urllib2中的URL开启器,但您仍需要导入urllib以获取某些实用程序功能 .
Bonus answer 使用Google App Engine,您可以使用httplib,urllib或urllib2中的任何一个,但所有这些只是Google的URL Fetch API的包装器 . 也就是说,您仍然受到相同的限制,例如端口,协议和允许的响应长度 . 但是,您可以像检索HTTP URL一样使用库的核心 .
只是为了增加现有的答案,我没有看到任何人提到python请求不是本机库 . 如果您可以添加依赖项,那么请求就可以了 . 但是,如果您尝试避免添加依赖项,则urllib是一个已经可用的本机python库 .
9 回答
我知道它已经说过,但我强烈推荐Requests python包:http://docs.python-requests.org/en/latest/index.html
如果您使用的语言不是python,那么您可能认为urllib和urllib2易于使用,代码不多,而且功能强大,这就是我以前的想法 . 但是Requests包是如此令人难以置信的有用和简短,每个人都应该使用它 .
首先,它支持完全宁静的API,并且非常简单:
无论GET / POST是否你再也不必编码参数,它只需要一个字典作为参数,并且很好 .
另外,它甚至还有一个内置的json解码器(再次,我知道json.loads()写的不多,但这肯定很方便):
或者,如果您的响应数据只是文本,请使用:
这只是冰山一角 . 这是请求站点的功能列表:
国际域名和URL
Keep-Alive&Connection Pooling
使用Cookie持久性的会话
浏览器式SSL验证
基本/摘要式身份验证
优雅的钥匙/ Value Cookies
自动减压
Unicode响应机构
多部分文件上传
连接超时
.netrc支持
列出项目
Python 2.6-3.4
线程安全 .
一个相当大的区别是将Python2移植到Python3 . 对于python3,urllib2不存在,并且其方法移植到urllib . 因此,您正在大量使用它并希望将来迁移到Python3,请考虑使用urllib . 但是2to3工具会自动为您完成大部分工作 .
urllib 和 urllib2 都是Python模块,它们执行URL请求相关的东西,但提供不同的功能 .
1)urllib2可以接受Request对象来设置URL请求的头,urllib只接受一个URL .
2)urllib提供 urlencode 方法,用于生成GET查询字符串,urllib2没有这样的功能 . 这是urllib经常与urllib2一起使用的原因之一 .
Requests - Requests'是一个用Python编写的简单易用的HTTP库 .
1)Python请求自动对参数进行编码,因此您只需将它们作为简单参数传递,与urllib的情况不同,在urllib中,您需要使用方法 urllib.encode() 在传递参数之前对其进行编码 .
2)它自动将响应解码为Unicode .
3)请求也有更方便的错误处理 . 如果您的身份验证失败,urllib2将引发urllib2.URLError,而Requests将返回正常的响应对象,如预期的那样 . 所有你必须通过布尔 response.ok 查看请求是否成功
例如参考 - https://dancallahan.info/journal/python-requests/
我喜欢
urllib.urlencode
函数,它似乎不存在于urllib2
中 .urllib2.urlopen接受Request类或url的实例,而urllib.urlopen只接受url .
这里也进行了类似的讨论:http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html
要获取网址的内容:
很难为响应编写Python2和Python3以及
request
依赖项代码,因为它们urlopen()
函数和requests.get()
函数返回不同的类型:Python2
urllib.request.urlopen()
返回http.client.HTTPResponse
Python3
urllib.urlopen(url)
返回instance
请求
request.get(url)
返回requests.models.Response
您通常应该使用urllib2,因为这有时会通过接受Request对象使事情变得容易一些,并且还会引发协议错误的URLException . 但是,使用Google App Engine,您也无法使用它们 . 您必须使用Google在其沙盒Python环境中提供的URL Fetch API .
urllib2提供了一些额外的功能,即
urlopen()
函数可以允许你指定 Headers (通常你以前必须使用httplib,这更加冗长 . )更重要的是,urllib2提供Request
类,允许执行请求的更具声明性的方法:请注意
urlencode()
仅在urllib中,而不是urllib2 .还有一些处理程序用于在urllib2中实现更高级的URL支持 . 简短的回答是,除非您使用遗留代码,否则您可能希望使用urllib2中的URL开启器,但您仍需要导入urllib以获取某些实用程序功能 .
Bonus answer 使用Google App Engine,您可以使用httplib,urllib或urllib2中的任何一个,但所有这些只是Google的URL Fetch API的包装器 . 也就是说,您仍然受到相同的限制,例如端口,协议和允许的响应长度 . 但是,您可以像检索HTTP URL一样使用库的核心 .
只是为了增加现有的答案,我没有看到任何人提到python请求不是本机库 . 如果您可以添加依赖项,那么请求就可以了 . 但是,如果您尝试避免添加依赖项,则urllib是一个已经可用的本机python库 .