Python im Browser Buttons drücken, per Console?
Hi!
Ich wollte ein automatischen Bot bauen, der immer auf einen Button auf einer Website drückt, wenn er verfügbar ist, dass in Python.
Nur: Ich wollte fragen ob es eine Möglichkeit / ein Modul gibt das per Console auszuführen, also ohne das sich ein Browser öffnen muss, der so viele Rescourcen verbraucht, es wäre schön, wenn es nur bei der Konsole bleibt, doch das Skript trotzdem auf einer Website einen Button drücken kann. Geht das irgendwie?
2 Antworten
Du kannst mit Selenium den Browser automatisieren. Dabei kann der Browser auch ausgeblendet werden (headless mode). Ressourcen, damit der Browser läuft, sind dennoch notwendig.
Eine andere Option ist lediglich das Abfeuern von HTTP-Requests an ein bestimmtes Ziel (s. requests-Bibliothek), welches der jeweilige Button möglicherweise selbst ansteuert. Einen Buttonklick kannst du so nicht simulieren.
Den Button selbst erreichst du über seine ID (signup_button).
button = driver.find_element_by_id("signup_button")
Es kann sein, dass du vorher noch die Banner (Cookiepopup, etc.) wegklicken musst, je nachdem, wie das Timing ist. Ohne Accountdaten kommst du allerdings durchaus nicht am Login vorbei. Richte dir also einen Account ein und trage deine Daten dann via Selenium in die Eingabefelder. Die haben praktischerweise auch allesamt eine ID (signup_form_email, signup_form_password, referrer_in_form).
mail_field = driver.find_element_by_id("signup_form_email")
mail_field.send_keys("your mail address ...")
# etc. ...
Das reCaptcha-Feld wiederum könnte knifflig werden, evt. kommst du auch gar nicht daran vorbei. Tipps dafür findest du jedenfalls hier. Einen Versuch ist es sicherlich wert.
Nein Nein, du hast es falsch verstanden :)
Er soll ja kein Account registrieren sondern sich mit einem bestehenden Anmelden, dafür muss er oben auf Login klicken, nur wenn man oben Login klickt, bekommt man kein extra Link also müsste man zuerst auf die ganz normale Seite und dann muss er oben bei der Seite "Login" drücken und dann kann er die Sachen eingeben, dort gibt es auch kein Captcha :D
Ach stimmt, ich habe das Registrierungsformular als Loginformular gewertet.
Der Login-Link liegt in einem Listenelement mit der Klasse login_menu_button. Daraus kann man sich einen CSS-Selektor basteln.
login_link = driver.find_element_by_css_selector(".login_menu_button > a")
login_link.click()
Danach wartet man bis die einzelnen Felder sichtbar / klickbar sind (siehe Waits).
wait = WebDriverWait(driver, 5)
wait.until(EC.presence_of_element_located((By.ID, "login_form_btc_address"))).send_keys("mail address ...")
# etc. ...
danke!
In diesem Beispiel habe ich einen Button auf den man drücken muss, nur dieser hate keinen festen a tag oder so, es ist einfach nur Text ohne Tag. Wie kann ich hier drauf drücken?
<div class="play_without_captcha_button center" id="play_without_captchas_button" style="display: block;">
<span class="fa-stack fa-lg"> <i class="fa fa-square-o fa-stack-2x"></i>
<i class="fa fa-rocket fa-stack-1x"></i> </span>
PLAY WITHOUT CAPTCHA
</div>
Also ich möchte bei dem Button auf Play without Captcha drücken :D
Das wirds aber auch nicht sein weil ich immer diesen Error bekomme
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".play_without_captcha_button center > span"}
Ein Klassenselektor wird mit einem führenden Punkt gekennzeichnet, ein ID-Selektor mit einer Raute.
.play_without_captcha_button
#play_without_captchas_button
Welchen von beiden du wählst, ist in deinem Fall vermutlich egal. Ein ID-Selektor ist eindeutig, kommt in einem Dokument also nur einmal vor (es sei denn, es handelt sich um ein invalides Dokument). Ein Klassenselektor kann auf mehrere verschiedene Elemente zutreffen. Die find_element_by_css_selector-Methode wählt den ersten Fund.
Dein Selektor ist falsch, da du die zweite Klasse (center) nicht korrekt in den Selektor einbindest.
Mit diesem Selektor
.play_without_captcha_button.center > span
würdest du das erste span-Element suchen, welches ein direktes Kindelement eines Element ist, welchem die zwei Klassen play_without_captcha_button und center zugeordnet wurden.
Ich habs jetzt nochmal mit
Without_Captcha = driver.find_element_by_css_selector("#play_without_captchas_button")
Without_Captcha.click()
und
Without_Captcha = driver.find_element_by_css_selector("#play_without_captchas_button > span")
Without_Captcha.click()
probiert, beides funktioniert irgendwie nicht
Wenn das Element nicht gefunden werden kann, existiert es zum Zeitpunkt der Suche womöglich noch nicht (und du musst eine kleine Wartezeit einbauen) oder liegt generell nicht in dem Dokument (bspw. aber in einem iFrame).
Spiele die einzelnen Schritte also noch einmal im Browser durch und schau je Zustand im Webinspektor nach: Gibt es das Element? Wo genau liegt es?
Über die Browserkonsole kannst du die Queries leicht testen:
document.querySelector("css selector ...");
Direkt Buttons drücken wüsste ich jetzt nicht - du kannst aber, wenn die Webseite eine API hat, den API Endpunkt aufrufen der eigentlich durch den Button aufgerufen wird per Python aufrufen
Vielleicht kenns FreeBitcoin, jedenfalls kann man da jede Stunde paar Bitcoins claimen, ich will dort ein just for fun skript bauen.
Nur, ich komme mit dem Bot nicht auf Login weil ich mich ja zuerst anmelden muss. Ich finde keinen xPath oder weiß nicht wie ich anders auf das "Login" klicken kann
Hast du ne Idee?