在Python中,urllib, urllib2, urllib3和请求模块之间有什么区别?为什么有三个?他们似乎在做同样的事情……
当前回答
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。
奖金的答案 与谷歌应用程序引擎,你可以使用任何的httplib, urllib或urllib2,但他们都只是包装谷歌的URL获取API。也就是说,您仍然受到相同的限制,如端口、协议和允许的响应长度。不过,您可以使用库的核心来检索HTTP url,正如您所期望的那样。
其他回答
只是为了补充现有的答案,我没有看到任何人提到python requests不是一个原生库。如果您可以添加依赖项,那么请求就可以了。然而,如果你试图避免添加依赖项,urllib是一个已经可用的原生python库。
urllib和urllib2都是做URL请求相关工作的Python模块,但提供不同的功能。
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,而请求将返回一个正常的响应对象,正如预期的那样。你所要做的就是通过布尔响应来判断请求是否成功
一个相当大的区别是关于将Python2移植到Python3。python3及其移植到urllib的方法不存在Urllib2。 因此,如果你正在大量使用它,并希望将来迁移到Python3,请考虑使用urllib。 然而,2to3工具将自动为您做大部分工作。
我知道已经说过了,但是我强烈推荐requests Python包。
如果您使用过python以外的语言,您可能会认为urllib和urllib2易于使用,代码不多,功能强大,这是我过去的想法。但是请求包非常有用且简短,每个人都应该使用它。
首先,它支持一个完全restful的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验证 基本/摘要式身份验证 优雅的键/值cookie 自动减压 Unicode响应体 Multipart File上传 连接超时 . netrc支持 列表项 Python 2.7, 3.6-3.9 线程安全的。
我喜欢urllib。urllib2中似乎不存在urllib2。
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
推荐文章
- 在每个列表元素上调用int()函数?
- 当使用代码存储库时,如何引用资源的相对路径
- 如何在Flask-SQLAlchemy中按id删除记录
- 在Python中插入列表的第一个位置
- Python Pandas只合并某些列
- 如何在一行中连接两个集而不使用“|”
- 从字符串中移除前缀
- 代码结束时发出警报
- 如何在Python中按字母顺序排序字符串中的字母
- 在matplotlib中将y轴标签添加到次要y轴
- 如何消除数独方块的凹凸缺陷?
- 为什么出现这个UnboundLocalError(闭包)?
- 使用Python请求的异步请求
- 如何检查一个对象是否是python中的生成器对象?
- 如何从Python包内读取(静态)文件?