Modo corretto di utilizzare il timeout all'interno della sessione durante l'invio delle richieste

voti
44

Sto cercando di capire come posso usare timeoutil timeout durante l'invio delle richieste. Il modo in cui ho provato qui sotto può recuperare il contenuto di una pagina web, ma non sono sicuro che questo sia il modo giusto perché non sono riuscito a trovarne l'uso timeoutin questa documentazione.

import requests

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

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

Come posso usare il timeout all'interno della sessione?

È pubblicato 23/05/2020 alle 17:15
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

Secondo la documentazione - Quick Start

Puoi dire alle Richieste di smettere di aspettare una risposta dopo un dato numero di secondi con il parametro timeout. Quasi tutto il codice di produzione dovrebbe utilizzare questo parametro in quasi tutte le richieste.

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

Oppure dalla Documentazione Uso Avanzato è possibile impostare 2 valori (collegarsi a e leggi timeout)

Il valore di timeout sarà applicato ad entrambi gli elementi collegarsi a e il leggi timeout. Specificare una tupla se si desidera impostare i valori separatamente:

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

Rendere la sessione più ampia

Ricercato in tutta la documentazione e si nota che non è possibile impostare timeout sessione di parametrizzazione

Ma c'è un problema di GitHub aperto (Considerare l'opzione Timeout richiesta o avere un'opzione predefinita) che fornisce un workaround come HTTPAdaptersi può usare in questo modo:

id="pre-2
Risposto il 27/05/2020 a 15:18
fonte dall'utente

voti
0

Non sono sicuro che questo sia il modo giusto perché non sono riuscito a trovarne l'uso timeoutin questa documentazione.

Scorrere fino in fondo. È sicuramente lì. Potete cercarlo nella pagina premendo Ctrl F e digitando timeout.

L'uso è timeoutcorretto nel vostro esempio di codice.

È possibile specificare il timeout in diversi modi, come spiegato nella documentazione:

Se si specifica un singolo valore per il timeout, come questo:

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

Il valore di timeout verrà applicato sia al timeout connectche ai readtimeout. Specificare una tupla se si desidera impostare i valori separatamente:

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

Se il server remoto è molto lento, si può dire alle Richieste di attendere per sempre una risposta, passando None come valore di timeout e poi recuperando una tazza di caffè.

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

Provare a utilizzare https://httpstat.us/200?sleep=5000 per testare il vostro codice.

Per esempio, questo solleva un'eccezione perché 0,2 secondi non sono sufficienti per stabilire una connessione con il server:

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)

Uscita:

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

Questo solleva un'eccezione perché il server attende 5 secondi prima di inviare la risposta, che è più lungo dei 2 secondi di readtimeout impostati:

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)

Output:

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

Si parla specificamente dell'uso di un timeout all'interno di una sessione. Quindi forse si vuole un oggetto di sessione che ha un timeout predefinito. Qualcosa del genere:

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)

Uscita:

id="pre-5
Risposto il 27/05/2020 a 15:50
fonte dall'utente

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