urllib、urllib2、urllib3 和 requests 模块之间有什么区别?
-
19-09-2019 - |
解决方案
我知道已经说过了,但我强烈推荐 requests
Python 包。
如果您使用过 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
- 保持活动状态和连接池
- 具有 Cookie 持久性的会话
- 浏览器式 SSL 验证
- 基本/摘要式身份验证
- 优雅的键/值 Cookie
- 自动减压
- 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对于一些实用功能。
<强>加成答案强> 随着谷歌App Engine,您可以使用任何httplib的,urllib的或urllib2的,但所有的人都对谷歌的网址提取API只是包装。也就是说,你仍然受到同样的限制,如端口,协议,并允许响应的长度。您可以使用图书馆的核心,你会期望获取的HTTP URL,虽然。
<强>的urllib 和<强>的urllib2 强>均为Python模块那些URL请求相关的东西,但提供不同的功能。
1)的urllib2可以接受请求对象来设置标头的URL请求,的urllib只接受一个URL。
2)的urllib提供的进行urlencode 强>其用于GET查询字符串的生成方法,urllib2的不具有这样的功能。这就是为什么的urllib通常与沿的urllib2使用的原因之一。
<强>请强> - 请求是用Python编写一个简单的,容易使用的HTTP库
1)的Python请求自动编码参数,以便你只是将它们作为简单参数,不像在urllib的的情况下,在需要使用的方法的 urllib.encode()以编码参数之前将它们传递。
2)自动解码的响应为Unicode。
3)的要求也有更为方便的错误handling.If您的身份验证失败,urllib2的将提高urllib2.URLError,同时请求将返回正常响应对象,符合市场预期。所有你必须看到,如果请求是由布尔成功的 response.ok
urllib2.urlopen接受请求类或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的工具会自动完成大部分的工作适合你。
我想补充到现有的答案,我没有看到任何人提的是,蟒蛇请求不是本机库。如果您没有问题增加相关性,则要求是罚款。但是,如果你想避免添加依赖,urllib的是原生的Python库,已经提供给你。
您应该一般使用urllib2的,因为这使得事情有时有点容易被接受请求的对象,也将提高对协议差错的URLException。随着谷歌的App Engine不过,你也不能使用。你必须使用网址提取API ,谷歌在其沙盒Python提供环境。
获取url的内容:
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()
函数返回不同类型:
- Python2
urllib.request.urlopen()
返回一个http.client.HTTPResponse
- Python3
urllib.urlopen(url)
返回一个instance
- 要求
request.get(url)
返回一个requests.models.Response
这我在上述答案查找丢失的一个关键点是的urllib而<class http.client.HTTPResponse>
返回requests
返回类型<class 'requests.models.Response'>
的对象。
由于这一点,方法可以与urllib
使用,但不与requests
读()。
P.S。 :requests
已经丰富,它几乎不需要一个更如read()
所以许多方法;>