在Python中,urllib, urllib2, urllib3和请求模块之间有什么区别?为什么有三个?他们似乎在做同样的事情……
当前回答
一个相当大的区别是关于将Python2移植到Python3。python3及其移植到urllib的方法不存在Urllib2。 因此,如果你正在大量使用它,并希望将来迁移到Python3,请考虑使用urllib。 然而,2to3工具将自动为您做大部分工作。
其他回答
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,正如您所期望的那样。
我认为所有的答案都很好。但是关于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返回类型为<class http.client的对象。HTTPResponse>而requests返回<class 'requests.models. response '>. HTTPResponse>。
因此,read()方法可以用于urllib,但不能用于请求。
附注:requests已经有很多方法了,几乎不需要像read();>那样再多一个
获取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和请求依赖代码,因为它们的urlopen()函数和requests.get()函数返回不同的类型:
Python2 urllib.request.urlopen()返回一个http.client.HTTPResponse Python3 urllib.urlopen(url)返回一个实例 Request Request .get(url)返回一个requests.models.Response
我喜欢urllib。urllib2中似乎不存在urllib2。
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
推荐文章
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块
- 蟒蛇导出环境文件
- Django - makemigrations -未检测到任何更改
- SQLAlchemy:引擎、连接和会话差异
- 在Python Pandas中删除多个列中的所有重复行
- 更改pandas DataFrame中的特定列名
- 将Pandas多索引转换为列
- 熊猫在每组中获得最高的n个记录
- 熊猫数据帧得到每组的第一行