Comment utiliser le délai d'attente au cours de la session lors de l'envoi des demandes

voix
44

J'essaie d'apprendre comment je peux utiliser timeouten cours de session tout en envoyant des demandes. La méthode que j'ai essayée ci-dessous permet de récupérer le contenu d'une page web, mais je ne suis pas sûr que ce soit la bonne méthode car je n'ai pas pu trouver l'utilisation de timeoutcette documentation.

import requests

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

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

Comment puis-je utiliser le délai d'attente au cours d'une session ?

Créé 23/05/2020 à 17:15
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Selon la documentation - Quick Start

Vous pouvez dire aux demandes de cesser d'attendre une réponse après une nombre de secondes avec le paramètre timeout. Presque tous les codes de production devraient utiliser ce paramètre dans presque toutes les demandes.

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

Ou à partir de la Documentation - Utilisation avancée, vous pouvez définir 2 valeurs (se connecter et lire timeout)

La valeur du délai d'attente sera appliquée à la fois au se connecter et le lire les temps morts. Indiquez un tuple si vous souhaitez définir les valeurs séparément :

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

Rendre le Timeout de la session large

En cherchant dans toute la documentation, on constate qu'il n'est pas possible d'établir timeout de la session de paramétrage

Mais il y a un problème GitHub ouvert (Envisager de rendre l'option Timeout obligatoire ou avoir une valeur par défaut) qui fournit une solution de contournement que HTTPAdaptervous pouvez utiliser comme ceci :

id="pre-2"
Créé 27/05/2020 à 15:18
source utilisateur

voix
0

Je ne suis pas sûr que ce soit la bonne façon de procéder car je n'ai pas pu trouver l'usage qui en est fait timeoutdans cette documentation.

Faites défiler l'écran jusqu'en bas. Il est bien là. Vous pouvez le rechercher dans la page en appuyant sur Ctrl F et en entrant timeout.

Vous utilisez timeoutcorrectement dans votre exemple de code.

Vous pouvez en fait spécifier le délai d'attente de plusieurs façons différentes, comme expliqué dans la documentation :

Si vous spécifiez une seule valeur pour le délai d'attente, comme ceci :

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

La valeur du délai d'attente sera appliquée à la fois au délai d'attente connectet à la readvaleur de la demande. Spécifiez un tuple si vous souhaitez définir les valeurs séparément :

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

Si le serveur distant est très lent, vous pouvez dire aux requêtes d'attendre une réponse pour toujours, en passant None comme valeur de temporisation et en récupérant ensuite une tasse de café.

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

Essayez d'utiliser https://httpstat.us/200?sleep=5000 pour tester votre code.

Par exemple, cela soulève une exception parce que 0,2 seconde n'est pas assez long pour établir une connexion avec le serveur :

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)

Sortie :

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

Cela soulève une exception parce que le serveur attend 5 secondes avant d'envoyer la réponse, ce qui est plus long que le readdélai de 2 secondes fixé :

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)

Sortie :

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

Vous mentionnez spécifiquement l'utilisation d'un délai d'attente au sein d'une session. Vous voulez donc peut-être un objet de session qui a un délai d'attente par défaut. Quelque chose comme ceci :

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)

Sortie :

id="pre-5"
Créé 27/05/2020 à 15:50
source utilisateur

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