Skript Chrome URL-Aufruf automatisieren

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
chris3107
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 17:33

Hallo,

ich bin neu hier im Forum, da ich mit einem Skript ein wenig ratlos bin.
Folgenden Fall möchte ich mit einem Python Skript auf meinem Raspberry Pi4 lösen:

1) Löschen einer XML Datei
2) Download einer neuen XML Datei durch Browseraufruf einer URL:
3) Dies beiden Skripte sollen täglich automatisch ausgeführt werden:
---
---
1)Das Löschen der Datei habe ich mit folgendem Skript gelöst;
import os
os.remove("/home/share/public/file.xml")
Das tägliche Ausführen über einen Eintrag in crontab klappt auch super.

2) Ich habe selenium sowie den Chrome Webdriver installiert und folgendes Skript geschrieben:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
driver = webdriver.Chrome()
driver.get("http://...")

Der Aufruf des Skriptes in einer VNC Session auf dem PI klappt super. Es öffnet sich Chromium und der Link wird. aufgerufen.

Wenn ich das Skript automatisch über crontab starten will passiert nichts und ich bekomme folgende Message in /var/mail

From: root@raspberrypi (Cron Daemon)
To: pi@raspberrypi
Subject: Cron <pi@pi> /usr/bin/python3 /home/pi/Downloads/scripts/loadepg.py
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/pi>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=pi>
Message-Id: <E1n6uwx-0000MO-Ie@pi>
Date: Mon, 10 Jan 2022 14:43:03 +0100

Traceback (most recent call last):
File "/home/pi/Downloads/scripts/loadxml.py", line 13, in <module>
driver = webdriver.Chrome()
File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
service_log_path, service, keep_alive)
File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/chromium/webdriver.py", line 99, in __init__
options=options)
File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 268, in __init__
self.start_session(capabilities, browser_profile)
File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 359, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 424, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/chromium-browser is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Stacktrace:
#0 0x000000a4a618 <unknown>
#1 0x0000007b09f4 <unknown>
#2 0x0000007d2814 <unknown>
#3 0x0000007cec04 <unknown>
#4 0x00000080528c <unknown>
#5 0x0000007ffa14 <unknown>
#6 0x0000007d8478 <unknown>
#7 0x0000007d93a4 <unknown>
#8 0x000000a77944 <unknown>
#9 0x000000a8990c <unknown>
#10 0x000000a89550 <unknown>
#11 0x000000a8ad40 <unknown>
#12 0x000000a78944 <unknown>
#13 0x000000a8afec <unknown>
#14 0x000000a6f3ac <unknown>
#15 0x000000aa26e8 <unknown>
#16 0x000000aa2858 <unknown>
#17 0x000000abcf4c <unknown>
#18 0x0000b6f27494 start_thread
#19 0x000000000000 <unknown>

Kann mir vielleicht jemand weiterhelfen? Wie kann ich diesen Chrome-Aufruf automatisieren. Mein PI läuft 24x7 und somit ist auch die grafische Umgebung dauerhaft aktiv.

Gruß
Chris
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso Selenium? Eine XML-Datei runterzuladen ist eher ungewoehnlich (via Browser), reicht dafuer nicht requests?
chris3107
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 17:33

Wie meinst du das? Über einen wget Befehl klappt das leider nicht, da est beim Aufruf des Browsers die Datei geladen wird. Die URL hat keine .XML Endung und ein User/pw werden in der URL mitgegeben
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das macht es schwieriger. Es wäre trotzdem ggf hilfreich mit requests zu arbeiten, also einloggen etc. Hängt davon ab, wieviel JavaScript involviert ist.
chris3107
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 17:33

Vielen Dank,

Könntest du mir vielleicht eine Hilfe geben wie ich das tun könnte. Bin noch neu in Python
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Es gibt da kein pauschales Rezept.
Du musst dir über die Entwickerltools des Browsers anschauen, was da an Requests gemacht wird und die nachbilden.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie man eine Datei heruntetlädt, kommt darauf an, wie die Seite funktioniert. Um welche Seite handelt es sich denn?
Es ist kaum vorstellbar, dass ein Service, der es erlaubt XML-Dateien herunterzuladen, keine Möglichkeit vorsieht, das automatisiert zu machen.
chris3107
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 17:33

