2011-11-29 5 views
14

Sto tentando di accedere a questo page utilizzando Python.Accesso al sito Web utilizzando python

Ho provato ad utilizzare la procedura descritta in questo other Stack Overflow post, ed ho ottenuto il seguente codice:

import urllib, urllib2, cookielib 

username = 'username' 
password = 'password' 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
login_data = urllib.urlencode({'username' : username, 'j_password' : password}) 
opener.open('http://friends.cisv.org/index.cfm', login_data) 
resp = opener.open('http://friends.cisv.org/index.cfm?fuseaction=activities.list') 
print resp.read() 

ma che mi ha dato il seguente risultato:

<SCRIPT LANGUAGE="JavaScript"> 
    alert('Sorry. You need to log back in to continue. You will be returned to the home page when you click on OK.'); 
    document.location.href='index.cfm'; 
</SCRIPT> 

Che cosa sto facendo di sbagliato?

+0

Dall'estensione .cfm sullo script di gestione, presumo che si stia utilizzando un back-end Coldfusion per elaborare effettivamente questi accessi. Avremmo bisogno di sapere quali sono i contenuti e le procedure in quel file, perché la risposta sta arrivando in python bene, è Coldfusion che sta invece restituendo javascript e un reindirizzamento. Questo problema è serveride e non nel client python. – DeaconDesperado

+0

Suppongo che l'OP non sia proprietario del sito Web e spero solo di interagire con esso a livello di programmazione come utente. L'autenticazione al sito Web non presenta alcun problema, è sufficiente dare un'occhiata a quali dati vengono inviati al modulo quando si effettua l'accesso e si forniscono gli stessi dati. Non c'è bisogno di sapere cosa sta succedendo sul lato server. Vedi il mio esempio qui sotto. – Acorn

risposta

29

Si consiglia di utilizzare il modulo meraviglioso requests.

Il codice seguente ti consente di accedere al sito e di conservare i cookie per tutta la durata della sessione.

import requests 
import sys 

EMAIL = '' 
PASSWORD = '' 

URL = 'http://friends.cisv.org' 

def main(): 
    # Start a session so we can have persistant cookies 
    session = requests.session(config={'verbose': sys.stderr}) 

    # This is the form data that the page sends when logging in 
    login_data = { 
     'loginemail': EMAIL, 
     'loginpswd': PASSWORD, 
     'submit': 'login', 
    } 

    # Authenticate 
    r = session.post(URL, data=login_data) 

    # Try accessing a page that requires you to be logged in 
    r = session.get('http://friends.cisv.org/index.cfm?fuseaction=user.fullprofile') 

if __name__ == '__main__': 
    main() 
+0

Grazie, ha funzionato come un fascino! – iomartin

+0

Nella soluzione precedente dopo "r = session.get ('http://friends.cisv.org/index.cfm?fuseaction=user.fullprofile')" –

+0

Questa soluzione non è accettabile se non si ha controllo e capacità di installa librerie esterne. È preferibile una soluzione nativa pronta all'uso. – KoCMoHaBTa

3

Il termine "accesso" è purtroppo molto vago. Il codice qui riportato ha ovviamente cercato di accedere utilizzando l'autenticazione di base HTTP. Scommetterei che questo sito vuole che tu invii un nome utente e una password in qualche tipo di modulo POST (è così che funzionano molti moduli di accesso basati sul web). In questo caso, è necessario inviare la richiesta POST corretta e conservare i cookie inviati per future richieste. Purtroppo non so cosa sarebbe, dipende dal sito. Dovrai capire come normalmente registra un utente e provare a seguire quel modello.