在Python中,urllib
,urllib2
和requests
模块之间有什么区别?为什么有三个?他们似乎做同样的事情......
答案 0 :(得分:613)
我知道已经说过了,但我强烈推荐使用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
这只是冰山一角。这是请求站点的功能列表:
答案 1 :(得分:191)
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。
奖励回答 使用Google App Engine,您可以使用httplib,urllib或urllib2中的任何一个,但所有这些只是Google的URL Fetch API的包装器。也就是说,您仍然受到相同的限制,例如端口,协议和允许的响应长度。但是,您可以像检索HTTP URL一样使用库的核心。
答案 2 :(得分:37)
urllib 和 urllib2 都是支持网址请求相关内容但提供不同功能的Python模块。
1)urllib2可以接受Request对象来设置URL请求的标头,urllib只接受URL。
2)urllib提供了 urlencode 方法,用于生成GET查询字符串,urllib2没有这样的功能。这是urllib经常与urllib2一起使用的原因之一。请求 - Requests'是一个用Python编写的简单易用的HTTP库。
1)Python请求会自动对参数进行编码,因此您只需将它们作为简单参数传递,与urllib不同,您需要使用方法 urllib.encode()对参数进行编码在通过它们之前。
2)它自动将响应解码为Unicode。
3)请求也有更方便的错误处理。如果您的身份验证失败,urllib2将引发urllib2.URLError,而Requests将返回正常的响应对象,如预期的那样。您只需通过布尔 response.ok
查看请求是否成功答案 3 :(得分:30)
这是我对各种“ urllib”之间的关系的理解:
在Python 2标准库中并排存在两个HTTP库。尽管名称相似,但它们是无关的:它们具有不同的设计和不同的实现。
Python 3标准库具有新的urllib ,它是这两个软件包的合并/重构/重写的版本。
urllib3 是第三方软件包。尽管有名称,但它与标准库软件包无关,并且将来无意将其包含在标准库中。
最后,请求在内部使用urllib3,但其目标是使用更易于使用的API。
答案 4 :(得分:12)
urllib2.urlopen接受Request类或url的实例,而urllib.urlopen只接受url。
在这里进行了类似的讨论: http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html
答案 5 :(得分:10)
我喜欢urllib.urlencode
函数,它似乎不存在于urllib2
中。
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
答案 6 :(得分:8)
一个相当大的区别是将Python2移植到Python3。对于python3,urllib2不存在,并且其方法移植到urllib。 因此,您正在大量使用它并希望将来迁移到Python3,请考虑使用urllib。 但是2to3工具会自动完成大部分工作。
答案 7 :(得分:6)
只是为了添加现有答案,我没有看到有人提到python请求不是本机库。如果您可以添加依赖项,那么请求就可以了。但是,如果您尝试避免添加依赖项,则urllib是一个已经可用的本机python库。
答案 8 :(得分:5)
您通常应该使用urllib2,因为通过接受Request对象有时会使事情变得容易一些,并且还会引发协议错误的URLException。但是,使用Google App Engine,您也无法使用它们。您必须使用Google在其沙盒Python环境中提供的URL Fetch API。
答案 9 :(得分:5)
获取网址的内容:
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()
函数返回不同的类型:
urllib.request.urlopen()
返回http.client.HTTPResponse
urllib.urlopen(url)
返回instance
request.get(url)
返回requests.models.Response
答案 10 :(得分:3)
我认为所有答案都很好。但是有关urllib3的详细信息较少。urllib3是用于Python的非常强大的HTTP客户端。 要安装以下两个命令,
urllib3
使用点子
pip install urllib3
或者您可以从Github获取最新代码,并使用安装它们,
$ git clone git://github.com/urllib3/urllib3.git
$ cd urllib3
$ python setup.py install
那你准备好了,
只需使用以下命令导入urllib3
import urllib3
在这里,您需要一个PoolManager实例来发出请求,而不是直接创建连接。这将为您处理连接池和线程安全。还有一个ProxyManager对象,用于通过HTTP / HTTPS代理路由请求 在这里您可以参考文档。 用法示例:
>>> from urllib3 import PoolManager
>>> manager = PoolManager(10)
>>> r = manager.request('GET', 'http://google.com/')
>>> r.headers['server']
'gws'
>>> r = manager.request('GET', 'http://yahoo.com/')
>>> r.headers['server']
'YTS/1.20.0'
>>> r = manager.request('POST', 'http://google.com/mail')
>>> r = manager.request('HEAD', 'http://google.com/calendar')
>>> len(manager.pools)
2
>>> conn = manager.connection_from_host('google.com')
>>> conn.num_requests
3
如urrlib3
文档中所述,urllib3
带来了Python标准库中缺少的许多关键功能。
按照用户指南了解更多详细信息。
requests
requests在后台使用urllib3
,使制作requests
和检索数据更加简单。
一方面,与urllib3
相比,keep-alive是100%自动的。它还具有事件挂钩,这些事件挂钩会在触发事件时调用回调函数,例如接收响应
在requests
中,每个请求类型都有其自己的功能。因此,您无需直接创建连接或池,而直接获取URL。
只需运行pip即可安装requests
pip install requests
或者您也可以从源代码安装
$ git clone git://github.com/psf/requests.git
$ cd requests
$ python setup.py install
然后,import requests
在这里您可以推荐官方documentation, 有关会话对象,SSL验证和事件挂钩等高级用法,请参阅此url。
答案 11 :(得分:1)
我发现以上答案中缺少的一个关键点是urllib返回类型为<class http.client.HTTPResponse>
的对象,而requests
返回类型为<class 'requests.models.Response'>
。
由于这个原因,read()方法可以与urllib
一起使用,但不能与requests
一起使用。
P.S。 :requests
已经拥有如此丰富的方法,几乎不需要像read()
;>