Ich habe es mit einem shell Skript hinbekommen. Dieses lasse ich mit einer Sleep-Schleife jeden Tag laufen und starte es aus der grafischen Oberfläche
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Das mit der Schleife klingt etwas seltsam. Was spricht denn hier gegen ein Cron-Job, so, wie bei dem Python-Skript?
chris3107
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 17:33

Wenn ich das Skript als conjob laufen lasse erhalte ich immer den Fehler den ich in meinem ersten Post beschrieben habe. Ich muss also das Skript aktiv als Benutzer in der grafischen Oberfläche aus dem Terminal starten. Ich sehe dann ja wie sich der Chrome Browser öffnet und der Link aufgerufen wird.
Ich bin gerne über Hinweise dankbar wie ich es anderweitig lösen könnte. Gibt es denn ein grafisches Tool mit dem ich Skripte einplanen kann?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Stichwort ist "Headerless Chrome", aber wir bezweifeln hier immer noch, dass Selenium überhaupt nötig ist.
chris3107
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 17:33

Vielen Dank. Ist die Headerless-Option so richtig?
---
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
driver = webdriver.Chrome()
driver.get("http://...")
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du es ausprobiert und es hat funktioniert?
chris3107
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 17:33

Leider nein, Chrome wird trotz dem Argument "chrome_options.add_argument("--headless")" geöffnet
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Wo genau verwendest du die Options eigentlich, die du alle zusammenträgst?
Ich habe mit Selenium noch nicht gearbeitet, aber es kommt mir sehr seltsam vor, dass man die einfach alle in ein Objekt tut und das Objekt dann nicht verwendet.

Noch komischer kommt mir allerdings vor - wie bereits hier im Thread mehrfach erwähnt -, dass Selenium überhaupt nötig ist. Aber da du Hilfe eher selektiv annimmst, wirst du wohl deine Gründe haben.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann ist es ja nicht richtig gewesen. Die Frage also doch schon beantwortet. Ich verstehe nicht, wieso man das so handhabt. Statt dann eine Frage zu stellen, deren Antwort man nicht kennt. Apropos Antwort: was sparrow sagt.
chris3107
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 17:33

Ich bin kompletter Neuling in Python und bin durch meine Anforderung auf diese Möglichkeit aufmerksam geworden.
Hier mein aktueller Code
Über Hinweise wie ich es besser machen könnte bin ich sehr dankbar

# -*- coding: utf-8 -*-
"""
Spyder Editor

Dies ist eine temporäre Skriptdatei.
"""

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--remote-debugging-port=9222")
driver = webdriver.Chrome('/usr/bin/chromedriver')
driver.get("http://.....")
time.sleep(90)
driver.close()
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Du musst die gesetzten Optionen schon dem driver mitgeben (mit dem Keyword-Argument `options`).

Code: Alles auswählen

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--remote-debugging-port=9222")
driver = webdriver.Chrome('/usr/bin/chromedriver', options=chrome_options)
Aber so lange du nicht verrätst um welche Seite es sich handelt, kann man hier auch nicht weiter helfen. Wie die Vorposter hier schon geschrieben haben, ist davon auszugehen, dass Selenium und dein Konstrukt zum Starten des Pythonprogrammes gar nicht erforderlich sind.
chris3107
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 17:33

Vielen Dank. Ich kann euch die Seite nicht nennen. Es ist die Seite von meinem IPTV-Provider bei dem Password und Username im Link mitgegeben wird.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was hat denn die Seite mit dem Zugang zu tun? Niemand hat gesagt, dass du die Zugangsdaten hier abliefern sollst. Und selbst wenn man ohne Zugang nur beschränkt weit kommt, kann man ja durch zb den Quelltext schon viel erfahren. Erst recht, wenn der von dir ggf für zb die Seite nach dem Login geliefert wird.
Antworten