asyncio web scraping 101: holt mehrere urls mit aiohttp

8

In einer früheren Frage schlug einer der Autoren von aiohttp freundlicherweise vor, mehrere URLs mit aiohttp abzurufen , um die neuen% zu verwenden. co_de% Syntax von async with :

%Vor%

Wenn jedoch eine der Python 3.5 -Anforderungen bricht (wie oben wegen session.get(url) ), wird der Fehler nicht behandelt und die ganze Sache bricht ab.

Ich habe nach Möglichkeiten gesucht, Tests zum Ergebnis von http://SDFKHSKHGKLHSKLJHGSDFKSJH.com einzufügen, zum Beispiel nach Orten für ein session.get(url) oder nach einem try ... except ... , aber ich verstehe einfach nicht, wie man mit if response.status != 200: ,% arbeitet co_de% und die verschiedenen Objekte.

Da async with immer noch sehr neu ist, gibt es nicht viele Beispiele. Es wäre für viele Leute sehr hilfreich, wenn ein await -Assistent zeigen könnte, wie das geht. Nach all den ersten Dingen, die die meisten Leute mit async with testen wollen, ist es, mehrere Ressourcen gleichzeitig zu bekommen.

Ziel

Das Ziel ist, dass wir asyncio untersuchen können und schnell entweder:

sehen
  • Diese URL ist fehlgeschlagen (und warum: Statuscode, möglicherweise Name der Ausnahme) oder
  • Diese URL funktionierte, und hier ist ein nützliches Antwortobjekt
Hans Schindler 10.03.2016, 20:45
quelle

2 Antworten

9

Ich würde gather anstelle von wait verwenden, was kann Ausnahmen als Objekte zurückgeben, ohne sie zu erhöhen. Dann können Sie jedes Ergebnis überprüfen, wenn es sich um eine Ausnahme handelt.

%Vor%

Tests:

%Vor%     
kwarunek 10.03.2016, 22:27
quelle
4

Ich bin weit entfernt von einem asyncio-Experten, aber Sie möchten den Fehler abfangen, den Sie benötigen, um einen Socket-Fehler zu bekommen:

%Vor%

Ausführen des Codes und Drucken the_results :

%Vor%

Sie können sehen, dass wir den Fehler abfangen und die weiteren Aufrufe sind immer noch erfolgreich und geben den HTML-Code zurück.

Wir sollten wahrscheinlich einen OSError als socket.error abfangen. Ein veralteter Alias ​​von OSError seit Python 3.3:

%Vor%

Wenn Sie auch überprüfen möchten, ob die Antwort 200 ist, setzen Sie Ihre if in den Versuch, und Sie können das reason-Attribut verwenden, um weitere Informationen zu erhalten:

%Vor%     
Padraic Cunningham 10.03.2016 21:26
quelle