문제

여기서 내가 하려는 것은 MIME 유형을 결정할 수 있도록 주어진 URL의 헤더를 얻는 것입니다.나는 그것을 볼 수 있기를 원한다. 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 요청을 수행하는 데 사용할 수 있습니다.URL을 호스트 이름과 경로로 분할하도록 요구하는 대신 urllib2가 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

나는 믿는다 요청사항 도서관도 언급되어야합니다.

단지:

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

링크 텍스트

완전성을 위해 다음을 사용하여 허용되는 답변과 동일한 Python3 답변을 얻으십시오. 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)
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

여담으로, httplib(최소 2.5.2 이상)를 사용할 때 HEAD 요청의 응답을 읽으려고 시도하면 (readline에서) 차단되고 결과적으로 실패합니다.응답에 대해 읽기를 실행하지 않으면 연결에 대한 다른 요청을 보낼 수 없으므로 새 요청을 열어야 합니다.또는 요청 사이의 긴 지연을 허용합니다.

나는 httplib가 urllib2보다 약간 빠르다는 것을 발견했습니다.나는 두 개의 프로그램(하나는 httplib를 사용하고 다른 하나는 urllib2를 사용)의 시간을 측정하여 10,000개의 URL에 HEAD 요청을 보냅니다.httplib는 몇 분 더 빨랐습니다. httplib님의 전체 통계는 다음과 같습니다.실제 6M21.334S 사용자 0M2.124S SYS 0M16.372S

그리고 urllib2님의 전체 통계는 다음과 같습니다.Real 9M1.380S 사용자 0M16.666S SYS 0M28.565S

다른 사람이 이에 대한 의견을 갖고 있습니까?

그리고 또 다른 접근 방식(Pawel 답변과 유사):

import urllib2
import types

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

인스턴스 수준에서 무제한 메서드를 사용하지 않기 위해서입니다.

아마도 더 쉬울 것입니다.urllib 또는 urllib2를 사용하십시오.

>>> 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가 일반적으로 직접 사용되지 않는다고 나와 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top