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

有帮助吗?

解决方案

我知道已经说过了,但我强烈推荐 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

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

  • 国际域名和 URL
  • 保持活动状态和连接池
  • 具有 Cookie 持久性的会话
  • 浏览器式 SSL 验证
  • 基本/摘要式身份验证
  • 优雅的键/值 Cookie
  • 自动减压
  • Unicode 响应主体
  • 分段文件上传
  • 连接超时
  • .netrc 支持
  • 项目清单
  • Python 2.6—3.4
  • 线程安全。

其他提示

的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对于一些实用功能。

<强>加成答案 随着谷歌App Engine,您可以使用任何httplib的,urllib的或urllib2的,但所有的人都对谷歌的网址提取API只是包装。也就是说,你仍然受到同样的限制,如端口,协议,并允许响应的长度。您可以使用图书馆的核心,你会期望获取的HTTP URL,虽然。

<强>的urllib 和<强>的urllib2 均为Python模块那些URL请求相关的东西,但提供不同的功能。

1)的urllib2可以接受请求对象来设置标头的URL请求,的urllib只接受一个URL。

2)的urllib提供的进行urlencode 其用于GET查询字符串的生成方法,urllib2的不具有这样的功能。这就是为什么的urllib通常与沿的urllib2使用的原因之一。

<强>请 - 请求是用Python编写一个简单的,容易使用的HTTP库

1)的Python请求自动编码参数,以便你只是将它们作为简单参数,不像在urllib的的情况下,在需要使用的方法的 urllib.encode()以编码参数之前将它们传递。

2)自动解码的响应为Unicode。

3)的要求也有更为方便的错误handling.If您的身份验证失败,urllib2的将提高urllib2.URLError,同时请求将返回正常响应对象,符合市场预期。所有你必须看到,如果请求是由布尔成功的 response.ok

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

urllib2.urlopen接受请求类或URL的一个实例,而了urllib.urlopen只接受一个URL。

有一个类似的讨论就发生在这里: http://www.velocityreviews.com/forums /t326690-urllib-urllib2-what-is-the-difference.html

我喜欢urllib.urlencode函数,它不会出现在urllib2存在。

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

一个相当大的差大约是移植Python2到Python3。 urllib2的不存在python3及其方法移植到urllib的。 所以,你正在使用,在很大程度上并希望迁移到Python3在未来,考虑使用的urllib。 然而2to3的工具会自动完成大部分的工作适合你。

我想补充到现有的答案,我没有看到任何人提的是,蟒蛇请求不是本机库。如果您没有问题增加相关性,则要求是罚款。但是,如果你想避免添加依赖,urllib的是原生的Python库,已经提供给你。

您应该一般使用urllib2的,因为这使得事情有时有点容易被接受请求的对象,也将提高对协议差错的URLException。随着谷歌的App Engine不过,你也不能使用。你必须使用网址提取API ,谷歌在其沙盒Python提供环境。

获取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很难, request 响应的依赖代码,因为它们 urlopen() 功能和 requests.get() 函数返回不同类型:

  • Python2 urllib.request.urlopen() 返回一个 http.client.HTTPResponse
  • Python3 urllib.urlopen(url) 返回一个 instance
  • 要求 request.get(url) 返回一个 requests.models.Response

这我在上述答案查找丢失的一个关键点是的urllib而<class http.client.HTTPResponse>返回requests返回类型<class 'requests.models.Response'>的对象。

由于这一点,方法可以与urllib使用,但不与requests读()。

P.S。 :requests已经丰富,它几乎不需要一个更如read()所以许多方法;>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top