Az időtúllépés helyes módja a munkameneten belüli kérések küldésekor

szavazat
44

Megpróbálom megtanulni, hogyan tudom használni timeout a munkameneten belül kérések küldése közben. Az alábbiak szerint próbáltam beolvasni egy weboldal tartalmát, de nem vagyok biztos abban, hogy ez a helyes út, mivel nem találtam a timeout ebben a dokumentációban .

import requests

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

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

Hogyan használhatom az időtúllépést a munkameneten belül?

A kérdést 23/05/2020 17:15
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
0

A Dokumentáció - Gyors indítás szerint .

Megmondhatja a kérelmeknek, hogy egy adott másodperc elteltével várakozással várjanak a választ, az időtúllépési paraméterrel. Szinte az összes termelési kódnak ezt a paramétert kell használnia szinte minden kérésben.

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

Vagy a Speciális dokumentáció használatából állíthat be 2 értéket ( csatlakoztatás és olvasási időkorlát)

Az időtúllépési értéket mind a csatlakozás , mind az olvasás időkorlátjaira alkalmazni kell. Adjon meg egy párosítást, ha az értékeket külön szeretné beállítani:

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

A munkamenet széles időkorlátja

A dokumentációban keresve és rávarrva, nem lehetséges széles időt beállítani az időtúllépési paraméter munkamenetre.

Van még egy GitHub-probléma is megnyitva ( fontolja meg az Időtúllépés opció megadását, vagy legyen alapértelmezés ), amely megoldást kínál egy HTTPAdapter használhatja így:

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(...) # ...
Válaszolt 27/05/2020 15:18
a forrás felhasználó

szavazat
0

Nem vagyok biztos benne, hogy ez a helyes út, mert nem találtam a timeout ebben a dokumentációban .

Görgessen az aljára. Minden bizonnyal ott van. Az oldalon megkeresheti a Ctrl F billentyű lenyomásával és beírásával timeout .

Ön használ timeout helyesen a kódpéldában.

A dokumentációban leírtak szerint az időtúllépést néhány különböző módon is megadhatja:

Ha az időkorláthoz egyetlen értéket ad meg, így:

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

Az időtúllépési értéket mindkét értékre alkalmazni kell connect és a read időtúllépés. Adjon meg egy párosítást, ha az értékeket külön szeretné beállítani:

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

Ha a távoli kiszolgáló nagyon lassú, akkor mondhatja a Kéréseknek, hogy örökké várjanak a választ, ha a Időtúllépési értékként megadja a Nincs értéket, majd egy csésze kávét tölt be.

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

Próbálja ki https://httpstat.us/200?sleep=5000 hogy tesztelje a kódját.

Például ez kivételt vet fel, mert a 0,2 másodperc nem elég hosszú ahhoz, hogy kapcsolatot létesítsen a szerverrel:

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)

Kimenet:

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

Ez kivételt vet fel, mert a szerver 5 másodpercet vár, mielőtt elküldi a választ, amely hosszabb, mint a 2 másodperc read időkorlát beállítása:

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)

Kimenet:

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

Külön említi az időkorlát használatát egy munkameneten belül. Tehát talán egy olyan munkamenet-objektumot szeretne, amelynek alapértelmezett időkorlátja van. Valami ilyesmi:

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)

Kimenet:

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]>
Válaszolt 27/05/2020 15:50
a forrás felhasználó

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