python - urllib,urllib2和requests模块之间有什么区别?
在Python中,requests,urllib2和requests模块之间有什么区别? 为什么有三个? 他们似乎做同样的事情......
9个解决方案
568 votes
我知道它已经说过,但我强烈推荐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& 连接池
Cookie持久性的会话
浏览器式SSL验证
基本/摘要式身份验证
优雅的钥匙/价值饼干
自动减压
Unicode响应机构
多部分文件上传
连质超时
.netrc支持
项目清单
Python 2.6-3.4
线程安全的。
Hutch answered 2019-01-19T09:04:55Z
185 votes
urllib2提供了一些额外的功能,即urlencode()函数可以允许你指定标题(通常你不得不在过去使用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一样使用库的核心。
Crast answered 2019-01-19T09:05:45Z
31 votes
urllib和urllib2都是Python模块,它们执行URL请求相关的东西,但提供不同的功能。
1)urllib2可以接受Request对象来设置URL请求的头,urllib只接受一个URL。
2)urllib提供了用于生成GET查询字符串的urlencode方法,urllib2没有这样的功能。 这是urllib经常与urllib2一起使用的原因之一。
Requests - Requests'是一个用Python编写的简单易用的HTTP库。
1)Python请求自动对参数进行编码,因此您只需将它们作为简单参数传递,与urllib的情况不同,在urllib中,您需要使用方法urllib.encode()在传递参数之前对其进行编码。
2)它自动将响应解码为Unicode。
3)请求也有更方便的错误处理。如果您的身份验证失败,urllib2将引发urllib2.URLError,而Requests将返回正常的响应对象,如预期的那样。 所有你必须通过boolean response.ok查看请求是否成功
例如参考 - [https://dancallahan.info/journal/python-requests/]
SrmHitter9062 answered 2019-01-19T09:07:01Z
12 votes
urllib2.urlopen接受Request类或url的实例,而urllib.urlopen只接受url。
这里也进行了类似的讨论:[http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html]
Danny Roberts answered 2019-01-19T09:07:33Z
10 votes
我喜欢urllib.urlencode功能,它似乎不存在于urllib2中。
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
Gattster answered 2019-01-19T09:07:57Z
8 votes
一个相当大的区别是将Python2移植到Python3。 对于python3,urllib2不存在,并且其方法移植到urllib。因此,您正在大量使用它并希望将来迁移到Python3,请考虑使用urllib。但是2to3工具会自动为您完成大部分工作。
Arash answered 2019-01-19T09:08:20Z
6 votes
要获取网址的内容:
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()函数和request.get(url)函数返回不同的类型:
Python2 request.get(url)返回requests.models.Response
Python3 request.get(url)返回requests.models.Response
请求request.get(url)返回requests.models.Response
alvas answered 2019-01-19T09:09:11Z
5 votes
您通常应该使用urllib2,因为这有时会通过接受Request对象使事情变得更容易,并且还会引发协议错误的URLException。 但是,使用Google App Engine,您也无法使用它们。 您必须使用Google在其沙盒Python环境中提供的URL Fetch API。
Chinmay Kanchi answered 2019-01-19T09:09:34Z
5 votes
只是为了添加现有答案,我没有看到有人提到python请求不是本机库。 如果您可以添加依赖项,那么请求就可以了。 但是,如果您尝试避免添加依赖项,则urllib是一个已经可用的本机python库。
Zeitgeist answered 2019-01-19T09:09:57Z