curl + webseite parsen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ich würde ganz gerne, eine internetseite, die hinter einem login ( wie zum beispiel in diesem forum ) auslesen. hab unter linux das tool wget und curl gefunden, mit dem das möglich sein könnte. leider hatte ich bis jetzt keine ergebnisse erziehlen können. habe mir die anleitungen zu diesen tools durchgelesen und auch beispiele gefunden, allerdings, alles ohne erfolg. ich kann mich nicht erfolgreich an das login der seiten, anmelden.
ich würde ganz gerne ein kleines python script bauen, um diese aufgabe zu erledigen. eigentlich hat es den hintergrund, das ich chatseiten, in denen ich angemeldet bin, zu bestimmten zeiten, nach neue nachrichten abfragen möchte. wäre das unter python möglich?
wäre für jeden vorschlag dankbar.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ja, das ist möglich. In der Regel reicht es mir aus, für sowas `urllib2` zu verwenden und bestimmte POST-Requests abzusenden. Ein erhaltenes Cookie muss man dann für jeden Request zu den Headern hinzufügen.

Für solche Jobs wird gerne Mechanize empfohlen, das im Kern vermutlich genau sowas macht, aber einiges an wertvoller Abstraktion bieten dürfte.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

das sieht so weit ganz gut aus. werde ich mich mal mit beschäftigen.
danke
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:Für solche Jobs wird gerne Mechanize empfohlen, das im Kern vermutlich genau sowas macht, aber einiges an wertvoller Abstraktion bieten dürfte.
Ja, es ist quasi ein programmierbarer Browser. Nur eben ohne Rendering-Engine.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja, das habe ich auch gesehen ;) jetzt aber meine frage. in dem doku, sehe ich nur ne anleitung um auf dieses standart login von einer html seite ( basic login ). ich brauche jedoch nen login für zum beispiel, diesem forum. dieses benutzt ja php im huintergrund um die entsprechenden felder auszuwerten. dafür habe ich noch kein beispiel gefunden.
weiß da jemand rat, oder habe ich es falsch verstanden?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das Beispiel zeigt doch, wie er ein Formular abschickt. Mehr braucht du auch im Python-Forum nicht machen, weil da nur dein Session-Keks aud dem Server auf "ist als $USERNAME eingeloggt" gestellt wird. Die Keks-Verwaltung macht ja Mechanize für dich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja, glaube habs verstanden. bekomme zwar noch fehlermeldungen, aber liegt wohl an mir ;) falls es nicht klappen sollte, melde ich mich noch mal.

hmmm, ich versuche ein control ( text ) aus dem formular, so zu füllen:
form.set_value(["engelexael"], name="nickname")
ich weiß, das das eingabefeld "nickname" heißt. bekomme dann diese felermeldung
Traceback (most recent call last):
File "webmess.py", line 10, in <module>
form.set_value(["engelexael"], name="nickname")
File "build/bdist.linux-i686/egg/ClientForm.py", line 2932, in set_value
File "build/bdist.linux-i686/egg/ClientForm.py", line 1328, in __setattr__
TypeError: must assign a string

das feld wird auch gefunden, trotzdem, wenn ich da etwas reinschreiben will, wie oben beschrieben, funtzt es trotzdem nicht, oder wie verwende ich ein text control ?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

habs dann rausgefunden, so muß die zeile dann heißen

Code: Alles auswählen

form["nickname"] = "engelexael"
jetzt gibts das nächste problem. die seite, die ich abfragen möchte ( www.onlineglueck.de ) hat dann links die memberliste stehen, die user die gerade online sind. die müßste ich ja eigentlich mit zurückbekommen, wenn ich den request ebgeschickt habe. bekomme aber nichts wirklich brauchbares zurück.
zu mindest kann ich mich erfolgreich einloggen und bekomme keine fehlermeldung, das ich den nicknamen oder password falsch eingegeben hätte.
aber wie bekomme ich so nen frame ( denke ich wirds sein ), ausgelesen?

EDIT:
sehe gerade, bekomme nur htlm zurück. brauche aber die komplette seite, auch was mir der server per php sendet, also das was ich auch im browser sehen kann.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

The Hit-Man hat geschrieben:sehe gerade, bekomme nur htlm zurück. brauche aber die komplette seite, auch was mir der server per php sendet, also das was ich auch im browser sehen kann.
PHP sendet dir auch nur generiertes HTML.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

