urllib,urllib2和requests模块之间有什么区别?

时间:2010-01-07 03:26:36

标签: python python-requests urllib2 urllib python-2.x

在Python中,urlliburllib2requests模块之间有什么区别?为什么有三个?他们似乎做同样的事情......

12 个答案:

答案 0 :(得分:613)

我知道已经说过了,但我强烈推荐使用requests Python包。

如果您使用的语言不是python,那么您可能认为urlliburllib2易于使用,代码不多,而且功能强大,这就是我以前的想法。但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

这只是冰山一角。这是请求站点的功能列表:

  • 国际域名和网址
  • Keep-Alive&连接池
  • Cookie持久性会话
  • 浏览器式SSL验证
  • 基本/摘要式身份验证
  • 优雅的钥匙/价值饼干
  • 自动解压缩
  • Unicode响应机构
  • 分段文件上传
  • 连接超时
  • .netrc support
  • 列表项
  • Python 2.6-3.4
  • 线程安全。

答案 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

查看请求是否成功

例如参考 - https://dancallahan.info/journal/python-requests/

答案 3 :(得分:30)

这是我对各种“ urllib”之间的关系的理解:

在Python 2标准库中并排存在两个HTTP库。尽管名称相似,但它们是无关的:它们具有不同的设计和不同的实现。

  • urllib 是原始的Python HTTP客户端,已添加到Python 1.2的标准库中。
  • urllib2 是一个功能更强大的HTTP库,已在Python 1.6中添加,旨在最终替代urllib。

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()函数返回不同的类型:

  • Python2 urllib.request.urlopen()返回http.client.HTTPResponse
  • Python3 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标准库中缺少的许多关键功能。

  • 线程安全。
  • 连接池。
  • 客户端SSL / TLS验证。
  • 使用分段编码上传文件。
  • 用于重试请求和处理HTTP重定向的助手。
  • 支持gzip和deflate编码。
  • 对HTTP和SOCKS的代理支持。
  • 100%的测试覆盖率。

按照用户指南了解更多详细信息。

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();>