Schaltfläche identifizieren, mittels Selenium betätigen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Strawk
User
Beiträge: 233
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

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?
Ich programmiere erfolglos, also bin ich nicht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
Strawk
User
Beiträge: 233
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

Ja.
Bitte die Lösung.
Ich programmiere erfolglos, also bin ich nicht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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!
Benutzeravatar
Strawk
User
Beiträge: 233
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

Ein durch und durch toller Tipp!
Vielen Dank, du hast mir sehr geholfen.
Ich programmiere erfolglos, also bin ich nicht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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!
Benutzeravatar
Strawk
User
Beiträge: 233
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

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
Ich programmiere erfolglos, also bin ich nicht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 17767
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten