Nota: esta respuesta está desactualizada. Las versiones más recientes de requests
apoyo para conseguir el contenido solicitud directamente, como la respuesta de AntonioHerraizS documentos .
No es posible obtener el verdadero contenido sin procesar de la solicitud requests
, ya que solo trata con objetos de nivel superior, como encabezados y tipo de método . requests
usos urllib3
para enviar peticiones, pero urllib3
también no se ocupa de los datos en bruto - que utiliza httplib
. Aquí hay un seguimiento representativo de la pila de una solicitud:
-> r= requests.get("http://google.com")
/usr/local/lib/python2.7/dist-packages/requests/api.py(55)get()
-> return request('get', url, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/api.py(44)request()
-> return session.request(method=method, url=url, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/sessions.py(382)request()
-> resp = self.send(prep, **send_kwargs)
/usr/local/lib/python2.7/dist-packages/requests/sessions.py(485)send()
-> r = adapter.send(request, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/adapters.py(324)send()
-> timeout=timeout
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py(478)urlopen()
-> body=body, headers=headers)
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py(285)_make_request()
-> conn.request(method, url, **httplib_request_kw)
/usr/lib/python2.7/httplib.py(958)request()
-> self._send_request(method, url, body, headers)
Dentro de la httplib
maquinaria, podemos ver HTTPConnection._send_request
usos indirectos HTTPConnection._send_output
, que finalmente crean la solicitud sin procesar y el cuerpo (si existe), y los utiliza HTTPConnection.send
para enviarlos por separado. send
Finalmente llega al zócalo.
Como no hay ganchos para hacer lo que quieres, como último recurso, puedes usar parches httplib
para obtener el contenido. Es una solución frágil, y es posible que deba adaptarla si httplib
se cambia. Si tiene la intención de distribuir software usando esta solución, puede considerar el empaquetado en httplib
lugar de usar el sistema, lo cual es fácil, ya que es un módulo de Python puro.
Por desgracia, sin más preámbulos, la solución:
import requests
import httplib
def patch_send():
old_send= httplib.HTTPConnection.send
def new_send( self, data ):
print data
return old_send(self, data) #return is not necessary, but never hurts, in case the library is changed
httplib.HTTPConnection.send= new_send
patch_send()
requests.get("http://www.python.org")
que produce la salida:
GET / HTTP/1.1
Host: www.python.org
Accept-Encoding: gzip, deflate, compress
Accept: */*
User-Agent: python-requests/2.1.0 CPython/2.7.3 Linux/3.2.0-23-generic-pae