То, что я пытаюсь сделать здесь, это получить заголовки заданного URL-адреса, чтобы я мог определить тип MIME. Я хочу, чтобы увидеть, будет ли http://somedomain/foo/
возвращать HTML-документ или образ JPEG, например. Таким образом, мне нужно выяснить, как отправить запрос HEAD, чтобы я мог читать MIME-тип без необходимости загрузки содержимого. Кто-нибудь знает, как легко это сделать?
Как отправить HTTP-запрос HEAD в Python 2?
Ответ 1
edit: Этот ответ работает, но в настоящее время вы должны просто использовать библиотеку запросов, как указано в других ответах ниже.
Используйте 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
urllib2 можно использовать для выполнения запроса HEAD. Это немного лучше, чем использование 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
Обязательный Requests
способ:
import requests
resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers
Ответ 4
Я считаю, что следует также упомянуть библиотеку Requests.
Ответ 5
Просто:
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'
...
Ответ 6
Для полноты ответа Python3, эквивалентного принятому ответу, с помощью httplib.
Это в основном тот же код, что библиотека больше не называется 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)
Ответ 7
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
В стороне, при использовании httplib (по крайней мере, на 2.5.2), попытка прочитать ответ запроса HEAD будет блокировать (на readline) и впоследствии терпеть неудачу. Если вы не прочитаете ответ, вы не сможете отправить другой запрос на соединение, вам нужно будет открыть новый. Или принять длительную задержку между запросами.
Ответ 9
Я обнаружил, что httplib немного быстрее, чем urllib2. Я приурочил две программы: один из них использовал httplib, а другой - с помощью urllib2 - отправил HEAD-запросы на 10 000 URL-адресов. Один httplib был быстрее на несколько минут. httplib общая статистика: real 6m21.334s пользователь 0m2.124s sys 0m16.372s
И urllib2 общая статистика была: real 9m1.380s пользователь 0m16.666s sys 0m28.565s
Есть ли у кого-нибудь еще данные об этом?
Ответ 10
И еще один подход (похожий на ответ Павела):
import urllib2
import types
request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)
Просто, чтобы избежать неограниченных методов на уровне экземпляра.
Ответ 11
Вероятно, проще: используйте 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 обычно не используется напрямую.