Etwas auswählen und anklicken

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.
enteenteente
User
Beiträge: 13
Registriert: Samstag 28. Januar 2012, 17:07

Hallo erstmal :)

Ich schreibe gerade an einem Python-Programm. Es soll eine Website aufrufen und dort etwas auswählen und anklicken. Aufrufen geht bereits aber ich hab leider keine Ahnung mit welchem Befehl ich etwas auswähle und anklicken lassen kann...:(
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Normalerweise schickt man einen HTTP-Request ab. Sollte ich zum Beispiel per Google nach etwas suchen, würde ein GET-Request per urllib oder requests, der "http://www.google.de/search?q=suchbegriff" nutzt, ausreichen um die Seite an Resultaten öffnen und verarbeiten zu können.

Was aber genau getan werden muss, hängt konkret vom Beispiel ab. Es gibt Seiten, die nur POST-Requests nutzen, Cookies und andere browserspezifische Sachen benötigen oder anders als mit URLs arbeiten. So oder so musst du etwas forschen um herauszufinden wie da die Anfragen genau gestellt werden müssen.
enteenteente
User
Beiträge: 13
Registriert: Samstag 28. Januar 2012, 17:07

Ähm...
Also ich kenne mich jetzt mit Python noch nicht so genau aus...
also wenn ich auf einer Website bin und ich dann z.B. eine Bewertung abgeben will (das aber halt mit Python), was für einen Befehl muss ich dann verwenden, wenn ich dann "gut" oder "nicht gut" anklicken möchte und dann auf "ok"?
BlackJack

@enteenteente: Was bedeutet „wenn ich auf einer Webseite bin”? Das sagt man üblicherweise wenn man mit einem Webbrowser eine Seite besucht. Das hat nichts mit Python zu tun, solange der Webbrowser nicht in Python geschrieben, oder zumindest damit gesteuert werden kann. Da ist mir nichts bekannt, aber das ist auch nicht der Weg, den man normalerweise geht. Man schaut sich die Kommunikation zwischen Webbrowser und Server an und entscheidet dann, wie viel vom HTTP man braucht um zu sehen wie viel man in einem Programm „nach bauen” muss. In einfachen Fällen reichen einfache GET- oder POST-Anfragen, bei komplexeren Situationen muss man auch Cookies verarbeiten. `mechanize` ist ein ganz praktisches Modul für hartnäckige Fälle. Wenn die Webseite so gebaut ist, das zwingend JavaScript ausgeführt werden muss, hat man im Grunde verloren.

Auf jeden Fall sollte man sowohl die grundlegenden Web-Techniken, Formate, und Protokolle kennen, als auch in Python programmieren können.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ein Buch über Netzwerke und Protokolle zu lesen würde dir mehr helfen beim Verständnis des Ganzen anstatt hier zu fragen. Python mag einsteigerfreundlich sein, aber es wird dir nicht die gesamte Arbeit abnehmen, denn es weiß nicht was passiert oder zu tun ist, wenn du eine Bewertung auf einer ominösen Seite abgibst.

Achja, mal so nebenbei gefragt: Für was gedenkst du ein solches Programm einzusetzen? Erlaubt die Seite überhaupt automatisierte Zugriffe? Wenn nein, dann wäre es aussichtsvoller für dich eine Horde Asiaten anzuheuern, die stellen weniger Fragen :mrgreen:
enteenteente
User
Beiträge: 13
Registriert: Samstag 28. Januar 2012, 17:07

Hm...
okay, also die "ominöse" Website gehört einer guten Freundin und erlaubt autmatisierte Eingriffe :)
@Blackjack: Ich kann grundsätzlich in Python und in Java programmieren. Ich bin jetzt kein Crack (wie man merkt ;)), aber für so simple Spiele oder so reichts. Ich mache aber normalerweise nichts im web und daher wollte ich ein Python-Programm schreiben (quasi als Spielerei) und zur Übung.

Ich habe bisher aber nur: url (da Pytrhon3.2) = "NAme der Website" und dann halt die Befehle zum einloggen (sie hat da so ne Datenbank) Soweit klappt das auch.
Deshalb denke ich schond das hat was mit Python zu tun :)

