İstek gönderirken oturumda zaman aşımı kullanmanın doğru yolu

oy
44

Nasıl kullanabileceğimi öğrenmeye çalışıyorum timeout istekleri gönderilirken oturum içinde. Aşağıda denediğim şekilde bir web sayfasının içeriğini getirebilir, ancak bunun kullanımını bulamadığım için bunun doğru yol olduğundan emin değilim timeout bu dokümanda .

import requests

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

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

Oturumda zaman aşımını nasıl kullanabilirim?

Oluştur 23/05/2020 saat 17:15
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

Belgelere Göre - Hızlı Başlangıç .

Zaman aşımı parametresi ile belirli bir saniye sonra yanıt beklemeyi bırakmasını söyleyebilirsiniz. Neredeyse tüm üretim kodları bu parametreyi neredeyse tüm taleplerde kullanmalıdır.

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

Veya Documentation Advanced Usage'dan 2 değer ayarlayabilirsiniz ( bağlantı ve okuma zaman aşımı)

Zaman aşımı değeri hem bağlantıya hem de okuma zaman aşımlarına uygulanır. Değerleri ayrı ayrı ayarlamak istiyorsanız bir demet belirtin:

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

Oturum Geniş Zaman Aşımı Yapma

Belgelerde arama yapılır ve dikişler, zaman aşımı parametresi oturumunu geniş olarak ayarlamak mümkün değildir.

Ama bir var Açıldı GitHub Sayı (Zaman aşımı seçeneği gerekli veya varsayılan sahip yapmayı düşünün) hangi bir geçici çözüm sağlanır bir şekilde HTTPAdapter şöyle kullanabilirsiniz:

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(...) # ...
Cevap 27/05/2020 saat 15:18
kaynak kullanıcı

oy
0

Kullanım şeklini bulamadığım için bunun doğru yol olduğundan emin değilim timeout bu dokümanda .

En alta kaydırın. Kesinlikle orada. Ctrl F tuşuna basıp şunu girerek sayfada arayabilirsiniz. timeout .

Kullanıyorsun timeout kod örneğinizde doğru şekilde.

Zaman aşımını, dokümanlarda açıklandığı gibi, birkaç farklı şekilde belirleyebilirsiniz:

Zaman aşımı için tek bir değer belirtirseniz, şöyle:

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

Zaman aşımı değeri, connect ve read zaman aşımları. Değerleri ayrı ayrı ayarlamak istiyorsanız bir demet belirtin:

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

Uzak sunucu çok yavaşsa, Hiçbir zaman aşımı değeri olarak Hiçbiri'ni geçip bir fincan kahve alarak İsteklere sonsuza kadar beklemesini söyleyebilirsiniz.

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

Kullanmayı deneyin https://httpstat.us/200?sleep=5000 kodunuzu test etmek için.

Örneğin, 0.2 saniye sunucuyla bağlantı kurmak için yeterince uzun olmadığından bu bir istisna oluşturur:

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)

Çıktı:

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

Sunucu bir yanıt göndermeden önce 2 saniyeden daha uzun süre beklediğinden, bu durum bir istisna oluşturur. read zaman aşımı seti:

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)

Çıktı:

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

Özellikle bir oturumda zaman aşımı kullandığınızdan bahsediyorsunuz. Belki de varsayılan zaman aşımı olan bir oturum nesnesi istersiniz. Bunun gibi bir şey:

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)

Çıktı:

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]>
Cevap 27/05/2020 saat 15:50
kaynak kullanıcı

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