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:
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 habe kein Problem mit der URL der Website, aber:
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
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
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%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
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?
Tags und Links python python-3.x selenium-webdriver google-chrome-headless