2009-01-23 19 views

Respuesta

27

Existen varias soluciones (por defecto, se eliminan). Aquí está un ejemplo de usando la opción HEADERFUNCTION que le permite indicar una función para manejarlos.

Otras soluciones son las opciones WRITEHEADER (no compatible con WRITEFUNCTION) o configurar HEADER en True para que se transmitan con el cuerpo.

#!/usr/bin/python 

import pycurl 
import sys 

class Storage: 
    def __init__(self): 
     self.contents = '' 
     self.line = 0 

    def store(self, buf): 
     self.line = self.line + 1 
     self.contents = "%s%i: %s" % (self.contents, self.line, buf) 

    def __str__(self): 
     return self.contents 

retrieved_body = Storage() 
retrieved_headers = Storage() 
c = pycurl.Curl() 
c.setopt(c.URL, 'http://www.demaziere.fr/eve/') 
c.setopt(c.WRITEFUNCTION, retrieved_body.store) 
c.setopt(c.HEADERFUNCTION, retrieved_headers.store) 
c.perform() 
c.close() 
print retrieved_headers 
print retrieved_body 
+0

Me gustaría utilizar esto sin tener que recuperar los contenidos. ¿Hay una manera de lograr esto? Mi contenido es grande (1.4 GB o similar), y solo necesito saber el tamaño, no el contenido. – Alfe

+0

@Alfe intenta hacer la solicitud '' 'HEAD''' en lugar de' '' GET''', algo así como '' 'c.setopt (pycurl.CUSTOMREQUEST," HEAD ")' '' – Serge

+0

Guau, eso es un retraso seguimiento, pero gracias de todos modos. Pero ahora es hace tanto tiempo ... Bien podría ser que lo hice de esa manera, pero en realidad, no recuerdo: -} – Alfe

1

Esto puede o no puede ser una alternativa para usted:

import urllib 
headers = urllib.urlopen('http://www.pythonchallenge.com').headers.headers 
6

Anothr alternativa, el uso human_curl: pip human_curl

In [1]: import human_curl as hurl 

In [2]: r = hurl.get("http://stackoverflow.com") 

In [3]: r.headers 
Out[3]: 
{'cache-control': 'public, max-age=45', 
'content-length': '198515', 
'content-type': 'text/html; charset=utf-8', 
'date': 'Thu, 01 Sep 2011 11:53:43 GMT', 
'expires': 'Thu, 01 Sep 2011 11:54:28 GMT', 
'last-modified': 'Thu, 01 Sep 2011 11:53:28 GMT', 
'vary': '*'} 
+0

al importar 'human_curl' recibo un error que dice' ImportError: pycurl: libcurl link-tiume ssl baqckend (nss) es diferente del tiempo de compilación ssl backend (ninguno/otro) ' –

8
import pycurl 
from StringIO import StringIO 

headers = StringIO() 

c = pycurl.Curl() 
c.setopt(c.URL, url) 
c.setopt(c.HEADER, 1) 
c.setopt(c.NOBODY, 1) # header only, no body 
c.setopt(c.HEADERFUNCTION, headers.write) 

c.perform() 

print headers.getvalue() 

añadir cualquier otra setopts enrollamiento según sea necesario/deseado, como FOLLOWLOCATION.

+0

Esta parece ser la única respuesta que SOLO recupera los encabezados. –

Cuestiones relacionadas