Von dem Fachjargon verstehe ich leider (bisher) reichlich wenig, dass ist auch mein Hauptproblem :(
Ich wüsste nun gerne, mit welchem Befehl ich mein Python-Progarmm dazu bekomme diese Bewerung abzugeben? Geht das mit mechanize?

@webspider: Habe leider momentan keinen Kontakt zu der Horde Asiaten :D
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

enteenteente hat geschrieben:Von dem Fachjargon verstehe ich leider (bisher) reichlich wenig, dass ist auch mein Hauptproblem :(
Ich wüsste nun gerne, mit welchem Befehl ich mein Python-Progarmm dazu bekomme diese Bewerung abzugeben? Geht das mit mechanize?
Lies einfach ein Buch über Netzwerke/Protokolle. Wir können noch so viel über die Funktionsweise von mechanize, urllib, request schreiben wie wir wollen, aber das bringt nichts wenn du nicht verstehst anhand welcher Grundlagen die Kommunikation zwischen Client und Server geschieht.
BlackJack

@enteenteente: Es gibt nicht den einen „Befehl” der auf magische Weise das erreicht was Du haben willst. Du wirst da etwas programmieren müssen was auf dem Verständnis der Kommunikation zwischen Dir und der spezifischen Webseite abläuft, und das mehr als ein oder zwei Zeilen lang sein wird.
enteenteente
User
Beiträge: 13
Registriert: Samstag 28. Januar 2012, 17:07

Okay, ich versuch es jetzt einfach nochmal, nachdem ich mir jetzt die Fachbegriffe rausgesucht hab kann ich meine Frage vielleicht näher erklären :)
Also: Auf dieser Website ist ein submit-Button, also das ist dieser 'ok' Knopf, den ich meinte. Dieser schickt das Formular weg, indem die Nummer von der Seite steht und noch so ne andere Nummer. Die Nummer von den Seiten ist immer die gleiche, bis auf die Endziffern, also es wird immer um eine Einheit hochgezählt.
1.Frage: Wie kann ich mehrere Seiten nacheinander in einer Schleife öffnen, aber so, dass die Endziffern von dieser Nummer in der URL verändert werden?
Da diese andere Nummer sich immer ändert, aber mit dem Formular des Submit-Buttons (ich hoffe es ist richtig geschrieben ;)) mitgeschickt weren muss, muss das Programm sie ermitteln. ie steht im Quelltext der Seite und ist auch nicht so schwer zu finden :) Ich weiß bereits, dass ich einfach wieder die Seite öffnen lassen muss, aber:
2. Frage: Wie kann ich mein Python-Programm die Nummer suchen lassen und quasi "merken" lassen, also, dass es die Nummer in die URL eingibt und ich somit auf die Seite gelange auf der die Bewertungen gespeichert werden und meine auch gespeichert wird.

@BlackJack: Haha, das ist schon klar, aber ich will auch gar nicht, dass es auf 'magische Weise' funktioniert :mrgreen: Ich will ja ein Programm haben und keine Bibi Blocksberg :D
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Dir fehlen also nicht nur Grundlagen in Sachen Netzwerkkommunikation/Protokolle, sondern auch Python selbst? Kein Schimmer von Variablen, Datenstrukturen, Eingabe/Ausgabe (seien es Dateien, Seiten, ...), Stringverarbeitung?

Arbeite bitte das Tutorial durch. Wie kannst du nur behaupten du würdest dadrin (und auch noch in Java) programmieren können?
enteenteente
User
Beiträge: 13
Registriert: Samstag 28. Januar 2012, 17:07

Na das ist ja mal freundlich!
Ich hab gesagt, dass ich noch nicht besonders gut programmieren kann. Python mache ich erst seit ein oder zwei Wochen und das kann ich dementsprechend nicht besonders gut. Ich habe bisher in Python nur irgendwelche Währungsrechner und ähnliche Sachen programmiert und irgendwelche Anwendungen, bei dem der User Rechenaufgaben gestellt bekommt und dann die Lösung angibt und im Zähler eins hochgezählt wird, wenn es richtig ist. Java kann ich besser, aber das mache ich auch schon länger, aber da gibt es nun mal nicht die gleichen Befehle wie bei Python.
Ich weiß auch immer noch nicht, wo ich deiner Meinung anch irgendwelche Netzwerkprotokolle und so etwas brauche, ich weiß ja was ich machen will und wie, ich kann es nur in Python nicht formulieren.
Und wie willst du denn beurteilen können, wie ich in Java programmieren kann? Stalkst du mich? Ich habe gesagt, dass ich kein Crack bin, aber für Spiele in Java reichts noch so grad. Außer dem ist es schon ne Umstellung sich auf einmal mit objektorientierten Programmiersprachen zu beschäftigen.
Datenstrukturen habe ich (ich glaube ich erwähnte es bereits) in Python noch nicht gemacht.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

