Pergunta

O que eu estou tentando fazer aqui é obter os cabeçalhos de uma determinada URL para que eu possa determinar o tipo MIME. Eu quero ser capaz de ver se http://somedomain/foo/ retornará um uma imagem JPEG, por exemplo, documento HTML ou. Assim, eu preciso descobrir como enviar um pedido HEAD para que eu possa ler o tipo de MIME sem ter que baixar o conteúdo. Alguém sabe de uma maneira fácil de fazer isso?

Foi útil?

Solução

Editar : esta resposta obras, mas hoje em dia você deve apenas usar o solicitações biblioteca como mencionado por outras respostas abaixo.


Use 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')]

Há também um getheader(name) para obter um cabeçalho específico.

Outras dicas

urllib2 pode ser usado para executar uma solicitação HEAD. Este é um pouco melhor do que usar httplib desde urllib2 analisa o URL para você em vez de exigir que você dividir a URL no nome do host e caminho.

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

Os cabeçalhos estão disponíveis através response.info () como antes. Curiosamente, você pode encontrar o URL que você foi redirecionado para:

>>> print response.geturl()
http://www.google.com.au/index.html

Requests maneira:

import requests

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

Eu acredito que os pedidos href="http://docs.python-requests.org/en/latest/index.html"> biblioteca deve ser mencionado também.

Apenas:

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

response = urllib2.urlopen(request)
response.info().gettype()

Editar: Eu só vim a perceber que há 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 de texto

Para completar a ter uma resposta Python3 equivalente à resposta aceita usando httplib .

É basicamente o mesmo código apenas que a biblioteca não é chamado httplib mais, mas 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

Como um aparte, quando se utiliza o httplib (pelo menos no 2.5.2), tentando ler a resposta de um pedido HEAD irá bloquear (no readline) e, posteriormente falhar. Se você não emitem ler sobre a resposta, você é incapaz de enviar outro pedido na conexão, você precisará abrir uma nova. Ou aceitar um longo atraso entre as solicitações.

Eu descobri que httplib é ligeiramente mais rápido do que urllib2. Eu cronometrado dois programas - um usando httplib eo outro usando urllib2 - o envio de solicitações cabeça para 10.000 URL. A única httplib foi mais rápido por alguns minutos. httplib 's estatísticas totais foram: 6m21.334s reais 0m2.124s usuário sys 0m16.372s

e urllib2 's estatísticas totais foram: 9m1.380s reais 0m16.666s usuário sys 0m28.565s

Alguém mais tem entrada sobre isso?

E ainda outra abordagem (semelhante a resposta Pawel):

import urllib2
import types

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

Apenas para evitar ter métodos ilimitados a nível instância.

Provavelmente mais fácil:. Uso urllib ou urllib2

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

f.info () é um dicionário-como objeto, de modo que você pode fazer f.info () [ 'Content-Type'], etc.

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

Os docs note que httplib normalmente não é usado diretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top