Właściwy sposób wykorzystania limitu czasu w ramach sesji podczas wysyłania żądań

głosy
44

Staram się dowiedzieć, jak mogę wykorzystać timeoutsesję podczas wysyłania zapytań. Sposób, w jaki próbowałem poniżej, może przynieść zawartość strony internetowej, ale nie jestem pewien, czy jest to właściwy sposób, ponieważ nie mogłem znaleźć zastosowania timeoutw tej dokumentacji.

import requests

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

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

Jak mogę wykorzystać timeout w ramach sesji?

Utwórz 23/05/2020 o 17:15
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Zgodnie z Dokumentacją - Szybki start

Możesz powiedzieć Prośby, aby przestały czekać na odpowiedź po danym ilość sekund z parametrem timeout. Prawie cały kod produkcyjny powinien używać tego parametru w prawie wszystkich żądaniach.

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

Lub w Zaawansowanym użytkowaniu dokumentacji można ustawić 2 wartości (połącz i czytać limit czasu)

Wartość timeout zostanie zastosowana zarówno do połączyć i czytać timeout. Podaj tupel, jeśli chcesz ustawić wartości oddzielnie:

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

Szeroki limit czasu na sesję

Przeszukana w całej dokumentacji i zszywa się, nie można ustawić timeout parametr sesja szeroka

Istnieje jednak problem z GitHubem, który został otwarty (rozważ możliwość ustawienia opcji Timeout jako wymaganej lub domyślnej), która zapewnia obejście problemu w taki sposób, że HTTPAdaptermożna go użyć:

id="pre-2"
Odpowiedział 27/05/2020 o 15:18
źródło użytkownik

głosy
0

Nie jestem pewien, czy jest to właściwy sposób, ponieważ nie mogłem znaleźć jego zastosowania timeoutw tej dokumentacji.

Przewiń na dół. Na pewno tam jest. Możesz go znaleźć na stronie, naciskając Ctrl F i wpisując timeout.

Używasz timeoutpoprawnie w swoim przykładzie kodu.

Możesz faktycznie określić limit czasu na kilka różnych sposobów, jak wyjaśniono w dokumentacji:

Jeśli podasz jedną wartość dla timeoutu, to tak będzie:

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

Wartość timeoutu zostanie zastosowana zarówno do timeoutu jak connecti do readtimeoutu. Określ tuple, jeśli chcesz ustawić wartości oddzielnie:

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

Jeśli zdalny serwer jest bardzo wolny, możesz powiedzieć Requests, aby czekał wiecznie na odpowiedź, podając wartość None jako timeout, a następnie pobierając filiżankę kawy.

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

Spróbuj użyć https://httpstat.us/200?sleep=5000 aby przetestować swój kod.

Na przykład, to podnosi wyjątek, ponieważ 0.2 sekundy nie jest wystarczająco długie, aby nawiązać połączenie z serwerem:

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)

Wyjście:

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

Jest to wyjątek, ponieważ serwer odczekuje 5 sekund przed wysłaniem odpowiedzi, co jest dłuższe niż ustawiony 2 sekundowy readtimeout:

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)

Wyjście:

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

W szczególności wspominasz o użyciu timeoutu w ramach sesji. Więc może chcesz mieć obiekt sesji, który ma domyślny timeout. Coś w tym stylu:

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)

Wyjście: Wyjście:

id="pre-5"
Odpowiedział 27/05/2020 o 15:50
źródło użytkownik

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