dann muss es irgendwas anderes sein, bekomme, die userliste nicht in den html text ( den ich ja parsen muß ). auch wenn ich mir den source der seite anschaue, fehlt da alles drin. auch wenn ich es einfach mit wget mache, und ohne mich einzuloggen ( weil brauche ich nicht unbedingt ), fehlt die ganze liste. das ist lles, was ich von der www.onlineglueck.de seite wieder bekomme.

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
        "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>onlineglueck.de - Die Single- & Flirtcommunity</title>
        <link REL="shortcut icon" HREF="/favicon.ico" TYPE="image/x-icon">
        <link rel="bookmark" href="http://www.onlineglueck.de/" title="Onlineglück">
        <meta name="title" content="Onlineglück, die grosse Flirtcommunity">
        <meta name="author" content="Virtual Minds AG">
        <meta name="copyright" content="Virtual Minds AG">
        <meta name="publisher" content="Virtual Minds AG">

        <meta name="distribution" content="worldwide">
        <meta name="revisit-after" content="7 days">
        <meta http-equiv="expires" content="7 days">
        <meta name="keywords" content="shortmessage, flirt, single, kontakt, community, kennenlernen, herzklopfen, chat, photo, foto, sexyvote, paar, liebe, einsam, Onlineglück, Onlineglueck, flirttext, flirtmail, gemeinschaft, kummer, verlieben, lieben, beziehung, sms, hochzeit, heirat, foren, forum, diskussion, glück">
        <meta name="description" content="Community für Singles, mit Kontaktanzeigen, Flirt-Foren, Flirt-Chat, Shortmessage Funktion und unzähligen weiteren Funktionen.">
        <meta name="abstract" content="Community für Singles, mit Kontaktanzeigen, Flirt-Foren, Flirt-Chat, Shortmessage Funktion und unzähligen weiteren Funktionen.">
        <meta name="robots" content="INDEX,FOLLOW">
        <meta name="rating" content="general">
        <meta name="resource-type" content="document">

        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>
<frameset rows="*" border="0">
  <frame name="main" frameborder="0" src="/olg/">
<noframes>
Community für Singles, mit Kontaktanzeigen, Flirt-Foren, Flirt-Chat, Shortmessage Funktion, Sexy-vote, Paar-vote und unzähligen weiteren Funktionen.<br>



Sie brauchen mindestens einen Browser der 4er Generation um diese Seite zu betrachten!<br>
Wir bitten um Ihr Verständnis!
<a href="http://kontaktanzeigen-flirten-singles.de/">Kontaktanzeigen Flirten Singles Community Treffen</a>
</noframes>
</frameset>
</html>
doch wenn man sich die seite anschaut, sind ja links die ganzen user zu sehen, die gerade online sind.
des weiteren fehlen ja auch die ganzen eingabefelder und so weiter.
fme
User
Beiträge: 34
Registriert: Sonntag 1. April 2007, 18:58
Wohnort: Bremen

Sie brauchen mindestens einen Browser der 4er Generation um diese Seite zu betrachten!
Wir bitten um Ihr Verständnis!
Das sagt dir doch, weswegen du die "falsche Seite" siehst ...
Was sendest du denn als User-Agent?

*edit*
Probiere es mal mit http://www.onlineglueck.de/olg/
Dann bekommst du die Seite ohne Frames.
Sollte dann gehen.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

das sieht auf jeden fall schon mal besser aus, was ich da zurück bekomme. das scheint die hauptseite zu sein ;) jetzt muß ich vielleicht nur noch schauen, wie links die userliste heißt. glaube, habe sie im source code gefunden. schaue später mal eben nach, muß los, zur arbeit.

*EDIT*
habe zwei links in dem source gefunden, die weiterhelfen könnten:

Code: Alles auswählen

<iframe width="170" height="175" id="ifr_f" name="ifr_f" src="http://www.onlineglueck.de/olg/useronline.olg?gender=f" marginheight="0" marginwidth="0" frameborder="0"></iframe>
<iframe width="170" height="175" id="ifr_m" name="ifr_m" src="http://www.onlineglueck.de/olg/useronline.olg" marginheight="0" marginwidth="0" frameborder="0"></iframe></td>
Traceback (most recent call last):
File "webmess.py", line 6, in <module>
form = forms[0]
IndexError: list index out of range
hitman@basis:~$ python webmess.py
Traceback (most recent call last):
File "webmess.py", line 6, in <module>
form = forms[0]
IndexError: list index out of range

bekomme allerdings, wenn ich einen dieser links , mit mechanize abfrage, diese meldungen:

Code: Alles auswählen

Traceback (most recent call last):
  File "webmess.py", line 6, in <module>
    form = forms[0]
IndexError: list index out of range
hitman@basis:~$ python webmess.py 
Traceback (most recent call last):
  File "webmess.py", line 6, in <module>
    form = forms[0]
IndexError: list index out of range
mit wget, bekomme ich jetzt zwar die hauptseite, aber noch immer nicht die userliste, die online sind. und mit den links, wie oben, komme ich nicht weiter, weils fehlermeldungen gibt.

*EDIT*
mit wget kann ich beide links benutzen und ich bekomme auch die memberliste ;) aber warum funktioniert mein eigener code nicht, hier mein beispiel:

Code: Alles auswählen

from urllib2 import urlopen
from ClientForm import ParseResponse

response = urlopen("http://www.onlineglueck.de/olg/useronline.olg")
forms = ParseResponse(response, backwards_compat=False)
form = forms[0]
# print form

form["nickname"] = "mein benutzername"
form["password"] = "mein passwort"

urlopen(form.click()).read()
print urlopen(form.click()).read()
mit dem code, bekomme ich, wie oben beschrieben, diese fehlermeldung von python
.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also ich sehe auf der von dir verlinkten Seite keine Formulare, da kann das ja auch schwerlich funktionieren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja, da hast du schon recht. die sache ist die. ich möchte mich an die hauptseite einloggen ( das geht ja jetzt auch ). dann möchte ich mit dem eingeloggtem cookie auf die seite springen, links, in dem die usernamen stehen. das geht natürlich auch ohne einzuloggen, mit wget. jedoch denke ich schon ein bischen weiter und möchte zu der seite springen, in dem angeziegt wird, ob sich neue nachrichten, in diesem chat für mich befinden. dafür muß ich angemeldet sein. wie soll das gehen? der link um in den persönlichen nachrichten ordner zu kommen, würde ja jetzt auch im quelltext der seite stehen. des weiteren gibt der chat mir an, wieviele neue nachrichten ich bekommen habe. genau diese sachen, mag ich auch gerne abfragen. mein tool, soll ja so was werden, wie eine art messenger. vielleicht sogar nen plugin für den pidgin.
ob ich als seiten-adresse, einfach den link, für die persönlichen nachrichten eintrage?

*EDIT*
das wäre der link zum persönlichen ordner. wenn ich den im browser eintrage und mich auf einen anderen TAB an die seite angemeldet habe, bekomme ich wirklich meine mails angezwigt. nehme ich den lin, wenn ich mich nicht angemeldet habe, erscheint ein login. dieses kann ich auch mit wertden füllen, bekomme jedoch, was anderes zurück.

Code: Alles auswählen

http://www.onlineglueck.de/olg/shortmessages/?folder=1
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

The Hit-Man hat geschrieben:ja, da hast du schon recht. die sache ist die. ich möchte mich an die hauptseite einloggen ( das geht ja jetzt auch ). dann möchte ich mit dem eingeloggtem cookie auf die seite springen, links, in dem die usernamen stehen. das geht natürlich auch ohne einzuloggen, mit wget. jedoch denke ich schon ein bischen weiter und möchte zu der seite springen, in dem angeziegt wird, ob sich neue nachrichten, in diesem chat für mich befinden. dafür muß ich angemeldet sein. wie soll das gehen?
Du surfst mit Mechanize die eine Seite an, loggst dich dort ein und surfst dann die andere Seite an. Mechanize behält ja die Cookies und sendet sie mit.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja, verstehe. nur wie surfe ich die neue seite, denn dann an? einfach den respone tauschen? oder wie verstehe ich das?

*EDIT*
bekomme immer nur dieses zurück, obwohl dort ja meine persönlichen nachrichten aufgelistet sein sollten.

Code: Alles auswählen

<html>
    <head>
    <title>onlineglueck.de</title>
    <script language="javascript">
	
	var reloadTime=50000;
	function reload(){
		if(typeof parent.frames[0] != "undefined") {
			if(typeof parent.frames[0].frames['reloader'] != "undefined"){
				parent.frames[0].frames['reloader'].location.href = '/olg/reload.olg';
				window.setTimeout("reload()",reloadTime);
			}
		}
	}
	window.setTimeout("reload()",reloadTime);
	
    </script>
    </head>
    <frameset rows="100%,0"  FRAMEBORDER=0 BORDER=0 FRAMESPACING=0>
        <frame src="/olg/index.olg?update=ok" name="olgmain">
        <frame src="/olg/reload.olg" noresize name="reloader">
    </frameset>
</html>
<html>
    <head>
    <title>onlineglueck.de</title>
    <script language="javascript">
	
	var reloadTime=50000;
	function reload(){
		if(typeof parent.frames[0] != "undefined") {
			if(typeof parent.frames[0].frames['reloader'] != "undefined"){
				parent.frames[0].frames['reloader'].location.href = '/olg/reload.olg';
				window.setTimeout("reload()",reloadTime);
			}
		}
	}
	window.setTimeout("reload()",reloadTime);
	
    </script>
    </head>
    <frameset rows="100%,0"  FRAMEBORDER=0 BORDER=0 FRAMESPACING=0>
        <frame src="/olg/index.olg?update=ok" name="olgmain">
        <frame src="/olg/reload.olg" noresize name="reloader">
    </frameset>
</html>
<html>
    <head>
    <title>onlineglueck.de</title>
    <script language="javascript">
	
	var reloadTime=50000;
	function reload(){
		if(typeof parent.frames[0] != "undefined") {
			if(typeof parent.frames[0].frames['reloader'] != "undefined"){
				parent.frames[0].frames['reloader'].location.href = '/olg/reload.olg';
				window.setTimeout("reload()",reloadTime);
			}
		}
	}
	window.setTimeout("reload()",reloadTime);
	
    </script>
    </head>
    <frameset rows="100%,0"  FRAMEBORDER=0 BORDER=0 FRAMESPACING=0>
        <frame src="/olg/index.olg?update=ok" name="olgmain">
        <frame src="/olg/reload.olg" noresize name="reloader">
    </frameset>
</html>
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

The Hit-Man hat geschrieben:ja, verstehe. nur wie surfe ich die neue seite, denn dann an? einfach den respone tauschen? oder wie verstehe ich das?
Einfach ein weiteres ``br.open()``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

komisch, ich hatte es so versuchen zu lösen, wie in der doku beschrieben, ist das etwa nicht richtig? deshalb fragte ich auch, wie ich eine neue seite ansurfe.

Code: Alles auswählen

response = urlopen("http://www.onlineglueck.de/olg")
forms = ParseResponse(response, backwards_compat=False)
form = forms[0]
form["nickname"] = "mein nickname"
form["password"] = "mein passwort"
urlopen(form.click())
somit, kann ich mich zu mindest einloggen
irgendwie habe ich wohl gerade ne blockarde ;) völlig verwirrt, irgendwie.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du nutzt ClientForm, wir sprechen hier aber die ganze Zeit schon von Mechanize. Warum nutzt du es denn nicht? Das Beispiel ist doch direkt auf der ersten Seite, die dir dazu verlinkt wurde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja, ich dachte, ich nutze das die ganze zeit !!!! hab ja extra nen bookmark auf die seite gemacht, und hatte mir doch die beispiele angesehen.

http://wwwsearch.sourceforge.net/mechanize/

ich bin da wohl dann auf ClientForm gestoßen, auf der seite. habe die beispiele jedoch gesehen, aber irgendwie, ist mir da bis jetzt noch unklar, wie ich mich einloggen soll.
bin wohl nicht richtig klar gekommen, damit die felder für nickname und passwort zu füllen. ich schaus mir noch mal an.

*EDIT*

nach dem beispiel nach, wirds ja so gemacht.

Code: Alles auswählen

import re
from mechanize import Browser

br = Browser()
br.open("http://www.onlineglueck.de/olg/")
br.select_form(name="loginfrm")
br["nickname"] = ["mein nickname"]
danach sollte ich noch das passwort setzen und den submit machen. jedoch bekomme ich bei dem nicknamen schon diese meldung:

Code: Alles auswählen

TypeError: must assign a string
*EDIT*
die zeile muß so heißen, dann gehts:

Code: Alles auswählen

br["nickname"] = "mein nickname"
argh !!!!!!!!!!!!! jetzt loggt er sich nicht mal vernünftig ein :( bekomme also immer die meldung vom server, das ich nicht eingeloggt sein :( *grummel*
Antworten