Headless Chrome mit Python wird beim Versuch, eine Datei herunterzuladen, ausgesetzt

8

Ich benutze Python, Jupyter, Selenium webdriver und Headless Chrome (mit Canary) auf Mac.

Ich habe ein Skript geschrieben, das eine sehr alte Website scrappt, Um eine Datei von dieser Website herunterladen zu können, muss ich auf einige Schaltflächen klicken, die mich schließlich zu einer Schaltfläche führen, die nach dem Anklicken eine CSV-Datei herunterlädt

Das Problem ist, dass wenn chrome chrome versucht, die Zieldatei herunterzuladen, sie aussetzt und nichts tut (dh die benötigte Datei nicht herunterlädt), obwohl das Skript beendet wurde (und ja, ich habe es am Ende des Skripts geschlossen) )

Ich habe es versucht:

  • Das Herunterladen anderer Dateien (von verschiedenen Websites) und Headless Chrome scheint sie ohne Probleme herunterzuladen (Ich habe die Option chrome chrome aktiviert, um Dateien erfolgreich herunterzuladen)
  • Machen Sie Schnappschüsse von den Websites, um sicherzustellen, dass sie korrekt zur Download-Seite navigieren (und ja, die Navigation ist korrekt)
  • Ändern des Benutzeragenten (er scheint den Benutzeragenten zu verwenden, von dem ich es erwarte)
  • Ausführen des gleichen Codes ohne die Option ohne Kopf - es lädt die Datei erfolgreich mit regulärem Chrome
  • herunter
  • Ändern von Plugins und Sprachen JS Skript auf dem Treiber mit driver.execute_script(js_that_changes_plugins_and_langs) , aber ich bin mir nicht ganz sicher, wie man überprüft, ob es tatsächlich ausgeführt wird oder nicht (und es immer noch nicht funktioniert)

Probleme, denen ich gegenüberstehe:

  • Ich kann keinen Weg finden, nur die letzte Download-URL zu erhalten, da sie anscheinend einige eindeutige IDs verwendet, die während der Fahrt generiert werden (sie wird angegeben, wenn Sie zur Startseite wechseln und wenn Sie zwischen Seiten auf der Site navigieren) Für jede Sitzung wird sich das ändern
  • Die Navigations-URLs scheinen von iframes in der Homepage (und auch in den folgenden URLs) zu stammen und ich bin mir nicht ganz sicher, wie ich das Javascript, das generiert wird
  • , überprüfe

Ich habe kein Problem mit der URL der Website, aber:

  • Sie müssen ~ 6 Klicks auf verschiedenen Seiten durchgehen, um mit dem Download-Button zur letzten Seite zu gelangen. Diese Klicks sind nicht intuitiv und es wird viel Zeit benötigen, um zu erklären, wie man dorthin navigieren soll, wo ich möchte
  • Diese Seite ist nicht auf Englisch, was es noch schwieriger macht zu erklären, wie man
  • navigiert

Ich brauche es kopflos im Gegensatz zu normalem Chrom, da die Maschine, auf der wir den Code ausführen wollen, sehr schwach ist und die Chrome-GUI nicht ausführen kann

Meine Frage ist also: Weiß jemand, was das Problem sein könnte? oder zumindest, wie kann ich es debuggen?

Das ist mehr oder weniger der Code, den ich verwende:

%Vor%

Danke für die Hilfe

    
Gideon 05.02.2018, 19:56
quelle

3 Antworten

0

Ich denke, dass es hier zu viele bewegliche Teile gibt. Wenn Sie wirklich Selen brauchen, und alle anderen - nun - das ist in Ordnung. Ich würde jedoch mit etwas so einfach wie möglich beginnen.

In Python 2.7 verwendete ich mechanize - so konnte ich die gesamte Kommunikation mit dem Server nachahmen. Heute ist das nicht die beste Option, da python 3.X der richtige Weg ist. Ich werde beschreiben, wie ich mit dieser Art von Problemen gearbeitet habe. Nur um Ihnen ein besseres Bild zu geben, und dann werde ich versuchen, mögliche Werkzeuge zu beschreiben.

