Správný způsob využití časového limitu v relaci při odesílání požadavků

hlasů
44

Snažím se naučit, jak mohu použít timeout během relace při odesílání požadavků. Způsob, který jsem zkusil níže, může načíst obsah webové stránky, ale nejsem si jistý, zda je to správný způsob, protože jsem nemohl najít použití timeout v této dokumentaci .

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 mohu použít časový limit v relaci?

Položena 23/05/2020 v 17:15
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Podle dokumentace - Rychlý start .

Požadavkům můžete sdělit, aby přestali čekat na odpověď po daném počtu sekund s parametrem timeout. Téměř veškerý výrobní kód by měl tento parametr používat téměř ve všech požadavcích.

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

Nebo z pokročilého použití dokumentace můžete nastavit 2 hodnoty (časový limit připojení a čtení )

Hodnota časového limitu bude použita pro časový limit pro připojení i pro čtení . Pokud chcete hodnoty nastavit samostatně, zadejte n-tici:

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

Vypršení časového limitu relace

Prohledáno v dokumentaci a švy není možné nastavit relaci parametru časového limitu .

Existuje však problém s GitHubem ( Zvažte nutnost možnosti časového limitu nebo výchozí nastavení ), která poskytuje řešení jako HTTPAdapter můžete použít takto:

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(...) # ...
Odpovězeno 27/05/2020 v 15:18
zdroj uživatelem

hlasů
0

Nejsem si jistý, zda je to správná cesta, protože jsem nemohl najít použití timeout v této dokumentaci .

Přejděte dolů. Určitě je to tam. Můžete ji vyhledat na stránce stisknutím klávesy Ctrl F a zadáním timeout .

Používáte timeout správně v příkladu kódu.

Časový limit můžete určit několika různými způsoby, jak je vysvětleno v dokumentaci :

Pokud pro časový limit zadáte jednu hodnotu, postupujte takto:

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

Hodnota časového limitu bude použita u obou connect a read vypršení časového limitu. Pokud chcete hodnoty nastavit samostatně, zadejte n-tici:

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

Pokud je vzdálený server velmi pomalý, můžete požádat Žádosti, aby čekali na odpověď navždy, předáním Žádného jako hodnoty časového limitu a poté načtením šálku kávy.

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

Zkuste použít https://httpstat.us/200?sleep=5000 vyzkoušejte svůj kód.

To například vyvolává výjimku, protože 0,2 sekundy nestačí k navázání spojení se serverem:

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)

Výstup:

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

To vyvolává výjimku, protože server čeká 5 sekund před odesláním odpovědi, která je delší než 2 sekundy read nastavený časový limit:

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)

Výstup:

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

Konkrétně zmiňujete použití časového limitu v rámci relace. Takže možná budete chtít objekt relace, který má výchozí časový limit. Něco takového:

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)

Výstup:

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]>
Odpovězeno 27/05/2020 v 15:50
zdroj uživatelem

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