Ο σωστός τρόπος για να χρησιμοποιήσετε το χρονικό όριο εντός της περιόδου σύνδεσης κατά την αποστολή αιτημάτων

ψήφοι
24

Προσπαθώ να μάθω πώς μπορώ να χρησιμοποιήσω 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 που έχει ανοίξει ( Σκεφτείτε να κάνετε την επιλογή Timeout απαιτείται ή να έχετε μια προεπιλογή ) που παρέχει μια λύση ως 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