代码之家  ›  专栏  ›  技术社区  ›  Paul Biggar

URLLIB、URLLIB2和请求模块之间有什么区别?

  •  602
  • Paul Biggar  · 技术社区  · 14 年前

    在python中, urllib ,请 urllib2 requests 模块?为什么有三个?他们似乎也在做同样的事…

    10 回复  |  直到 5 年前
        1
  •  591
  •   AnneTheAgile    8 年前

    我知道已经说过了,但是我强烈推荐requests python包: http://docs.python-requests.org/en/latest/index.html

    如果您使用的语言不是Python,那么您可能会认为urllib和urllib2很容易使用,代码不多,而且功能很强,这就是我以前的想法。但是请求包是如此的有用和短,以至于每个人都应该使用它。

    首先,它支持完全RESTfulAPI,并且非常简单:

    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验证
    • 基本/摘要式身份验证
    • 优雅的钥匙/价值饼干
    • 自动减压
    • Unicode响应正文
    • 多部分文件上载
    • 连接超时
    • .netrc支持
    • 列表项
    • python 2.6_3.4
    • 线程安全。
        2
  •  188
  •   Crast    12 年前

    URLLIB2提供了一些额外的功能,即 urlopen() 函数可以允许您指定头(通常您在过去必须使用httplib,这要详细得多。)但更重要的是,urllib提供了 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中,而不是urlib2中。

    在URLLIB2中还有实现更高级的URL支持的处理程序。简短的回答是,除非您使用的是旧代码,否则您可能希望使用urllib2中的url opener,但对于某些实用程序函数,您仍然需要导入到urllib中。

    奖金答案 使用Google应用引擎,你可以使用httplib、urllib或urlib2中的任何一个,但它们都只是Google的URL获取API的包装器。也就是说,您仍然受到相同的限制,如端口、协议和允许的响应长度。不过,您可以像检索HTTP URL那样使用库的核心。

        3
  •  34
  •   Siyaram Malav    8 年前

    乌尔利布 ULLIb2 这两个python模块都执行与url请求相关的操作,但提供了不同的功能。

    1)URLLIB2可以接受请求对象来设置URL请求的头,URLLIB2只接受URL。

    2)Urllib提供 乌伦代码 方法,用于生成get查询字符串,urllib2没有这样的函数。这就是为什么urllib经常与urllib2一起使用的原因之一。

    请求 -Requests_是一个用Python编写的简单、易用的HTTP库。

    1)python请求自动对参数进行编码,因此您只需将它们作为简单参数传递,而不像在urllib的情况下,您需要在其中使用该方法 URLLIB码() 在传递参数之前对其进行编码。

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

    3)请求也有更方便的错误处理,如果您的身份验证失败,URLLIB2将引发URLLIB2.URLError,而请求将按预期返回正常响应对象。您只需看看Boolean是否成功地完成了请求。 回答好

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

        4
  •  12
  •   Danny Roberts    14 年前

    urlib2.urlopen接受请求类或URL的实例,而urlib.urlopen只接受URL。

    这里也进行了类似的讨论: http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html

        5
  •  10
  •   Gattster    14 年前

    我喜欢 urllib.urlencode 函数,但它似乎不存在于 urllib2 .

    >>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
    'abc=d+f&def=-%212'
    
        6
  •  8
  •   Arash    7 年前

    一个相当大的区别是移植python2到python3。python3不存在urlib2,其方法移植到urlib。 因此,你使用的量很大,希望将来迁移到python3,考虑使用urllib。 但是,2to3工具将自动为您完成大部分工作。

        7
  •  6
  •   Zeitgeist    7 年前

    为了增加现有的答案,我没有看到任何人提到Python请求不是本机库。如果您可以添加依赖项,那么请求就可以了。但是,如果您试图避免添加依赖项,那么urllib是一个本机python库,您已经可以使用它了。

        8
  •  5
  •   Peter Mortensen John Conde    14 年前

    您通常应该使用URLLIB2,因为这有时通过接受请求对象使事情变得更简单,而且还会引发协议错误的URLException。不过,使用谷歌应用引擎,你也不能使用。你必须使用 URL Fetch API 谷歌在其沙盒python环境中提供的。

        9
  •  5
  •   alvas    6 年前

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

    • 蟒蛇2 urllib.request.urlopen() 返回 http.client.HTTPResponse
    • 蟒蛇3 urllib.urlopen(url) 返回一个 instance
    • 请求 request.get(url) 返回A requests.models.Response
        10
  •  1
  •   paradocslover    5 年前

    在上面的答案中,我发现缺少的一个关键点是Urllib返回一个类型为的对象 <class http.client.HTTPResponse> 鉴于 requests 退货 <class 'requests.models.Response'> .

    因此,read()方法可以与 urllib 但不能 请求 .

    附笔: 请求 已经丰富了很多方法,几乎不再需要一个了 read() ;