Ein typischer Fall war das Login, gehen Sie über die Seite, schalten Sie einige Switches ein und lösen Sie den Download aus oder rufen Sie Inhalte ab und bearbeiten Sie sie mit schöne Suppe . Um zu beginnen, müssen Sie sehen, welche Informationen ausgetauscht werden. Gehen Sie in Ihrem Webbrowser zu den Entwicklungstools und wählen Sie die Registerkarte Netzwerk. Vielleicht weißt du das, aber dieser Schritt ist obligatorisch, und ich werde eine allgemeine Antwort schreiben. Dann mache deine normale Arbeit - logge dich einfach ein und mache andere Schritte. Alle Dinge, die der Server erledigt, müssen übertragen werden, damit Sie sie als Netzwerkanforderungen sehen können. Mechanize war gut, da ich dict vorbereiten konnte und es als post -Anforderung an die Seite gesendet habe. Schreiben über post - typischer Fehler ist das Posten auf der Seitenadresse . Wenn Sie also index.html besucht haben, tun Sie post auf dieser Seite, während der Server erwartet, dass er an add_user_data.html gesendet wird, und danach werden Sie umgeleitet. Dinge wie Sitzungs-ID, können durch Header-Eintrag oder Cookie unterstützt werden - schauen Sie sich einfach die Netzwerkkommunikation für das Muster an.

Wie ich geschrieben habe, wird Python 2.7 eingestellt. Mechanize ist für Python 3.x nicht verfügbar, daher sollten andere Tools verwendet werden. Sie können nach alternativen Alternativen suchen und schauen, was für Sie in Ordnung ist. Eine typische Antwort ist scrapy . Das ist ein etwas anderes Tool, das mehr zum Verschrotten von Webseiten verwendet wird. Also, wenn Sie etwas Größeres planen, ist das vielleicht die beste Option. Wenn Sie ein einzelnes Skript benötigen, würde ich mit Ссылка beginnen. Kommandozeilen-Tool / Python-Paket, gute OSX-Unterstützung, können Sie Formular senden , Michał Zaborowski 17.02.2018 15:11

quelle
0

Da Sie nicht die URL angeben, von der Sie die Ratespiele heruntergeladen haben. Ziel hat am wahrscheinlichsten eine recaptaähnliche Wand installiert, um Kratzen zu verhindern. Seien Sie also sicher, dass Sie diese "Recapta" -Wand nicht treffen und wenn Sie Code implementieren, der Sie benachrichtigt, eine manuelle Aufgabe zum Erteilen des Zugriffs auszuführen.

Für js wurde diese Lösung von zavodnyuk hier angegeben:

  

Versuchen Sie, einen benutzerdefinierten User-Agent mit einem kompatiblen (z. B. von Ihrem echten Browser) zu konfigurieren.   Fähigkeiten: {'browserName': 'chrome', chromeOptions: {args: ["user-agent = Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, wie Gecko) Chrome / 60.0.3112.113 Safari / 537.36", "--headless", "--disable-gpu"]} arbeitete für Selen / Winkelmesser auf js

Ich hoffe, dass dies Sie in die richtige Richtung weist, da es im Internet nicht viel über Python gibt.

BEARBEITEN basierend auf comment1:

Im grundlegenden Debugging-Modus verlasse ich mich auf Druckanweisungen zu Beginn der möglichen Kandidaten-Defs. Wo ich eine Druckanweisung sage, kann es auch eine Schreiblinie sein. Ich verlasse mich nicht auf Pakete von Drittanbietern, da ich meistens aus dem Code lernen möchte und dann zeitaufwendig ist, aber die Mühe wert ist, Zeit zu investieren. Zum Beispiel wie ich unverblümt debugge:

%Vor%     
ZF007 14.02.2018 12:42
quelle
0

Ohne spezifische Informationen sieht es so aus, als ob die einzigen Ratschläge, die wir Ihnen geben können, irgendwie damit zu tun haben, wie Sie verstehen können, was vor sich geht.

Wie wäre es, wenn Sie manuell im headed-Modus zu Debugging-Zwecken fortfahren? Die Wette hier ist, dass Ihr Problem in der Tatsache liegt, Ihre Aufgabe zu automatisieren, anstatt kopflos zu sein.

Führen Sie Ihr Skript mit all Ihren Import- und Funktionsdefinitionen aus (z. B. enable_download_in_headless_chrome ) und verwenden Sie keines davon. Wirklich, tue dies bis download_dir = # some path here und dann in der Python-Shell

%Vor%

Interagieren Sie jetzt manuell mit Ihrem Browser und öffnen Sie die Chrome DevTools und gehen Sie zu den Konsole . Stellen Sie sicher, dass die Fehler angezeigt werden . Lass uns weitermachen und den Rest deiner Befehle eingeben

%Vor%

Was sagt es?

    
Kanak 19.02.2018 18:28
quelle