Здесь я пытаюсь получить заголовки заданного URL-адреса, чтобы я мог определить тип MIME. Я хочу увидеть, вернет ли http://somedomain/foo/
документ HTML или изображение JPEG, например. Таким образом, мне нужно выяснить, как отправить запрос HEAD, чтобы я мог читать тип MIME без необходимости загружать контент. Кто-нибудь знает простой способ сделать это?
Как отправить HTTP-запрос HEAD в Python 2?
Ответы (11)
изменить: этот ответ работает, но в настоящее время вы должны просто использовать запрашивает библиотеку, как указано в других ответах ниже.
Используйте https://docs.python.org/2/library/httplib.html.
>>> 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)
для получения определенного заголовка.
urlparse
, о чем свидетельствует ответ более низкого ранга.
- person Tomasz Gandor; 10.01.2013
httplib
переименован в http.client
.
- person Santosh Kumar; 13.03.2013
requests
по умолчанию не поставляется с Python.
- person rook; 18.11.2013
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
httplib.HTTPConnection
, который не обрабатывает перенаправления автоматически.
- person Ehtesh Choudhury; 04.10.2011
Обязательный Requests
способ:
import requests
resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers
Я считаю, что также следует упомянуть библиотеку Requests.
allow_redirects
может отключать только перенаправления POST / PUT / DELETE. Пример: запрос заголовка без перенаправления
- person jfs; 10.02.2012
requests.head(URL)
не остановился на перенаправлении и сделал дополнительные запросы GET. Текущая версия 0.13.9 больше этого не делает (по крайней мере, для 301, 302 редиректов).
- person jfs; 31.08.2012
allow_redirects
работал за счет включения перенаправления для POST, т.е. allow_redirects
не влиял на HEAD.
- person jfs; 31.08.2012
Просто:
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'
...
request
. (То есть, это будет работать, но это плохой стиль, и если вы хотите использовать в нем self
- сложно.)
- person Chris Morgan; 12.12.2010
Для полноты, чтобы получить ответ 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)
Кстати, при использовании httplib (по крайней мере, в 2.5.2) попытка прочитать ответ на запрос HEAD будет блокироваться (в строке чтения) и впоследствии завершаться ошибкой. Если вы не выдадите read в ответе, вы не сможете отправить еще один запрос на соединение, вам нужно будет открыть новый. Или согласитесь с большой задержкой между запросами.
Я обнаружил, что httplib немного быстрее urllib2. Я рассчитал время для двух программ - одна с использованием httplib, а другая с использованием urllib2 - отправка запросов HEAD на 10 000 URL-адресов. Httplib был быстрее на несколько минут. Общая статистика httplib: реальные 6m21.334s пользователь 0m2.124s sys 0m16.372s.
И общая статистика urllib2 была: реальные 9m1.380s пользователь 0m16.666s sys 0m28.565s.
Кто-нибудь еще имеет мнение по этому поводу?
И еще один подход (похожий на ответ Павла):
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 обычно не используется напрямую.
import
? +1 за urlparse
- вместе с httplib
они дают комфорт urllib2
при работе с URL-адресами на стороне ввода.
- person Tomasz Gandor; 10.01.2013