Richtige Art und Weise, Timeout innerhalb der Sitzung beim Senden von Anfragen zu verwenden

stimmen
44

Ich versuche zu lernen, wie ich innerhalb der Sitzung beim Senden von Anfragen verwenden timeoutkann. Die Art und Weise, wie ich es unten versucht habe, kann den Inhalt einer Webseite abrufen, aber ich bin mir nicht sicher, ob dies der richtige Weg ist, da ich die Verwendung von timeoutin dieser Dokumentation nicht finden konnte.

import requests

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

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

Wie kann ich das Timeout innerhalb einer Sitzung verwenden?

Veröffentlicht am 23/05/2020 um 17:15
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Gemäss der Dokumentation - Schnellstart

Sie können Anfragen anweisen, nach einer bestimmten Zeit nicht mehr auf eine Antwort zu warten anzahl von Sekunden mit dem Timeout-Parameter. Nahezu der gesamte Produktionscode sollte diesen Parameter in fast allen Anfragen verwenden.

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

Oder aus der Dokumentation Erweiterte Verwendung können Sie 2 Werte einstellen (verbinden und lesen zeitüberschreitung)

Der Timeout-Wert wird sowohl auf die verbinden und die lesen auszeiten. Geben Sie ein Tupel an, wenn Sie die Werte getrennt:

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

Sitzungsweites Timeout machen

In der gesamten Dokumentation gesucht und es scheint, dass es nicht möglich ist zeitüberschreitung parameter sitzungsweit

Aber es gibt ein geöffnetes GitHub-Problem (Erwägen Sie, die Option Timeout erforderlich zu machen oder eine Voreinstellung zu haben), das eine Abhilfe bietet, die HTTPAdapterSie wie folgt verwenden können:

id="vor-2"
Beantwortet am 27/05/2020 um 15:18
quelle vom benutzer

stimmen
0

Ich bin mir nicht sicher, ob dies der richtige Weg ist, da ich die Verwendung von timeoutin dieser Dokumentation nicht finden konnte.

Blättern Sie bis zum Ende. Es ist definitiv da. Sie können auf der Seite danach suchen, indem Sie Strg F drücken und timeout.

Sie verwenden es timeoutkorrekt in Ihrem Code-Beispiel.

Sie können das Timeout tatsächlich auf verschiedene Weise angeben, wie in der Dokumentation erklärt wird:

Wenn Sie einen einzelnen Wert für das Timeout angeben, etwa so

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

Der Timeout-Wert wird sowohl auf das readTimeout als connectauch auf die Zeitüberschreitung angewendet. Geben Sie ein Tupel an, wenn Sie die Werte getrennt einstellen möchten:

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

Wenn der Remote-Server sehr langsam ist, können Sie Anfragen anweisen, ewig auf eine Antwort zu warten, indem Sie None als Timeout-Wert übergeben und dann eine Tasse Kaffee abrufen.

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

Versuchen Sie es mit https://httpstat.us/200?sleep=5000 um Ihren Code zu testen.

Dies löst zum Beispiel eine Ausnahme aus, weil 0,2 Sekunden nicht ausreichen, um eine Verbindung mit dem Server herzustellen:

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)

Ausgabe:

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

Dies löst eine Ausnahme aus, da der Server 5 Sekunden wartet, bevor er die Antwort sendet, was länger als die eingestellte readZeitüberschreitung von 2 Sekunden ist:

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)

Ausgabe:

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

Sie erwähnen ausdrücklich die Verwendung einer Zeitüberschreitung innerhalb einer Sitzung. Vielleicht möchten Sie also ein Session-Objekt, das ein Standard-Timeout hat. Etwas in dieser Art:

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)

Ausgabe:

id="vor-5"
Beantwortet am 27/05/2020 um 15:50
quelle vom benutzer

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