Seite 1 von 1

Mit Funktion auf eine geöffnete Webseite zugreifen

Verfasst: Samstag 15. April 2023, 15:25
von robebo
Hallo,

ich will mehrere Webseiten scrapen um diese am Ende in einem Dataframe zusammenzufassen.
Dazu habe ich ein Programm geschrieben, dass auch läuft.
Jetzt möchte ich mir das umbauen und Funktionen aufrufen, die die jeweilige auszulesende Webseite auslesen.

Das Problem bei dem ich einfach nicht weiterkomme ist folgendes:

Ich rufe eine Funktion auf, die mir Selenium und eine Chromebrowserinstanz öffnet.
Das funktioniert.

Jetzt möchte ich in dem geöffneten Browserfenster die erste Webseite aufrufen um sie auszulesen.

Code: Alles auswählen

login_page_start()
Hier bekomme ich immer die Fehlermeldung
"NameError: name 'driver' is not defined"
Dabei habe ich in der ersten Funktion driver per "return driver" übergeben.

Was mache ich hier falsch? Wo ist mein Gedankenfehler?

Hier der Code (Maßgeblich ist der Windowsaufruf. Code ist vereinfacht auf den Aufruf von Google für die Problemlösung hier):

Code: Alles auswählen

### Webdriver aus Unterprogramm starten

from start_webdriver import webdriver_starten
webdriver_starten()

### Erste Seite aufrufen
### page öffnen
from page_login import login_page_start
login_page_start()

Code: Alles auswählen

def webdriver_starten():
    import os_auswahl
    osver = os_auswahl.osversion()
    print(osver)

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys

    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.support.ui import Select
    from selenium.webdriver.common.by import By
    from webdriver_manager.chrome import ChromeDriverManager

    from selenium.webdriver.common.by import By

    if osver == 'win32':  

        # Auswahl Windows

        options = webdriver.ChromeOptions()
        options.add_argument("--start-maximized")
        options.add_argument("--disable-extensions")
        options.add_experimental_option('detach', True)
        driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
        return driver
    
    
    else:
        
        # Auswahl Linux
            
        options = Options()
        options.add_argument('--headless')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
        driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
	return driver

Code: Alles auswählen

def login_page_start():

    
    # Website aurufen
    URL = "https://www.google.de"
    driver.get(URL)

Re: Mit Funktion auf eine geöffnete Webseite zugreifen

Verfasst: Samstag 15. April 2023, 15:50
von Sirius3
Ein Modul fasst mehrere Funktionen, die logisch zusammengehören, zusammen. Du hast aber nur eine Funktion pro Modul, macht also nicht wirklich Sinn, hier mehrere Module zu verwenden.

Mit dem Rückgabewert der Funktion webdriver_starten mußt Du auch was tun, in Deinem Fall als Argument an login_page_start übergeben.
Importe gehören nicht in die Funktion sondern an den Anfang der Datei.
Was soll das os_auswahl-Modul, warum nimmst Du nicht einfach sys.platform?
Wenn Code sowohl im if- als auch im else-Block vorkommen, dann gehört der Code nach den Blöcken hin und nicht doppelt in den Blöcken.

Code: Alles auswählen

import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

def webdriver_starten():
    if sys.platform == 'win32':  
        # Auswahl Windows
        options = webdriver.ChromeOptions()
        options.add_argument("--start-maximized")
        options.add_argument("--disable-extensions")
        options.add_experimental_option('detach', True)
    else:        
        # Auswahl Linux
        options = webdriver.Options()
        options.add_argument('--headless')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=options)
    return driver


def login_page_start(driver):
    # Website aurufen
    URL = "https://www.google.de"
    driver.get(URL)


def main():
    driver = webdriver_starten()
    login_page_start(driver)


if __name__ == "__main__":
    main()

Re: Mit Funktion auf eine geöffnete Webseite zugreifen

Verfasst: Samstag 15. April 2023, 18:48
von robebo
Vielen Dank für die Hilfe. Ich konnte soweit alles umsetzen und habe es zum Laufen gebracht.
Du hast aber nur eine Funktion pro Modul, macht also nicht wirklich Sinn, hier mehrere Module zu verwenden.
Die Funktionen in den Modulen werden noch ausgebaut. Ich hatte mich nur erst einmal darauf konzentriert die Funktion im im selben Browserfenster zum Laufen zu bekommen.
Mit dem Rückgabewert der Funktion webdriver_starten mußt Du auch was tun
Das Konzept habe ich noch nicht wirklich verstanden. Gibt es eine gute Quelle, wo ich hierzu VERSTÄNDLICH für mich als BEGINNER etwas mehr nachlesen kann?
Was soll das os_auswahl-Modul, warum nimmst Du nicht einfach sys.platform?
Habe mir mit der Suchmaschine was zusammengesucht, was ich zum Laufen bekommen habe. Dein Code ist natürlich deutlich sinnvoller.
if __name__ == "__main__":
main()
Das verstehe ich nicht. Es wird die Funktion main() aufgerufen. Aber was bedeutet die if-Klausel? Wo kann ich hierzu mehr nachlsen?
Importe gehören nicht in die Funktion sondern an den Anfang der Datei.
Gilt das für alle Importe? Auch für die, die nur in der Funktion benötigt werden?
Gilt das auch für Variablen, die funktionenübergreifend benötigt werden? Übergebe ich solche Variablen mit

Code: Alles auswählen

global variable
an die Funktion?

Vielen Dank für die tolle Hilfe.

Re: Mit Funktion auf eine geöffnete Webseite zugreifen

Verfasst: Samstag 15. April 2023, 19:15
von __blackjack__
@robebo: In der Python-Dokumentation ist ein Grundlagentutorial. Da werden unter anderem Funktionen erklärt.

Das mit den Importen am Anfang gilt für alle Importe. Variablen gibt es auf dieser Ebene nicht, höchstens Konstanten. ``global`` bitte gleich wieder vergessen, das macht man nicht. Alles was Funktionen und Methoden ausser Konstanten benötigen, bekommen sie als Argument(e) übergeben und Ergebnisse werden an den Aufrufer mit ``return`` zurückgegeben.