अनुरोध भेजते समय सत्र के भीतर टाइमआउट का उपयोग करने का सही तरीका

वोट
44

मैं सीखने की कोशिश कर रहा हूं कि मैं कैसे उपयोग कर सकता हूं timeout अनुरोध भेजते समय सत्र के भीतर। जिस तरह से मैंने नीचे कोशिश की है वह वेबपेज की सामग्री ला सकता है लेकिन मुझे यकीन नहीं है कि यह सही तरीका है क्योंकि मुझे इसका उपयोग नहीं मिला timeout इस प्रलेखन में

import requests

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

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

मैं सत्र के भीतर टाइमआउट का उपयोग कैसे कर सकता हूं?

23/05/2020 को 17:15
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
0

डॉक्यूमेंटेशन के अनुसार- क्विक स्टार्ट

आप टाइमआउट पैरामीटर के साथ दिए गए कुछ सेकंड के बाद प्रतिक्रिया के लिए प्रतीक्षा करना बंद करने का अनुरोध कर सकते हैं। लगभग सभी अनुरोधों में लगभग सभी उत्पादन कोड को इस पैरामीटर का उपयोग करना चाहिए।

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

या प्रलेखन उन्नत उपयोग से आप 2 मान सेट कर सकते हैं ( कनेक्ट करें और टाइमआउट पढ़ें )

टाइमआउट मान कनेक्ट और रीड टाइमआउट दोनों पर लागू होगा। यदि आप मानों को अलग से सेट करना चाहते हैं तो एक टपल निर्दिष्ट करें:

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

सेशन वाइड टाइमआउट

पूरे दस्तावेज में खोजा गया है और यह तेजी से टाइमआउट पैरामीटर सत्र को विस्तृत करना संभव नहीं है।

लेकिन एक GitHub इश्यू ओपन किया गया है ( टाइमआउट विकल्प बनाने की आवश्यकता पर विचार करें या डिफ़ॉल्ट है ) जो वर्कअराउंड के रूप में प्रदान करता है HTTPAdapter आप इस तरह का उपयोग कर सकते हैं:

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(...) # ...
27/05/2020 को 15:18
का स्रोत उपयोगकर्ता

वोट
0

मुझे यकीन नहीं है कि यह सही तरीका है क्योंकि मुझे इसका उपयोग नहीं मिला timeout इस प्रलेखन में

नीचे तक स्क्रॉल करें। यह निश्चित रूप से वहाँ है। आप इसे पृष्ठ में Ctrl F दबाकर और दर्ज करके खोज सकते हैं timeout

आप उपयोग कर रहे हैं timeout अपने कोड उदाहरण में सही ढंग से।

आप वास्तव में कुछ अलग तरीकों से टाइमआउट निर्दिष्ट कर सकते हैं, जैसा कि प्रलेखन में बताया गया है:

यदि आप टाइमआउट के लिए एक एकल मान निर्दिष्ट करते हैं, जैसे:

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

टाइमआउट मान दोनों पर लागू होगा connect और यह read समय समाप्ति। यदि आप मानों को अलग से सेट करना चाहते हैं तो एक टपल निर्दिष्ट करें:

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

यदि रिमोट सर्वर बहुत धीमा है, तो आप किसी प्रतिक्रिया को हमेशा के लिए प्रतीक्षा करने के लिए कह सकते हैं, टाइमआउट मान के रूप में और फिर एक कप कॉफी प्राप्त करके।

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

प्रयोग करके देखें https://httpstat.us/200?sleep=5000 अपने कोड का परीक्षण करने के लिए।

उदाहरण के लिए, यह एक अपवाद को जन्म देता है क्योंकि 0.2 सेकंड सर्वर के साथ संबंध स्थापित करने के लिए पर्याप्त लंबा नहीं है:

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)

आउटपुट:

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

यह एक अपवाद उठाता है क्योंकि सर्वर प्रतिक्रिया भेजने से पहले 5 सेकंड तक प्रतीक्षा करता है, जो 2 सेकंड से अधिक लंबा है read टाइमआउट सेट:

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)

आउटपुट:

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

आप विशेष रूप से एक सत्र के भीतर एक टाइमआउट का उपयोग करने का उल्लेख करते हैं। तो शायद आप एक सत्र वस्तु चाहते हैं जिसमें एक डिफ़ॉल्ट टाइमआउट है। कुछ इस तरह:

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)

आउटपुट:

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]>
27/05/2020 को 15:50
का स्रोत उपयोगकर्ता

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