Juiste manier om timeout te gebruiken binnen de sessie tijdens het verzenden van verzoeken

stemmen
39

Ik probeer te leren hoe ik timeoutbinnen een sessie gebruik kan maken van verzoeken. De manier waarop ik hieronder heb geprobeerd kan de inhoud van een webpagina ophalen, maar ik ben er niet zeker van dat dit de juiste manier is omdat ik het gebruik ervan timeoutniet kon vinden in deze documentatie.

import requests

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

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

Hoe kan ik een time-out gebruiken binnen de sessie?

De vraag is gesteld op 23/05/2020 om 17:15
bron van user
In andere talen...                            


2 antwoorden

stemmen
0

Volgens de Documentatie - Quick Start

U kunt verzoeken om te stoppen met het wachten op een antwoord na een bepaalde aantal seconden met de time-outparameter. Vrijwel alle productiecodes zouden deze parameter in bijna alle aanvragen moeten gebruiken.

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

Of vanuit de Documentatie Geavanceerd Gebruik kunt u 2 waarden instellen (verbind en lees time-out)

De time-out waarde wordt toegepast op zowel de connect en de lees time-outs. Geef een tupel op als u de waarden wilt instellen apart:

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

Sessiebrede time-out maken

Door de hele documentatie heen gezocht en het lijkt erop dat het niet mogelijk is om time-out parameter sessie breed

Maar er is een GitHub Issue Opened (Overweeg het maken van Timeout optie vereist of heb een standaard) die een workaround biedt als een HTTPAdapteru kunt gebruiken als deze:

id="pre-2"
antwoordde op 27/05/2020 om 15:18
bron van user

stemmen
0

Ik weet niet zeker of dit de juiste manier is, omdat ik het gebruik ervan timeoutniet kon vinden in deze documentatie.

Scroll naar beneden. Het is er zeker. U kunt het zoeken in de pagina door op Ctrl F te drukken en in te voerentimeout.

U gebruikt het timeoutcorrect in uw codevoorbeeld.

U kunt de time-out op een paar verschillende manieren specificeren, zoals uitgelegd in de documentatie:

Als u een enkele waarde voor de time-out opgeeft, zoals dit:

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

De time-out waarde wordt toegepast op zowel de connectals de readtime-outs. Geef een tupel op als u de waarden apart wilt instellen:

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

Als de remote server erg traag is, kunt u Requests vertellen dat ze eeuwig moeten wachten op een antwoord, door Geen als time-outwaarde te geven en dan een kopje koffie op te halen.

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

Probeer het gebruik van https://httpstat.us/200?sleep=5000 om je code te testen.

Dit verhoogt bijvoorbeeld een uitzondering omdat 0,2 seconden niet lang genoeg is om een verbinding met de server tot stand te brengen:

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)

Uitgang:

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

Dit maakt een uitzondering omdat de server 5 seconden wacht op het versturen van het antwoord, wat langer is dan de ingestelde timeout van 2 secondenread:

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)

Uitgang:

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

U vermeldt specifiek het gebruik van een time-out binnen een sessie. Dus misschien wilt u een sessieobject dat een standaard time-out heeft. Zoiets als dit:

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)

Uitgang:

id="pre-5"
antwoordde op 27/05/2020 om 15:50
bron van user

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