Como ler o cabeçalho com pycurl
Pergunta
Como faço para ler os cabeçalhos de resposta de voltar de uma solicitação pycurl?
Solução
Existem várias soluções (por padrão, eles são descartados). Aqui está um exemplo usando a HEADERFUNCTION opção que permite indicar um função para lidar com eles.
Outras soluções são opções WRITEHEADER (não compatível com WRITEFUNCTION) ou a criação de cabeçalho para True para que elas são transmitidas com o corpo.
#!/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
Outras dicas
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()
Adicione quaisquer outros setopts onda conforme necessário / desejado, como FOLLOWLOCATION.
Anothr alternativo, 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': '*'}
Esta pode ou não ser uma alternativa para você:
import urllib
headers = urllib.urlopen('http://www.pythonchallenge.com').headers.headers
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow