Mod corect de a utiliza intervalul de timp în sesiune în timp ce trimiteți cereri

voturi
44

Încerc să învăț cum pot folosi timeout în timpul sesiunii în timp ce trimiteți cereri. Modul în care am încercat mai jos poate prelua conținutul unei pagini web, dar nu sunt sigur că acesta este modul corect, deoarece nu am găsit utilizarea timeout în această documentație .

import requests

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

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

Cum pot folosi durata de timp în sesiune?

Întrebat 23/05/2020 la 17:15
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
0

Conform documentației - Pornire rapidă .

Puteți spune solicitări să nu mai aștepte un răspuns după un anumit număr de secunde cu parametrul timeout. Aproape tot codul de producție ar trebui să utilizeze acest parametru în aproape toate solicitările.

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

Sau din Documentația avansată de utilizare puteți seta 2 valori ( conectați și citiți timpul de expirare)

Valoarea de expirare va fi aplicată atât la conectarea cât și la expirile de citire . Specificați o tuple dacă doriți să setați valorile separat:

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

Efectuarea sesiunii într-un interval de timp larg

Căutată în toată documentația și se croiește, nu este posibilă setarea parametrilor de timeout pe larg.

Există însă o problemă GitHub deschisă ( consideră că este necesară opțiunea Timeout necesară sau are o valoare implicită ) care furnizează o soluție de rezolvare ca HTTPAdapter puteți folosi astfel:

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(...) # ...
Publicat 27/05/2020 la 15:18
sursa de către utilizator

voturi
0

Nu sunt sigur că acesta este modul corect, deoarece nu am găsit utilizarea timeout în această documentație .

Parcurgeți partea de jos. Cu siguranță este acolo. O puteți căuta în pagină apăsând Ctrl F și introducând timeout .

Folosești timeout corect în exemplul dvs. de cod.

De fapt, puteți specifica expirarea în câteva moduri diferite, așa cum este explicat în documentație :

Dacă specificați o singură valoare pentru intervalul de timp, astfel:

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

Valoarea timeout va fi aplicată atât pentru connect si read time-out. Specificați o tuple dacă doriți să setați valorile separat:

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

Dacă serverul de la distanță este foarte lent, puteți spune Solicităților să aștepte pentru totdeauna un răspuns, trecând Nimeni ca valoare de timp și apoi preluând o ceașcă de cafea.

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

Încercați să utilizați https://httpstat.us/200?sleep=5000 pentru a vă testa codul.

De exemplu, aceasta ridică o excepție, deoarece 0,2 secunde nu este suficient de lungă pentru a stabili o conexiune cu serverul:

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)

ieşire:

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

Aceasta ridică o excepție, deoarece serverul așteaptă 5 secunde înainte de a trimite răspunsul, care este mai lung decât cele 2 secunde read setare de timp:

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)

ieşire:

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

Menționați în mod special utilizarea unui interval de timp în cadrul unei sesiuni. Deci, poate doriți un obiect de sesiune care are un interval de timp implicit. Ceva de genul:

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)

ieşire:

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]>
Publicat 27/05/2020 la 15:50
sursa de către utilizator

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