Zeitüberschreitung für Python-Anfragen. Gesamte Antwort abrufen

168

Ich sammle Statistiken auf einer Liste von Websites und verwende der Einfachheit halber Anfragen dafür. Hier ist mein Code:

data=[]
websites=['http://google.com', 'http://bbc.co.uk']
for w in websites:
    r= requests.get(w, verify=False)
    data.append( (r.url, len(r.content), r.elapsed.total_seconds(), str([(l.status_code, l.url) for l in r.history]), str(r.headers.items()), str(r.cookies.items())) )

Jetzt möchte ich requests.getnach 10 Sekunden eine Zeitüberschreitung feststellen, damit die Schleife nicht hängen bleibt.

Diese Frage ist von Interesse gewesen , bevor auch , aber keine der Antworten ist sauber. Ich werde etwas Kopfgeld darauf setzen, um eine nette Antwort zu bekommen.

Ich höre, dass es vielleicht eine gute Idee ist, keine Anfragen zu verwenden, aber wie soll ich dann die netten Angebote für Anfragen erhalten? (die im Tupel)

Kiarash
quelle
1
Was für eine Antwort suchen Sie? (oder mit anderen Worten, warum sind die aktuellen Antworten nicht genug für Sie?)
Yuvi
Wir sind in der Gnadenfrist des Kopfgeldes. Zeit, eine Antwort zu wählen?
Totokaka
Ich entscheide mich immer noch zwischen der Eventlet-Lösung und den Signalen. Ich werde die Frage bis heute Abend vergeben.
Kiarash

Antworten:

138

Was ist mit Eventlet? Wenn Sie die Anforderung nach 10 Sekunden überschreiten möchten, auch wenn Daten empfangen werden, funktioniert dieses Snippet für Sie:

import requests
import eventlet
eventlet.monkey_patch()

with eventlet.Timeout(10):
    requests.get("http://ipv4.download.thinkbroadband.com/1GB.zip", verify=False)
Alvaro
quelle
114
Das ist sicherlich unnötig kompliziert.
Holdenweb
7
Danke dir. Ich verstehe jetzt die technische Überlegenheit Ihrer Lösung (die Sie zu Beginn Ihrer Antwort ziemlich prägnant angegeben haben) und habe sie positiv bewertet. Das Problem mit Modulen von Drittanbietern besteht nicht darin, sie zu importieren, sondern sicherzustellen, dass sie importiert werden können. Daher bevorzuge ich die Verwendung der Standardbibliothek, sofern dies möglich ist.
Holdenweb
9
Ist eventlet.monkey_patch()erforderlich?
Benutzer
3
Ja, das socketModul muss mit Affen gepatcht sein, also brauchst du wenigstens eineneventlet.monkey_patch(socket=True)
Alvaro
51
Ab 2018 ist diese Antwort veraltet. Verwenden Sierequests.get('https://github.com', timeout=5)
CONvid19