Módulo Requests de
Python
Ejemplo
Solicite una página web e imprima el texto de respuesta:
import requests
x = requests.get('https://w3schools.com/python/demopage.htm')
print(x.text)
Definición y uso
El requestsmódulo le permite enviar solicitudes HTTP utilizando Python.
La solicitud HTTP devuelve un Objeto de respuesta con todos los datos de respuesta
(contenido, codificación, estado, etc.).
Descargue e instale el módulo Requests
Navegue su línea de comando a la ubicación de PIP y escriba lo siguiente:
C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip install
requests
Sintaxis
requests.methodname(params)
Métodos
Method Description
delete(url, args) Sends a DELETE request to the specified url
get(url, params, args) Sends a GET request to the specified url
head(url, args) Sends a HEAD request to the specified url
patch(url, data, args) Sends a PATCH request to the specified url
post(url, data, json, args) Sends a POST request to the specified url
put(url, data, args) Sends a PUT request to the specified url
request(method, url, args) Sends a request of the specified method to the specified url
http.client- Cliente de protocolo HTTP
Código fuente: Lib / http / client.py
Este módulo define clases que implementan el lado del cliente de los protocolos HTTP y HTTPS. Normalmente
no se usa directamente; el módulo lo urllib.requestusa para manejar URL que usan HTTP y HTTPS.
Ver también
El paquete de solicitudes se recomienda para una interfaz de cliente HTTP de nivel superior.
Nota
El soporte HTTPS solo está disponible si Python se compiló con soporte SSL (a través del sslmódulo).
El módulo proporciona las siguientes clases:
clase http.client.HTTPConnection( host , puerto = None , [ timeout , ] source_address = None , blocksize =
8192 )
Una HTTPConnectioninstancia representa una transacción con un servidor HTTP. Se debe instanciar pasándole
un host y un número de puerto opcional. Si no se pasa ningún número de puerto, el puerto se extrae de la
cadena de host si tiene el formulario host:port; de lo contrario, se usa el puerto HTTP predeterminado (80). Si
se proporciona el parámetro de tiempo de espera opcional , las operaciones de bloqueo (como los intentos de
conexión) se agotarán después de esos segundos (si no se da, se usa la configuración de tiempo de espera
predeterminada global). El parámetro opcional source_address puede ser una tupla de un (host, puerto) para
usar como la dirección de origen desde la que se realiza la conexión
HTTP. El parámetro opcional blockize establece el tamaño del búfer en bytes para enviar un cuerpo de mensaje
similar a un archivo.
Por ejemplo, las siguientes llamadas crean instancias que se conectan al servidor en el mismo host y puerto:
>>>
>>> h1 = http.client.HTTPConnection('www.python.org')
>>> h2 = http.client.HTTPConnection('www.python.org:80')
>>> h3 = http.client.HTTPConnection('www.python.org', 80)
>>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)
Cambiado en la versión 3.2: se agregó source_address .
Cambiado en la versión 3.4: La estricta parámetro se eliminó. Las "respuestas simples" de estilo HTTP 0.9 ya no
son compatibles.
Modificado en la versión 3.7: se agregó el parámetro de tamaño de bloque .
class http.client.HTTPSConnection( host , port = None , key_file = None , cert_file =
None , [ timeout , ] source_address = None , * , context = None , check_hostname = None , blocksize = 8192 )
Una subclase de HTTPConnectioneso usa SSL para la comunicación con servidores seguros. El puerto por
defecto es 443. Si se especifica el contexto , debe ser una ssl.SSLContextinstancia que describa las diversas
opciones de SSL.
Lea las Consideraciones de seguridad para obtener más información sobre las mejores prácticas.
Cambiado en la versión 3.2: se agregaron source_address , context y check_hostname .
Modificado en la versión 3.2: esta clase ahora admite hosts virtuales HTTPS si es posible (es decir,
si ssl.HAS_SNIes cierto).
Cambiado en la versión 3.4: La estricta parámetro se eliminó. Las "respuestas simples" de estilo HTTP 0.9 ya no
son compatibles.
Modificado en la versión 3.4.3: esta clase ahora realiza todas las comprobaciones necesarias de certificados y
nombres de host de forma predeterminada. Para volver al comportamiento anterior, no
verificado, ssl._create_unverified_context()se puede pasar al parámetro de contexto .
Cambiado en la versión 3.8: esta clase ahora habilita TLS 1.3 ssl.SSLContext.post_handshake_authpara
el contexto predeterminado o cuando cert_file se pasa con un contexto personalizado .
En desuso desde la versión 3.6: key_file y cert_file están en desuso a favor del contexto . Utilice en
su ssl.SSLContext.load_cert_chain()lugar, o deje que ssl.create_default_context()seleccione los certificados de
CA de confianza del sistema por usted.
El parámetro check_hostname también está en desuso; el ssl.SSLContext.check_hostnameatributo
de contexto debe usarse en su lugar.
clase http.client.HTTPResponse( calcetín , debuglevel = 0 , método = Ninguno , url = Ninguno )
Clase cuyas instancias se devuelven tras una conexión exitosa. No instanciado directamente por el usuario.
Cambiado en la versión 3.4: La estricta parámetro se eliminó. Las "respuestas simples" del estilo HTTP 0.9 ya no
son compatibles.
Este módulo proporciona la siguiente función:
http.client.parse_headers( fp )
Analiza los encabezados desde un puntero de archivo fp que representa una solicitud / respuesta HTTP. El
archivo debe ser un BufferedIOBaselector (es decir, no texto) y debe proporcionar unEncabezado de estilo RFC
2822 .
Esta función devuelve una instancia http.client.HTTPMessage que contiene los campos de encabezado, pero no
carga útil (lo mismo que HTTPResponse.msg y http.server.BaseHTTPRequestHandler.headers). Después de
regresar, el puntero de archivo fp está listo para leer el cuerpo HTTP.
Nota
parse_headers()no analiza la línea de inicio de un mensaje HTTP; solo analiza las líneas. El archivo tiene que
estar listo para leer estas líneas de campo, por lo que la primera línea ya debe consumirse antes de llamar a la
función.Name: value
Las siguientes excepciones se plantean según corresponda:
excepción http.client.HTTPException
La clase base de las otras excepciones en este módulo. Es una subclase de Exception.
excepción http.client.NotConnected
Una subclase de HTTPException.
excepción http.client.InvalidURL
Una subclase de HTTPException, generada si se proporciona un puerto y no es numérico o está vacío.
excepción http.client.UnknownProtocol
Una subclase de HTTPException.
excepción http.client.UnknownTransferEncoding
Una subclase de HTTPException.
excepción http.client.UnimplementedFileMode
Una subclase de HTTPException.
excepción http.client.IncompleteRead
Una subclase de HTTPException.
excepción http.client.ImproperConnectionState
Una subclase de HTTPException.
excepción http.client.CannotSendRequest
Una subclase de ImproperConnectionState.
excepción http.client.CannotSendHeader
Una subclase de ImproperConnectionState.
excepción http.client.ResponseNotReady
Una subclase de ImproperConnectionState.
excepción http.client.BadStatusLine
Una subclase de HTTPException. Se genera si un servidor responde con un código de estado HTTP que no
entendemos.
excepción http.client.LineTooLong
Una subclase de HTTPException. Se genera si se recibe una línea excesivamente larga en el protocolo HTTP del
servidor.
excepción http.client.RemoteDisconnected
Una subclase de ConnectionResetErrory BadStatusLine. Se HTTPConnection.getresponse()genera cuando el
intento de leer la respuesta no produce datos leídos de la conexión, lo que indica que el extremo remoto ha
cerrado la conexión.
Nuevo en la versión 3.5: Anteriormente, se planteó.BadStatusLine('')
Las constantes definidas en este módulo son:
http.client.HTTP_PORT
El puerto predeterminado para el protocolo HTTP (siempre 80).
http.client.HTTPS_PORT
El puerto predeterminado para el protocolo HTTPS (siempre 443).
http.client.responses
Este diccionario asigna los códigos de estado HTTP 1.1 a los nombres W3C.
Ejemplo: http.client.responses[http.client.NOT_FOUND]is .'Not Found'
Consulte los códigos de estado HTTP para obtener una lista de los códigos de estado HTTP que están
disponibles en este módulo como constantes.
Objetos de conexión HTTP
HTTPConnection las instancias tienen los siguientes métodos:
HTTPConnection.request( método , url , cuerpo = Ninguno , encabezados = {} , * , encode_chunked = False )
Esto enviará una solicitud al servidor utilizando el método del método de solicitud HTTP y la url del selector .
Si se especifica el cuerpo , los datos especificados se envían después de que los encabezados hayan
terminado. Puede ser un str, un objeto similar a bytes , un objeto de archivo abierto o un iterable de bytes. Si
el cuerpo es una cadena, se codifica como ISO-8859-1, el valor predeterminado para HTTP. Si es un objeto de
tipo bytes, los bytes se envían tal cual. Si es un objeto de archivo, se envía el contenido del archivo; Este objeto
de archivo debe admitir al menos el read()método. Si el objeto de archivo es una instancia de io.TextIOBase, los
datos devueltos por el read() método se codificarán como ISO-8859-1; de lo contrario, los datos devueltos
por read()se enviarán tal cual. Si cuerpo es un iterable, los elementos del iterable se envían tal cual hasta que
se agota el iterable.
El argumento de encabezados debe ser una asignación de encabezados HTTP adicionales para enviar con la
solicitud.
Si los encabezados no contienen Content-Length ni Transfer-Encoding, pero hay un cuerpo de solicitud, uno de
esos campos de encabezado se agregará automáticamente. Si el cuerpo es None, la cabecera Content-Length
se establece en 0los métodos que esperan un cuerpo ( PUT, POSTy PATCH). Si el cuerpo es una cadena o un
objeto similar a bytes que no es también un archivo , el encabezado Content-Length se establece en su
longitud. Cualquier otro tipo de cuerpo (archivos e iterables en general) se codificará en fragmentos, y el
encabezado Transfer-Encoding se establecerá automáticamente en lugar de Content-Length.
El argumento encode_chunked solo es relevante si Transfer-Encoding se especifica en
los encabezados . Si encode_chunked es False, el objeto HTTPConnection supone que toda la codificación es
manejada por el código de llamada. Si es así True, el cuerpo estará codificado en fragmentos.
Nota
La codificación de transferencia fragmentada se ha agregado al protocolo HTTP versión 1.1. A menos que se
sepa que el servidor HTTP maneja HTTP 1.1, la persona que llama debe especificar la longitud del contenido o
debe pasar un strobjeto similar a bytes o que no sea también un archivo como la representación del cuerpo.
Nuevo en la versión 3.2: el cuerpo ahora puede ser iterable.
Cambiado en la versión 3.6: si ni Content-Length ni Transfer-Encoding están configurados en encabezados , el
archivo y los objetos de cuerpo iterables ahora están codificados en fragmentos. Se agregó el
argumento encode_chunked . No se intenta determinar la longitud del contenido para los objetos de archivo.
HTTPConnection.getresponse( )
Debe llamarse después de enviar una solicitud para obtener la respuesta del servidor. Devuelve
una HTTPResponseinstancia.
Nota
Tenga en cuenta que debe haber leído la respuesta completa antes de poder enviar una nueva solicitud al
servidor.
Modificado en la versión 3.5: si se ConnectionErrorgenera una o una subclase, el HTTPConnectionobjeto estará
listo para volver a conectarse cuando se envíe una nueva solicitud.
HTTPConnection.set_debuglevel( nivel )
Establecer el nivel de depuración. El nivel de depuración predeterminado es 0, lo que significa que no se
imprime ninguna salida de depuración. Cualquier valor mayor que 0hará que todos los resultados de
depuración definidos actualmente se impriman en stdout. El debuglevel se pasa a
cualquier HTTPResponseobjeto nuevo que se cree.
Nuevo en la versión 3.1.
HTTPConnection.set_tunnel( host , puerto = Ninguno , encabezados = Ninguno )
Configure el host y el puerto para el túnel de conexión HTTP. Esto permite ejecutar la conexión a través de un
servidor proxy.
Los argumentos de host y puerto especifican el punto final de la conexión tunelizada (es decir, la dirección
incluida en la solicitud CONNECT, no la dirección del servidor proxy).
El argumento de los encabezados debe ser una asignación de encabezados HTTP adicionales para enviar con la
solicitud CONNECT.
Por ejemplo, para hacer un túnel a través de un servidor proxy HTTPS que se ejecuta localmente en el puerto
8080, pasaríamos la dirección del proxy al HTTPSConnection constructor, y la dirección del host al que
finalmente queremos llegar al set_tunnel()método:
>>>
>>> import http.client
>>> conn = http.client.HTTPSConnection("localhost", 8080)
>>> conn.set_tunnel("www.python.org")
>>> conn.request("HEAD","/index.html")
Nuevo en la versión 3.2.
HTTPConnection.connect( )
Conéctese al servidor especificado cuando se creó el objeto. Por defecto, esto se llama automáticamente
cuando se realiza una solicitud si el cliente aún no tiene una conexión.
HTTPConnection.close( )
Cierre la conexión al servidor.
HTTPConnection.blocksize
Tamaño del búfer en bytes para enviar un cuerpo de mensaje similar a un archivo.
Nuevo en la versión 3.7.
Como alternativa al uso del request()método descrito anteriormente, también puede enviar su solicitud paso a
paso, utilizando las cuatro funciones a continuación.
HTTPConnection.putrequest( método , url , skip_host = False , skip_accept_encoding = False )
Esta debería ser la primera llamada después de que se haya realizado la conexión al servidor. Envía una línea al
servidor que consta de la cadena de método , la cadena de url y la versión HTTP ( HTTP/1.1). Para deshabilitar
el envío automático de encabezados Host:o Accept-Encoding:(por ejemplo, para aceptar codificaciones de
contenido adicionales), especifique skip_host o skip_accept_encoding con valores no falsos.
HTTPConnection.putheader( encabezado , argumento [ , ... ] )
Mandar un Encabezado de estilo RFC 822 al servidor. Envía una línea al servidor que consta del encabezado,
dos puntos y un espacio, y el primer argumento. Si se dan más argumentos, se envían líneas de continuación,
cada una de las cuales consta de una pestaña y un argumento.
HTTPConnection.endheaders( message_body = None , * , encode_chunked = False )
Envíe una línea en blanco al servidor, señalando el final de los
encabezados. El argumento opcional message_body se puede usar para pasar un cuerpo de mensaje asociado
con la solicitud.
Si encode_chunked es True, el resultado de cada iteración de message_body se codificará en fragmentos como
se especifica enRFC 7230 , Sección 3.3.1. La forma en que se codifican los datos depende del tipo
de mensaje_cuerpo . Si message_body implementa la interfaz del búfer, la codificación dará como resultado un
único fragmento. Si message_body es uncollections.abc.Iterable, cada iteración de message_body dará como
resultado un fragmento. Si message_body es un objeto de archivo , cada llamada a.read()resultará en un
fragmento. El método señala automáticamente el final de los datos codificados en fragmentos inmediatamente
después de message_body .
Nota
Debido a la especificación de codificación fragmentada, el codificador fragmentador ignorará los fragmentos
vacíos producidos por un cuerpo iterador. Esto es para evitar la terminación prematura de la lectura de la
solicitud por parte del servidor de destino debido a una codificación con formato incorrecto.
Nuevo en la versión 3.6: soporte de codificación fragmentada. El parámetro encode_chunked fue agregado.
HTTPConnection.send( datos )
Enviar datos al servidor. Esto debe usarse directamente solo después de endheaders()que se haya
llamado al método y antes de que getresponse()se llame.
Objetos HTTPResponse
Una HTTPResponseinstancia envuelve la respuesta HTTP del servidor. Proporciona acceso a los encabezados de
solicitud y al cuerpo de la entidad. La respuesta es un objeto iterable y puede usarse en una declaración with.
Cambiado en la versión 3.5: la io.BufferedIOBaseinterfaz ahora está implementada y todas sus operaciones de
lectura son compatibles.
HTTPResponse.read( [ amt ] )
Lee y devuelve el cuerpo de respuesta, o hasta los siguientes bytes de amt .
HTTPResponse.readinto( b )
Lee hasta los siguientes bytes len (b) del cuerpo de respuesta en el búfer b . Devuelve el número de bytes
leídos.
Nuevo en la versión 3.3.
HTTPResponse.getheader( nombre , predeterminado = Ninguno )
Devuelve el valor del nombre del encabezado , o predeterminado si no hay un nombre que coincida con el
encabezado . Si hay más de un encabezado con el nombre nombre , devolver todos los valores unidos por ''. Si
'default' es cualquier iterable que no sea una sola cadena, sus elementos se devuelven de manera similar
unidos por comas.
HTTPResponse.getheaders( )
Devuelve una lista de tuplas (encabezado, valor).
HTTPResponse.fileno( )
Devuelve el filenodel zócalo subyacente.
HTTPResponse.msg
Una http.client.HTTPMessageinstancia que contiene los encabezados de respuesta. http.client.HTTPMessagees
una subclase de email.message.Message.
HTTPResponse.version
Versión del protocolo HTTP utilizada por el servidor. 10 para HTTP / 1.0, 11 para HTTP / 1.1.
HTTPResponse.status
Código de estado devuelto por el servidor.
HTTPResponse.reason
Frase de razón devuelta por el servidor.
HTTPResponse.debuglevel
Un gancho de depuración. Si debugleveles mayor que cero, los mensajes se imprimirán en stdout a medida que
se lea y analice la respuesta.
HTTPResponse.closed
Es Truesi el flujo está cerrado.
Ejemplos
Aquí hay una sesión de ejemplo que usa el GETmétodo:
>>>
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print(r1.status, r1.reason)
200 OK
>>> data1 = r1.read() # This will return entire content.
>>> # The following example demonstrates reading data in chunks.
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> while chunk := r1.read(200):
... print(repr(chunk))
b'<!doctype html>\n<!--[if"...
...
>>> # Example of an invalid request
>>> conn = http.client.HTTPSConnection("docs.python.org")
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print(r2.status, r2.reason)
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
Aquí hay una sesión de ejemplo que usa el HEADmétodo. Tenga en cuenta que el HEADmétodo nunca devuelve
ningún dato.
>>>
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("HEAD", "/")
>>> res = conn.getresponse()
>>> print(res.status, res.reason)
200 OK
>>> data = res.read()
>>> print(len(data))
>>> data == b''
True
Aquí hay una sesión de ejemplo que muestra cómo POSTsolicitar:
>>>
>>> import http.client, urllib.parse
>>> params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
... "Accept": "text/plain"}
>>> conn = http.client.HTTPConnection("bugs.python.org")
>>> conn.request("POST", "", params, headers)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
302 Found
>>> data = response.read()
>>> data
b'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'
>>> conn.close()
Las solicitudes del lado del cliente son muy similares a las solicitudes. La diferencia radica solo en el lado del
servidor donde el servidor HTTP permitirá que se creen recursos mediante solicitud. Cabe señalar que los
métodos HTTP personalizados también se manejan configurando el atributo de método apropiado. Aquí hay
una sesión de ejemplo que muestra cómo enviar una solicitud usando
http.client:HTTP PUTPOSTPUTurllib.request.RequestPUT
>>>
>>> # This creates an HTTP message
>>> # with the content of BODY as the enclosed representation
>>> # for the resource http://localhost:8080/file
...
>>> import http.client
>>> BODY = "***filecontents***"
>>> conn = http.client.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200, OK
Objetos HTTPMessage
Una http.client.HTTPMessageinstancia contiene los encabezados de una respuesta HTTP. Se implementa
utilizando la email.message.Messageclase.