enteenteente hat geschrieben: Und wie willst du denn beurteilen können, wie ich in Java programmieren kann? Stalkst du mich? Ich habe gesagt, dass ich kein Crack bin, aber für Spiele in Java reichts noch so grad. Außer dem ist es schon ne Umstellung sich auf einmal mit objektorientierten Programmiersprachen zu beschäftigen.
Sollten deine Java-Kenntnisse wirklich so gut sein, würdest du es dank denen nicht allzu schwer haben dich wesentlich schneller als ein komplett Unerfahrener in Python einzuarbeiten. Da dem nicht so ist, zweifele ich deine Java-Kenntnisse an.

Überhaupt, es klingt recht merkwürdig wenn du sagst beim Umstieg auf Java zu Python mache dir ausgerechnet die Objektorientierung Probleme. "Befehle" sind nicht das Hauptproblem, es geht um Prinzipien, die man verinnerlicht haben sollte; den Rest kann man wunderbar in Dokumentationen nachschlagen.
enteenteente hat geschrieben:Ich weiß auch immer noch nicht, wo ich deiner Meinung anch irgendwelche Netzwerkprotokolle und so etwas brauche, ich weiß ja was ich machen will und wie, ich kann es nur in Python nicht formulieren.
Klingt nach "Ich möchte gern ein Flugzeug bauen, aber wofür muss ich vorher Ingenieurstechnische Grundlagen kennen? Ich weiß doch wie ich es machen will, nur haperts mir am Bau.".
enteenteente
User
Beiträge: 13
Registriert: Samstag 28. Januar 2012, 17:07

Nein. Java ist ja auch objektorientiert. Java lerne ich seit ca einem halben Jahr. Davor habe ich C gelernt, aber nicht besonders lange. Python, wie gesagt, erst seit ein oder zwei Wochen. Währendessen habe ich Praktikum gemacht und noch nicht besonders viel gelernt.
Daher wollte ich ja zur Übung dieses Programm schreiben. Zwischen Python und Java gibt es aber viele Unterschiede (ich meine hauptsächlich wie die Befehle aussehen müssen. Mein Problem sind weder irgendwelche Netzwerkprotokolle oder sonstiges. Ich will nur dieses Programm schreiben und nicht das Internet neu erfinden (soviel zum Flugzeug). Ich hab ja schon vorher gesagt was ich für Befehle suche, ich weiß schon, was das Programm machen soll und habe dafür auch schon die entsprechenden Befehle (abgesehen von den zwei Befehlen, die wohl auch sonst keiner kennt). Ich habs auch schon gegoogelt, aber dummerweise finde ich die meisten Befehle nur für die älteren Python Versionen und ich hab Python 3.2, daher helfen die mir reichlich wenig. Soviel also zu den Dokumentationen. Vom Prinzip her klappt das schon.

Um noch einmal auf das Flugzeugbeispiel zurück zu kommen: Es hapert mir nicht am Bau, sondern daran wo ich die Bauteile einkaufen kann.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

enteenteente hat geschrieben:Außer dem ist es schon ne Umstellung sich auf einmal mit objektorientierten Programmiersprachen zu beschäftigen.
Java hat doch OOP auch als Paradigma - gemeihin wird das wohl als wichtigstes / charakteristischstes Merkmal von Java angesehen - im Gegensatz zu Python btw.

In der Tat sich beide OOP-Ansätze aber durchaus unterschiedlich, da Java auf einen stark Klassen basierten Ansatz setzt.
enteenteente hat geschrieben: Datenstrukturen habe ich (ich glaube ich erwähnte es bereits) in Python noch nicht gemacht.
Das solltest Du dringend nachholen. Ohne Wissen über Listen, Dictionaries und Tupel kannst Du quasi nichts wirklich machen.

Zum Problem: Nutze doch `lxml.html` für das Parsen der Seite. Dort kannst Du dann aus dem Formulardaten die ominösen Zahlen herausziehen. Zudem solltest Du Dir die `urllib` angucken (unter Python 3.x iirc nur noch eine?); darin solltest Du alles finden, um GET und POST-Requests abzusetzen. Dazu gehört es auch, Parameter zu setzen und parsen.

Im Endeffekt brauchst Du dann ja nur noch eine Schleife, Dir entsprechend den Request aufruft und den Zahlenwert hochsetzt.

Ich sehe da jetzt keine wirklichen Schwierigkeiten - sofern ich Dein Szenario richtig verstanden habe und Deine Beschreibung zutrifft.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@enteenteente: Du musst Dich mit der Netzwerkkommunikation, den Protokollen und den Datenformaten auseinander setzen, weil *das* nun mal die Wege sind, über die Du Dein Problem lösen musst. Du beschreibst immer etwas von Seiten öffnen, und etwas anklicken — das ist was Du als Mensch machst um mittels Browser das Ziel zu erreichen. Mit Python bedienst Du aber keinen Browser sondern musst damit das nachvollziehen, was im Code des Browsers unterhalb der GUI-Ebene passiert. Und dazu muss man verstehen was dort abgeht.

1. Wie würdest Du eine Zeichenkette mehrfach ausgeben, wobei jede Ausgabe an einer Stelle eine sich ändernde Nummer enthält? Wie würdest Du den Inhalt hinter einer URL von einem Webserver anfordern? Aus den Antworten beider Fragen ergibt sich die Antwort auf Frage 1.

2. HTML-Parser zum Verarbeiten des Quelltextes, zum Beispiel das `lxml.html`-Modul oder das `BeautifulSoup`-Modul. Wie man sich etwas „merkt” solltest Du eigentlich wissen. Man bindet den Wert an einen Namen: ``a = 42``. Das ist in Java oder C doch auch nicht anders.

Wenn man von Java kommt, sollte man relativ schnell in Python rein kommen, denn man kann die Konzepte von dort in Python wiederverwenden. Das ist nicht immer „pythonisch”, aber zu sagen das man sich noch nicht mit Datenstrukturen in Python beschäftigt hat, bedeutet, dass man das in Java auch nicht gemacht hat.

Keine der bisher genannten Sprachen hat übrigens besonders viele *Befehle*. Die sind da relativ sparsam mit. Du benutzt den Begriff viel zu generisch. Für das was Du suchst gibt es keine speziellen Befehle. Und zwar weder in Python, noch in Java oder C.

Wenn Du die passenden Module und Pakete nicht für Python 3.x findest, musst Du sie entweder selber implementieren, es komplett sein lassen, oder einfach Python 2.7 verwenden, wie viele andere die mit Python arbeiten (müssen) auch. 2.7 ist übrigens nicht älter im Sinne von veraltet. Die aktuellsten 2.x und 3.x Versionen stehen momentan noch mehr oder weniger gleichberechtigt nebeneinander.
enteenteente
User
Beiträge: 13
Registriert: Samstag 28. Januar 2012, 17:07

@Hyperion: Ja, ich hab mir auch vorgenommen das noch zu lernen :)
Super danke :)

