在Python中,urllib, urllib2, urllib3和请求模块之间有什么区别?为什么有三个?他们似乎在做同样的事情……


当前回答

我发现上述答案中缺少的一个关键点是urllib返回类型为<class http.client的对象。HTTPResponse>而requests返回<class 'requests.models. response '>. HTTPResponse>。

因此,read()方法可以用于urllib,但不能用于请求。

附注:requests已经有很多方法了,几乎不需要像read();>那样再多一个

其他回答

只是为了补充现有的答案,我没有看到任何人提到python requests不是一个原生库。如果您可以添加依赖项,那么请求就可以了。然而,如果你试图避免添加依赖项,urllib是一个已经可用的原生python库。

我知道已经说过了,但是我强烈推荐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都是做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,而请求将返回一个正常的响应对象,正如预期的那样。你所要做的就是通过布尔响应来判断请求是否成功

我认为所有的答案都很好。但是关于urllib3的细节要少一些。urllib3是一个非常强大的python HTTP客户端。 要安装以下两个命令都可以工作,

urllib3

使用脉冲,

pip install urllib3

或者你可以从Github获取最新的代码并使用,

$ git clone git://github.com/urllib3/urllib3.git
$ cd urllib3
$ python setup.py install

然后你就可以出发了,

只需导入urllib3 using,

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标准库中所缺少的关键特性。

线程安全。 连接池。 客户端SSL/TLS验证。 文件上传与多部分编码。 帮助重新尝试请求和处理HTTP重定向。 支持gzip和deflate编码。 HTTP和SOCKS的代理支持。 100%测试覆盖率。

更多细节请参考用户指南。

响应内容(HTTPResponse对象提供状态、数据、 和头属性) 使用io包装器与响应内容 创建查询参数 urllib3的高级用法

请求

Requests在底层使用urllib3,使请求和检索数据变得更加简单。 首先,keep-alive是100%自动的,而urllib3不是。它还具有事件钩子,在事件触发时调用回调函数,例如接收响应 在请求中,每种请求类型都有自己的功能。因此,不需要创建连接或池,而是直接获取URL。


对于使用pip的安装请求,只需运行即可

PIP安装请求

或者你可以直接从源代码安装,

$ git clone git://github.com/psf/requests.git
$ cd requests
$ python setup.py install

然后,导入请求

在这里你可以参考官方文件, 对于一些高级用法,如会话对象、SSL验证和事件挂钩,请参考此url。

我喜欢urllib。urllib2中似乎不存在urllib2。

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'