代码之家  ›  专栏  ›  技术社区  ›  fuentesjr

如何在python 2中发送headHTTP请求?

  •  107
  • fuentesjr  · 技术社区  · 16 年前

    我在这里要做的是获取给定URL的头,以便确定mime类型。我想看看 http://somedomain/foo/ 例如,将返回HTML文档或JPEG图像。因此,我需要弄清楚如何发送head请求,这样我就可以阅读mime类型,而不必下载内容。有人知道一种简单的方法吗?

    11 回复  |  直到 7 年前
        1
  •  101
  •   Anthony Geoghegan    8 年前

    编辑 :这个答案有效,但是现在你应该只使用 requests 下面其他答案提到的库。


    使用 httplib .

    >>> import httplib
    >>> conn = httplib.HTTPConnection("www.google.com")
    >>> conn.request("HEAD", "/index.html")
    >>> res = conn.getresponse()
    >>> print res.status, res.reason
    200 OK
    >>> print res.getheaders()
    [('content-length', '0'), ('expires', '-1'), ('server', 'gws'), ('cache-control', 'private, max-age=0'), ('date', 'Sat, 20 Sep 2008 06:43:36 GMT'), ('content-type', 'text/html; charset=ISO-8859-1')]
    

    还有一个 getheader(name) 以获取特定的标题。

        2
  •  105
  •   Anthony Geoghegan    8 年前

    urllib2 可用于执行头请求。这比使用httplib要好一点,因为urllib2为您解析URL,而不是要求您将该URL拆分为主机名和路径。

    >>> import urllib2
    >>> class HeadRequest(urllib2.Request):
    ...     def get_method(self):
    ...         return "HEAD"
    ... 
    >>> response = urllib2.urlopen(HeadRequest("http://google.com/index.html"))
    

    和以前一样,头可以通过response.info()获得。有趣的是,您可以找到重定向到的URL:

    >>> print response.geturl()
    http://www.google.com.au/index.html
    
        3
  •  56
  •   K Z    12 年前

    必修的 Requests 方式:

    import requests
    
    resp = requests.head("http://www.google.com")
    print resp.status_code, resp.text, resp.headers
    
        4
  •  36
  •   Brad Koch Daniel Wright    11 年前

    我相信 Requests 图书馆也应该被提到。

        5
  •  15
  •   ecstaticpeon Paweł Prażak    13 年前

    公正:

    import urllib2
    request = urllib2.Request('http://localhost:8080')
    request.get_method = lambda : 'HEAD'
    
    response = urllib2.urlopen(request)
    response.info().gettype()
    

    编辑:我刚刚意识到有httplib2:d

    import httplib2
    h = httplib2.Http()
    resp = h.request("http://www.google.com", 'HEAD')
    assert resp[0]['status'] == 200
    assert resp[0]['content-type'] == 'text/html'
    ...
    

    link text

        6
  •  7
  •   Octavian Helm    11 年前

    为了完整性,使用 HTTPLIB .

    基本上是相同的代码,只是库没有被调用 HTTPLIB 不再 HTTP客户端

    from http.client import HTTPConnection
    
    conn = HTTPConnection('www.google.com')
    conn.request('HEAD', '/index.html')
    res = conn.getresponse()
    
    print(res.status, res.reason)
    
        7
  •  2
  •   jcomeau_ictx    8 年前
    import httplib
    import urlparse
    
    def unshorten_url(url):
        parsed = urlparse.urlparse(url)
        h = httplib.HTTPConnection(parsed.netloc)
        h.request('HEAD', parsed.path)
        response = h.getresponse()
        if response.status/100 == 3 and response.getheader('Location'):
            return response.getheader('Location')
        else:
            return url
    
        8
  •  1
  •   Nope    15 年前

    作为旁白,当使用httplib(至少在2.5.2上)时,尝试读取head请求的响应将阻塞(在readline上),然后失败。如果您没有在响应上发出read,则无法在连接上发送另一个请求,则需要打开一个新的请求。或者接受请求之间的长时间延迟。

        9
  •  1
  •   IgorGanapolsky    14 年前

    我发现httplib比urllib2稍快。我定时了两个程序——一个使用httplib,另一个使用urlib2——向10000个url发送head请求。httplib一个快了几分钟。 HTTPLIB 总的统计数据是:真实的6M21.334S 用户0m2.124s 系统0 M16.372

    ULLIb2 总的统计数据是:真实的9m1.380s 用户0M16.666S 系统0m28.565s

    其他人对此有意见吗?

        10
  •  0
  •   estani    11 年前

    还有另一种方法(类似于pawel的答案):

    import urllib2
    import types
    
    request = urllib2.Request('http://localhost:8080')
    request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)
    

    只是为了避免在实例级别有无边界的方法。

        11
  •  -4
  •   Andy    16 年前

    可能更容易:使用urllib或urlib2。

    >>> import urllib
    >>> f = urllib.urlopen('http://google.com')
    >>> f.info().gettype()
    'text/html'
    

    f.info()是类似字典的对象,因此可以执行f.info()['content-type']等操作。

    http://docs.python.org/library/urllib.html
    http://docs.python.org/library/urllib2.html
    http://docs.python.org/library/httplib.html

    文档注意到httplib通常不直接使用。