首页 文章

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

提问于
浏览
565

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

9 回答

  • 5

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

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

    • Keep-Alive&Connection Pooling

    • 使用Cookie持久性的会话

    • 浏览器式SSL验证

    • 基本/摘要式身份验证

    • 优雅的钥匙/ Value Cookies

    • 自动减压

    • Unicode响应机构

    • 多部分文件上传

    • 连接超时

    • .netrc支持

    • 列出项目

    • Python 2.6-3.4

    • 线程安全 .

  • 10

    一个相当大的区别是将Python2移植到Python3 . 对于python3,urllib2不存在,并且其方法移植到urllib . 因此,您正在大量使用它并希望将来迁移到Python3,请考虑使用urllib . 但是2to3工具会自动为您完成大部分工作 .

  • 12

    urlliburllib2 都是Python模块,它们执行URL请求相关的东西,但提供不同的功能 .

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

    2)urllib提供 urlencode 方法,用于生成GET查询字符串,urllib2没有这样的功能 . 这是urllib经常与urllib2一起使用的原因之一 .

    Requests - Requests'是一个用Python编写的简单易用的HTTP库 .

    1)Python请求自动对参数进行编码,因此您只需将它们作为简单参数传递,与urllib的情况不同,在urllib中,您需要使用方法 urllib.encode() 在传递参数之前对其进行编码 .

    2)它自动将响应解码为Unicode .

    3)请求也有更方便的错误处理 . 如果您的身份验证失败,urllib2将引发urllib2.URLError,而Requests将返回正常的响应对象,如预期的那样 . 所有你必须通过布尔 response.ok 查看请求是否成功

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

  • 569

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

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

    urllib2.urlopen接受Request类或url的实例,而urllib.urlopen只接受url .

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

  • 31

    要获取网址的内容:

    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

  • 6

    您通常应该使用urllib2,因为这有时会通过接受Request对象使事情变得容易一些,并且还会引发协议错误的URLException . 但是,使用Google App Engine,您也无法使用它们 . 您必须使用Google在其沙盒Python环境中提供的URL Fetch API .

  • 5

    urllib2提供了一些额外的功能,即 urlopen() 函数可以允许你指定 Headers (通常你以前必须使用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以获取某些实用程序功能 .

    Bonus answer 使用Google App Engine,您可以使用httplib,urllib或urllib2中的任何一个,但所有这些只是Google的URL Fetch API的包装器 . 也就是说,您仍然受到相同的限制,例如端口,协议和允许的响应长度 . 但是,您可以像检索HTTP URL一样使用库的核心 .

  • 8

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

相关问题