Seite 1 von 1

Schaltfläche identifizieren, mittels Selenium betätigen

Verfasst: Dienstag 23. April 2024, 14:33
von Strawk
Hallo,
wenn ihr die Domain
https://www.ariva.de/e_on-aktie/kurse/historische-kurse
ansurft, erscheint u.a. die Schaltfläche "Akzeptieren und weiter". Um sie mit Selenium zu betätigen, habe ich den Code:

Code: Alles auswählen

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = "https://www.ariva.de/e_on-aktie/kurse/historische-kurse"
driver = webdriver.Firefox()
driver.get(url)
Wait for the element with the specified XPath to be clickable
        button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@title='Akzeptieren und weiter']"))
        )
# Once the element is clickable, click it
button.click()
Jedoch erhalte ich einen timeout.
Was sollte ich tun?

Re: Schaltfläche identifizieren, mittels Selenium betätigen

Verfasst: Dienstag 23. April 2024, 16:09
von __deets__
Gibt's nen Grund sich keine Account anzulegen, um die Daten gleich als CSV runterzuladen? Statt sich gegen deren unzweifelhaft in Stellung gebrachten Anti-Scraping-Massnahmen zu wehren, was auf Dauer viel Arbeit sein wird.

Re: Schaltfläche identifizieren, mittels Selenium betätigen

Verfasst: Mittwoch 24. April 2024, 11:08
von Strawk
Ja.
Bitte die Lösung.

Re: Schaltfläche identifizieren, mittels Selenium betätigen

Verfasst: Mittwoch 24. April 2024, 12:07
von __deets__
Achso, na dann.

Du musst halt einfach mal ein paar Stunden darauf verwenden, zu googeln, wie man Bot-Detections uebergeht mit Selenium. Das habe ich recht schnell was gefunden. Viel Glueck!

Re: Schaltfläche identifizieren, mittels Selenium betätigen

Verfasst: Mittwoch 24. April 2024, 14:30
von Strawk
Ein durch und durch toller Tipp!
Vielen Dank, du hast mir sehr geholfen.

Re: Schaltfläche identifizieren, mittels Selenium betätigen

Verfasst: Mittwoch 24. April 2024, 14:46
von __deets__
Bei Leuten, die sich so viel Muehe bei ihren Fragen geben, und auch so viel Verstaendnis dafuer haben, dass ein komplexes Thema nicht mit einem kleinen Einzeiler zu loesen ist, mache ich das doch ausgesprochen gerne!

Re: Schaltfläche identifizieren, mittels Selenium betätigen

Verfasst: Mittwoch 24. April 2024, 18:17
von Strawk
Dass ich - eigentlich wir - die Abfrage von ariva.de gerne automatisieren möchten, bitte ich als gegeben hinzunehmen. Auch hatte ich beileibe nicht nach einer Gesantlösung für das Problem gefragt, sondern nur gebeten, mir bei dem Unterproblem der Betätigung der Schaltfläche "Akteptieren und weiter" Unterstützung zu gewähren. Zahlreiche Stunden und Ansätze hatte ich schon investiert, leider bisher erfolglos. Das Problem ist zunächst so geartet, dass ich die Schaltfläche nicht ansprechen kann. Macht man einen Rechtsklick darauf und wählt im Webbrowser Firefox "Untersuchen (Q)", wird folgendes angezeigt:

Code: Alles auswählen

<button title="Akzeptieren und weiter" aria-label="Akzeptieren und weiter" class="message-component message-button no-children focusable sp_choice_type_11 first-focusable-el" style="opacity: 1; padding: 10px 15px; margin: 5px 10px 4px; border-width: 0px; border-color: rgb(0, 0, 0); border-radius: 5px; border-style: solid; font-size: 16px; font-weight: 400; color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; width: auto; background: rgb(68, 153, 68);">Akzeptieren und weiter</button>
Die meisten Tipps, auf die ich beim Googeln traf, legten das Ansprechen des Elements per Name oder ID zugrunde; beides kann ich hier nicht gebrauchen, meine ich. Und so habe ich folgendes schon versucht:

Code: Alles auswählen

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get(self.url)
driver.execute_script("document.cookie = 'cookieconsent_status=accepted';")
Dies führt aber nicht zur automatischen Betätigung der Schaltfläche. Um euch einen Eindruck zu vermitteln, was ich alles schon versucht habe, hier (sämtlich auskommentiert) meine Ansätze, allesamt ohne Erfolg und mit diversen Fehlermeldungen behaftet:

Code: Alles auswählen

# self.request_result = requests.get(self.url)
# options = webdriver.FirefoxOptions()
# driver = webdriver.Firefox(options=options)
# driver.get(self.url)
# l=driver.find_element_by_xpath("//a[@title='Akzeptieren und weiter']")
# driver.find_element_by_xpath('//*[@title="Akzeptieren und weiter"]').click()
# element = driver.find_element(By.XPATH, "//form[input/@aria-label ='Akzeptieren und weiter']")
# WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Akzeptieren und weiter']"))).click()
# acceptBtn = driver.find_element(By.CLASS_NAME, "message-component message-button no-children focusable sp_choice_type_11 first-focusable-el")
# browser.find_element_by_xpath('//*[@title="Akzeptieren und weiter"]').click()
# acceptBtn.click()
# button = driver.find_element(By.ID, "Akzeptieren und weiter")
# button.click();
# button = driver.find_element("css selector", "button[name='Akzeptieren und weiter']")
# button.click()
# button = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "button[name='Akzeptieren und weiter']")))
# button.click()
@__deets__ , du sprachst ja nun von Abwehrmaßnahmen der Site gegen Webscraping. Vielleicht ist das der Grund, warum alles nichts fruchtet. Gerne wüsste ich, wie ich hier ein Stückchen weiter komme.
LG Strawk

Re: Schaltfläche identifizieren, mittels Selenium betätigen

Verfasst: Mittwoch 24. April 2024, 18:52
von __deets__
Deine ganzen Selektoren funktionieren fuer mich nicht, ich habe 3 oder 4 ausprobiert. Das muss also erstmal klappen, in einem normalen Browser in der Debug-Konsole.

Wenn der Selektor da funktioniert (also zB mit document.querySelector("#notice > div:nth-child(3) > div:nth-child(1) > div:nth-child(3) > div > button"), das geht bei mir), aber *nicht* mit Selenium, dann ist es anzunehmen, dass die da Webscraping versuchen zu verhindern.

Dazu findet man zB hier https://www.zenrows.com/blog/selenium-user-agent eine Vorgehensweise, die man austesten kann.

Re: Schaltfläche identifizieren, mittels Selenium betätigen

Verfasst: Mittwoch 24. April 2024, 19:05
von Sirius3
Man kann sich in den Fuß schießen, kann, wie __deets__ schon geschrieben hat, sich einfach anmelden und das csv laden, oder man benutzt pandas.read_html.
Du hast Dich in die erste Variante verrannt.