@Blackjack: Ich hab auch gar nicht gesagt, dass ich mit Java Datenstrukturen gemacht habe 8)
Ich weiß grundsätzlich wie so Datenbankstrukturen aussehen. Aber Datenstrukturen und so hab ich noch nie gemacht.
Aber wie gesagt: Das kommt auf meine 'noch zu erledigen'-Liste ;)
Na ja...aber im weitesten Sinne sind es ja Befehle, weil ich ja meinen Programm befehle etwas zu tun, oder?

@Hyperion und Blackjack:
Vielen Dank, mehr wollte ich doch gar nicht :) Jetzt weiß ich ja wie ich das machen muss.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

enteenteente hat geschrieben:@Blackjack: Ich hab auch gar nicht gesagt, dass ich mit Java Datenstrukturen gemacht habe 8)
Du hast also nie (assoziative) Arrays, bzw. Collections genutzt? Das schränkt aber schon die Effizienz von Java stark ein.
enteenteente hat geschrieben:Na ja...aber im weitesten Sinne sind es ja Befehle, weil ich ja meinen Programm befehle etwas zu tun, oder?
Gewöhn dich dran alles ein wenig genauer zu bezeichnen, das wird dir sehr helfen wenn du dich mit anderen austauschen willst :mrgreen:
enteenteente
User
Beiträge: 13
Registriert: Samstag 28. Januar 2012, 17:07

@webspider:

Ähm...
nö.
Aber das Wort klingt schön :D
Okay mache ich, dann versteht man mich auch :wink:
enteenteente
User
Beiträge: 13
Registriert: Samstag 28. Januar 2012, 17:07

Okay, noch ne Frage:

Ich habe jetzt überlegt, dass es vielleicht einfacher ist, statt die Seite zu parsen einfach mit string in der Zeichenkette nach dieser Nummer zu gucken. Es ist eine relativ lange Zeichenkette, kann ich das dann mit longstringitem machen? Und geht das überhaupt? Wenn ja, weiß jemand mit was für nem Code man das in Python3.2 macht?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

enteenteente hat geschrieben: Ich habe jetzt überlegt, dass es vielleicht einfacher ist, statt die Seite zu parsen einfach mit string in der Zeichenkette nach dieser Nummer zu gucken.
Es wurden Dir doch schon HTML-Parser-Module empfohlen - schau Dir die doch mal an! Am einfachsten kommst Du vermutlich über CSS-Selektoren da ran.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten