[python] Python 2에서 HEAD HTTP 요청을 어떻게 보내나요?

여기서 내가하려는 것은 주어진 URL의 헤더를 가져 와서 MIME 유형을 결정할 수 있도록하는 것입니다. http://somedomain/foo/예를 들어 HTML 문서 또는 JPEG 이미지를 반환 하는지 확인하고 싶습니다 . 따라서 콘텐츠를 다운로드하지 않고도 MIME 유형을 읽을 수 있도록 HEAD 요청을 보내는 방법을 알아 내야합니다. 누구든지 이것을하는 쉬운 방법을 알고 있습니까?



답변

편집 :이 답변은 작동하지만 요즘에는 아래 다른 답변에서 언급 한 것처럼 요청 라이브러리를 사용해야합니다 .


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)특정 헤더를 가져 오는 것도 있습니다 .


답변

urllib2 는 HEAD 요청을 수행하는 데 사용할 수 있습니다. urllib2는 URL을 호스트 이름과 경로로 분할하는 대신 URL을 구문 분석하므로 httplib를 사용하는 것보다 조금 더 좋습니다.

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


답변

의무적 인 Requests방법 :

import requests

resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers


답변

Requests 라이브러리도 언급되어야 한다고 생각합니다 .


답변

다만:

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'
...

링크 텍스트


답변

완전성을 위해 httplib를 사용하여 허용되는 답변과 동등한 Python3 답변을 갖습니다 .

기본적으로 라이브러리가 더 이상 httplib가 아니라 http.client 라는 것만 같은 코드입니다.

from http.client import HTTPConnection

conn = HTTPConnection('www.google.com')
conn.request('HEAD', '/index.html')
res = conn.getresponse()

print(res.status, res.reason)


답변

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