Webseiten Login mit urllib/urllib2

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
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Hallo Zusammen,

ich habe mal wieder ein kleines Problem.

Ich versuche einen Login von Python aus, auf folgende Webseite durch zu führen:

http://dadom.beanstalkapp.com/sessions/new

um nach dem einloggen eine bestimmte Datei runter zu laden. Aber irgendwie scheitere ich schon am Login, hab mal ein Beispiel zum Debuggen der HTML Request kopiert und eingefügt:

Code: Alles auswählen

import logging, urllib2, sys,urllib

values = {'password' : 'XXX','login' : 'XXX'}
data=urllib.urlencode(values)

hh = urllib2.HTTPHandler()
hsh = urllib2.HTTPSHandler()
hh.set_http_debuglevel(1)
hsh.set_http_debuglevel(1)
opener = urllib2.build_opener(hh, hsh, urllib2.HTTPCookieProcessor())
logger = logging.getLogger("cookielib")
logger.addHandler(logging.StreamHandler(sys.stdout ))
logger.setLevel(logging.DEBUG)


response = opener.open("http://dadom.beanstalkapp.com/sessions/new/sessions" ,data)

for line in response:
    print line
Als Response bekomme ich die LoginMaske wieder (die htmlSeite), die LogMeldungen:

connect: (proxy.XXXXX.XX, 8080)
send: 'POST http://dadom.beanstalkapp.com/sessions/new/sessions HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: 22\r\nHost: dadom.beanstalkapp.com\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nUser-Agent: Python-urllib/2.5\r\n\r\n'
send: 'login=XXX&password=XXX'
reply: 'HTTP/1.0 200 OK\r\n'
header: Server: nginx/0.6.26
header: Date: Wed, 15 Oct 2008 09:54:04 GMT
header: Content-Type: text/html; charset=utf-8
header: Set-Cookie: _beanstalk_session_id=c6033147c6bfac0d38ffd826cd3b8bd2; path=/
header: Status: 200 OK
header: X-Runtime: 0.04000
header: ETag: "22baca4beb0e69d28a8d4cab328b8277"
header: Cache-Control: private, max-age=0, must-revalidate
header: Content-Length: 2997
header: X-Cache: MISS from proxy.XXXX.XXX
header: Proxy-Connection: close


Danke schon mal für eure Mühen
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

mechanize sollte helfen. Siehe auch hier!
MfG
HWK
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Steht übrigens auch in den [wiki]FAQ[/wiki].
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Unglaublich, geniale Bibliothek, bin begeistert..einloggen und meine ArchivDatei runter geladen. Vielen Dank für den Link und ja die FAQ hab ich scheinbar überlesen :) sorry.

Danke für die Hilfe
D

PS: so sieht es dann übrigents aus:

Code: Alles auswählen

import mechanize 
import ClientForm 
from ClientForm import ParseResponse 
import os

#Cookie holen
request  = mechanize.Request("http://dadom.beanstalkapp.com/sessions/new/sessions") 

#HTML Forms auslesen
response = mechanize.urlopen("http://dadom.beanstalkapp.com/sessions/new/sessions") 

forms = ParseResponse(response, backwards_compat=False) 
form  = forms[0] 

#Login Daten einsetzen
form.set_value("XXX", name="login") 
form.set_value("XXX", name="password") 

#Absetzen des Formulars
request  = form.click() 
response = mechanize.urlopen(request)

#Dateidownload
response=mechanize.urlopen("http://dadom.beanstalkapp.com/repositories/dcoding/export");

#Dateispeicherung
file=open("c:/dcoding_19337_rev54.tar.gz","wb")
file.write(response.read());
file.close()
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ungetestet:

Code: Alles auswählen

import mechanize

br = mechanize.Browser()
br.open('http://dadom.beanstalkapp.com/sessions/new/sessions')
br.select_form(nr=0)
br['login'] = 'xxx'
br['password'] = 'xxx'
br.submit()
download = br.open('http://dadom.beanstalkapp.com/repositories/dcoding/export')
content = download.read() # das dann in die Datei schreiben
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

So neues Problemchen :)

Will die Datei die ich runter geladen habe, bei einem FileHoster hochladen (rapidshare), jetzt zwickt der HTML Standard mich aber scheinbar, weil der Upload über ein Datei Dialog gehandelt wird und ich dessen Value Attribut aus Sicherheitsgründen nicht setzen darf?

form.set_value("c:/dcoding_19337_rev54.tar.gz", name="filecontent")
>>
AttributeError: value attribute is readonly
>>

oder bin ich da auf dem Holzweg?

Danke (mal wieder)
Dom


>> lesen mein Junge ;) add_file bei der Form...Rapidshare will zwar gerade nicht Uploaden, aber werd mal weiter mit rumprobieren
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Oki, habs mit ein bisschen rum probieren hinbekommen.

Code: Alles auswählen

#Rapidshare Upload
# Call html document and store cookie  
response = mechanize.urlopen("http://www.rapidshare.de") 
# Read the form here form[
forms = ParseResponse(response, backwards_compat=False) 
form  = forms[0] 
# Set File to Upload
file=open(fileName,"rb");
form.add_file(file,"application/gzip", fileName)
request= form.click() 
file.close();
Wichtig die Datei im binären Lesemodus zu öffnen, und bei add_file den MIME Type explizit mit an zu geben, sonst hat es bei mir nicht funktioniert :)

Bin begeistertm trotz meiner Mühe, hätte ich nicht gedacht dass das mit Python so einfach geht *freu*

Danke an alle
D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``file`` zu überschreiben ist, ähm, unvorteilhaft (und ich seh schon dass numerix gleich vorbeikommt und mich schimpft, warum nich nicht eine halbe Bildschirmseite für die Gründe warum das so ist schreibe) und in Python braucht man keine Strichpunkte am Ende der Anweisungen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Leonidas hat geschrieben:``file`` zu überschreiben ist, ähm, unvorteilhaft
Was traust du mir zu :D ? Das war in dem Moment jediglich eine schnelle (zugegebenermaßen schlechte) Wahl meiner Variablen Benamsung :)
Leonidas hat geschrieben: in Python braucht man keine Strichpunkte am Ende der Anweisungen.
Ein Fluch :) Hab leider nie wirklich lange Zeit mich mit Python zu beschäftigen und dann kommt PHP und Java dazwischen ^^ :)
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Leonidas hat geschrieben: in Python braucht man keine Strichpunkte am Ende der Anweisungen.
Kurze Frage die mir dazu noch einfällt: Warum stört er sich an dem Semikolon eigentlich nicht? Weder beim Programmlauf noch in meinem Editor wird ein Fehlerangezeigt...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

da.dom hat geschrieben: Kurze Frage die mir dazu noch einfällt: Warum stört er sich an dem Semikolon eigentlich nicht? Weder beim Programmlauf noch in meinem Editor wird ein Fehlerangezeigt...
In der Doku wird das Semikolon als Delimiter aufgeführt, also als Trenner. Da Leonidas schrieb, dass man sie nicht braucht, interpretiere ich aus beidem, dass man sie theoretisch setzen könnte. Aber wozu etwas tun, was unnötig ist?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

da.dom hat geschrieben:Warum stört er sich an dem Semikolon eigentlich nicht? Weder beim Programmlauf noch in meinem Editor wird ein Fehlerangezeigt...
Ich habe ja auch geschrieben "braucht". Wie Hyperion meinte sind sie Delimiter und eigentlich nur nützlich, wenn man mehrere "Befehle" in eine Zeile setzen will. Habe ich aber bisher nie genutzt und sehe auch da auch keinen Nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten