Riktig måte å bruke tidsavbrudd i løpet av økten mens du sender forespørsler

stemmer
44

Jeg prøver å lære hvordan jeg kan bruke timeout innen økt mens du sender forespørsler. Slik jeg har prøvd nedenfor kan hente innholdet på en webside, men jeg er ikke sikker på at dette er riktig måte, siden jeg ikke kunne finne bruken av timeout i denne dokumentasjonen .

import requests

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

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

Hvordan kan jeg bruke timeout i løpet av økten?

Publisert på 23/05/2020 klokken 17:15
kilden bruker
På andre språk...                            


2 svar

stemmer
0

I følge dokumentasjonen - Quick Start .

Du kan be forespørsler om å slutte å vente på svar etter et gitt antall sekunder med tidsavbruddparameteren. Nesten all produksjonskode skal bruke denne parameteren i nesten alle forespørsler.

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

Eller fra dokumentasjonen Advanced Useage kan du stille inn 2 verdier ( koble til og lese tidsavbrudd)

Timeout-verdien blir brukt på både tilkoblings- og lese- timeoutene. Spesifiser en tuple hvis du vil angi verdiene separat:

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

Å gjøre økt økt timeout

Søk i hele dokumentasjonen, og det fins, det er ikke mulig å stille timeout- parameterøkt bredt.

Men det er et GitHub-problem som åpnes ( vurder å stille til timeout-alternativ eller ha en standard ) som gir en løsning som en HTTPAdapter du kan bruke slik:

class TimeoutHTTPAdapter(HTTPAdapter):
    def __init__(self, timeout, *args, **kwargs):
        self._timeout = timeout
        super().__init__(*args, **kwargs)

    def send(self, request, timeout=False, ...):
        if timeout is None:
            timeout = self._timeout
        return super().send(request, timeout=timeout, ...)

s = requests.Session() 
s.adapters['http://'] = TimeoutHTTPAdapter(0.01) # 0.01 seconds
...
s.get(...) # etc...
...
s.post(...) # ...
Svarte 27/05/2020 kl. 15:18
kilden bruker

stemmer
0

Jeg er ikke sikker på at dette er riktig måte, siden jeg ikke fant bruken av timeout i denne dokumentasjonen .

Bla til bunnen. Den er definitivt der. Du kan søke etter det på siden ved å trykke på Ctrl F og gå inn timeout .

Du bruker timeout riktig i kodeeksemplet.

Du kan faktisk spesifisere tidsavbrudd på noen få forskjellige måter, som forklart i dokumentasjonen :

Hvis du spesifiserer en enkelt verdi for tidsavbruddet, slik:

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

Timeout-verdien blir brukt på begge connect og read tidsavbrudd. Spesifiser en tuple hvis du vil angi verdiene separat:

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

Hvis den eksterne serveren er veldig treg, kan du be Requests om å vente for alltid på svar, ved å gi Ingen som en timeout-verdi og deretter hente en kopp kaffe.

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

Prøv å bruke https://httpstat.us/200?sleep=5000 for å teste koden din.

For eksempel gir dette et unntak fordi 0,2 sekunder ikke er lang nok til å opprette en forbindelse med serveren:

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)

Produksjon:

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

Dette gir et unntak fordi serveren venter i 5 sekunder før du sender svaret, som er lengre enn 2 sekunder read timeout satt:

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)

Produksjon:

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

Du nevner spesifikt å bruke en timeout i løpet av en økt. Så kanskje du vil ha et øktobjekt som har en standard timeout. Noe sånt som dette:

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)

Produksjon:

EnhancedSession request
HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=4)
EnhancedSession request
HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=1)
EnhancedSession request
<Response [200]>
Svarte 27/05/2020 kl. 15:50
kilden bruker

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