La forma correcta de utilizar el tiempo de espera dentro de la sesión al enviar las solicitudes

votos
24

Estoy tratando de aprender cómo puedo usar timeoutdentro de la sesión mientras envío solicitudes. La forma en que lo he intentado a continuación puede obtener el contenido de una página web, pero no estoy seguro de que sea la forma correcta, ya que no he podido encontrar el uso timeouten esta documentación.

import requests

link = https://stackoverflow.com/questions/tagged/web-scraping

with requests.Session() as s:
    r = s.get(link,timeout=5)
    print(r.text)

¿Cómo puedo usar el tiempo de espera dentro de la sesión?

Publicado el 23/05/2020 a las 17:15
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

De acuerdo con la Documentación - Inicio rápido

Puedes decirle a Requests que deje de esperar una respuesta después de un determinado número de segundos con el parámetro de tiempo de espera. Casi todo el código de producción debería usar este parámetro en casi todas las solicitudes.

requests.get('https://github.com/', timeout=0.001)

O desde la Documentación de Uso Avanzado se pueden establecer 2 valores (conecta y lea tiempo de espera)

El valor de tiempo de espera se aplicará tanto a la conecta y el leer ...tiempos de espera. Especifique una tupla si desea establecer los valores por separado:

r = requests.get('https://github.com', timeout=(3.05, 27))

Haciendo que la sesión se prolongue en el tiempo

Busca en toda la documentación y parece que no es posible establecer tiempo de espera de la sesión de parámetros

Pero hay un número de GitHub abierto (Considere la opción de hacer que el tiempo de espera sea requerido o tenga un valor por defecto) que proporciona unaHTTPAdapter solución alternativa que puede utilizar de esta manera:

id="pre-2"
Respondida el 27/05/2020 a las 15:18
fuente por usuario

votos
0

No estoy seguro de que sea la forma correcta, ya que no pude encontrar el uso de timeouten esta documentación.

Desplácese hasta el fondo. Definitivamente está ahí. Puedes buscarlo en la página pulsando Ctrl F e introduciendo timeout.

Estás usando timeoutcorrectamente en tu ejemplo de código.

En realidad, puede especificar el tiempo de espera de diferentes maneras, como se explica en la documentación:

Si especificas un solo valor de tiempo de espera, como este:

r = requests.get('https://github.com', timeout=5)

El valor de tiempo de espera se aplicará tanto a los tiempos de espera connectcomo a los readtiempos de espera. Especifique una tupla si desea establecer los valores por separado:

r = requests.get('https://github.com', timeout=(3.05, 27))

Si el servidor remoto es muy lento, puedes decirle a Requests que espere una respuesta para siempre, pasando None como valor de timeout y luego recuperando una taza de café.

r = requests.get('https://github.com', timeout=None)

Intenta usar https://httpstat.us/200?sleep=5000 para probar tu código.

Por ejemplo, esto plantea una excepción porque 0,2 segundos no es suficiente para establecer una conexión con el servidor:

import requests

link = "https://httpstat.us/200?sleep=5000"

with requests.Session() as s:
    try:
        r = s.get(link, timeout=(0.2, 10))
        print(r.text)
    except requests.exceptions.Timeout as e:
        print(e)

Salida:

HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=0.2)

Esto plantea una excepción porque el servidor espera 5 segundos antes de enviar la respuesta, que es más larga que el tiempo de espera de 2 segundos readestablecido:

import requests

link = "https://httpstat.us/200?sleep=5000"

with requests.Session() as s:
    try:
        r = s.get(link, timeout=(3.05, 2))
        print(r.text)
    except requests.exceptions.Timeout as e:
        print(e)

Salida:

HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=2)

Usted menciona específicamente el uso de un tiempo de espera dentro de una sesión. Así que tal vez quieras un objeto de sesión que tenga un tiempo de espera por defecto. Algo como esto:

import requests

link = "https://httpstat.us/200?sleep=5000"

class EnhancedSession(requests.Session):
    def __init__(self, timeout=(3.05, 4)):
        self.timeout = timeout
        return super().__init__()

    def request(self, method, url, **kwargs):
        print("EnhancedSession request")
        if "timeout" not in kwargs:
            kwargs["timeout"] = self.timeout
        return super().request(method, url, **kwargs)

session = EnhancedSession()

try:
    response = session.get(link)
    print(response)
except requests.exceptions.Timeout as e:
    print(e)

try:
    response = session.get(link, timeout=1)
    print(response)
except requests.exceptions.Timeout as e:
    print(e)

try:
    response = session.get(link, timeout=10)
    print(response)
except requests.exceptions.Timeout as e:
    print(e)

Salida:

id="pre-5"
Respondida el 27/05/2020 a las 15:50
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more