2010-05-26 18 views
53

Come posso farlo? Stavo cercando di inserire alcune collegamento specificato (con urllib), ma per farlo, ho bisogno di effettuare il loginCome posso accedere a un sito Web con Python?

Ho questa sorgente dal sito:.

<form id="login-form" action="auth/login" method="post"> 
    <div> 
    <!--label for="rememberme">Remember me</label><input type="checkbox" class="remember" checked="checked" name="remember me" /--> 
    <label for="email" id="email-label" class="no-js">Email</label> 
    <input id="email-email" type="text" name="handle" value="" autocomplete="off" /> 
    <label for="combination" id="combo-label" class="no-js">Combination</label> 
    <input id="password-clear" type="text" value="Combination" autocomplete="off" /> 
    <input id="password-password" type="password" name="password" value="" autocomplete="off" /> 
    <input id="sumbitLogin" class="signin" type="submit" value="Sign In" /> 

è possibile?

risposta

50

Forse si desidera utilizzare twill (è basato su mechanize). È abbastanza facile da usare e dovrebbe essere in grado di fare quello che vuoi.

Sarà simile al seguente:

from twill.commands import * 
go('http://mysite.org') 

fv("1", "email-email", "blabla.com") 
fv("1", "password-clear", "testpass") 

submit('0') 

È possibile utilizzare showforms() per elencare tutte le forme, una volta che hai utilizzato go(...) per individuare il sito che si desidera effettuare il login. Provalo dall'interprete python.

+0

nota che in alcuni casi è necessario utilizzare submit().Vedo: http://lists.idyll.org/pipermail/twill/2006-August/000526.html Confermo questo problema, per me, accedendo al www.pge.com, utilizzando presentare() funziona. – user391339

+0

Esiste una soluzione per Python 3.6? Sembra che twill non supporti Python 3.5 né 3.6. Ho provato a scaricarlo e convertirlo usando '2to3', ma ora ho un' ModuleNotFoundError' quando provo ad importarlo. – CGFoX

+0

In realtà, ho potuto risolvere il 'ModuleNotFoundError' utilizzando/conversione Twill 1.8.0 e l'installazione di' 'lxml' e requests' con' install' pip. Ma ora ottengo un 'SyntaxError' quando provo ad importare perché da qualche parte' False = 0 '.... – CGFoX

5

I siti Web in generale possono controllare l'autorizzazione in molti modi diversi, ma quello che stai mirando sembra renderlo ragionevolmente facile per te.

Tutto ciò che serve è quello di POST all'URL auth/login un blob forma codificata con i vari campi che vedi lì (dimenticare le etichette for, sono decorazione per i visitatori). handle=whatever&password-clear=pwd e così via, purché si conoscano i valori per l'handle (posta elettronica AKA) e la password, si dovrebbe andare bene.

Presumibilmente, il POST ti reindirizzerà a una pagina di "accesso con esito positivo" con un'intestazione Set-Cookie che convalida la sessione (assicurati di salvare quel cookie e rinviarlo a ulteriori interazioni lungo la sessione!).

14
import cookielib 
import urllib 
import urllib2 

url = 'http://www.someserver.com/auth/login' 
values = {'email-email' : '[email protected]', 
      'password-clear' : 'Combination', 
      'password-password' : 'mypassword' } 

data = urllib.urlencode(values) 
cookies = cookielib.CookieJar() 

opener = urllib2.build_opener(
    urllib2.HTTPRedirectHandler(), 
    urllib2.HTTPHandler(debuglevel=0), 
    urllib2.HTTPSHandler(debuglevel=0), 
    urllib2.HTTPCookieProcessor(cookies)) 

response = opener.open(url, data) 
the_page = response.read() 
http_headers = response.info() 
# The login cookies should be contained in the cookies variable 

Per ulteriori informazioni visitare: https://docs.python.org/2/library/urllib2.html

+0

Il link non funziona: un '2' è stato aggiunto nelle docs.python.org' urls': https://docs.python.org/2/library/urllib2.html –

21

genere avrete bisogno i cookie per accedere a un sito, il che significa cookielib, urllib e urllib2. Ecco una classe che ho scritto indietro quando giocavo Facebook giochi web:

import cookielib 
import urllib 
import urllib2 

# set these to whatever your fb account is 
fb_username = "[email protected]" 
fb_password = "secretpassword" 

class WebGamePlayer(object): 

    def __init__(self, login, password): 
     """ Start up... """ 
     self.login = login 
     self.password = password 

     self.cj = cookielib.CookieJar() 
     self.opener = urllib2.build_opener(
      urllib2.HTTPRedirectHandler(), 
      urllib2.HTTPHandler(debuglevel=0), 
      urllib2.HTTPSHandler(debuglevel=0), 
      urllib2.HTTPCookieProcessor(self.cj) 
     ) 
     self.opener.addheaders = [ 
      ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; ' 
          'Windows NT 5.2; .NET CLR 1.1.4322)')) 
     ] 

     # need this twice - once to set cookies, once to log in... 
     self.loginToFacebook() 
     self.loginToFacebook() 

    def loginToFacebook(self): 
     """ 
     Handle login. This should populate our cookie jar. 
     """ 
     login_data = urllib.urlencode({ 
      'email' : self.login, 
      'pass' : self.password, 
     }) 
     response = self.opener.open("https://login.facebook.com/login.php", login_data) 
     return ''.join(response.readlines()) 

Non avrete necessariamente bisogno del HTTPS o reindirizzare i gestori, ma non fanno male, e rende la gara di apertura molto più robusto. Potresti anche non aver bisogno di cookie, ma è difficile dirlo solo dal modulo che hai pubblicato. Sospetto che tu potresti, semplicemente dall'input "Ricordami di me" che è stato commentato.

33

Vorrei cercare di rendere semplice, supponiamo URL del sito è www.example.com ed è necessario iscriversi tramite username e password di riempimento, così andiamo alla pagina di login dire http://www.example.com/login.php ora e visualizzare è il codice sorgente e la ricerca per l'URL azione sarà nel tag form qualcosa come

<form name="loginform" method="post" action="userinfo.php"> 

ora prendere userinfo.php per rendere URL assoluto che sarà 'http://example.com/userinfo.php ', ora esegui un semplice script python

import requests 
url = 'http://example.com/userinfo.php' 
values = {'username': 'user', 
      'password': 'pass'} 

r = requests.post(url, data=values) 
print r.content 

Spero che questo aiuti qualcuno da qualche parte un giorno.

+0

questo non funziona per la maggior parte dei siti web che ho provato –

+0

dei due pagine dozzina di aiuto/StackOverflow ho guardato questo era l'unica soluzione che ha funzionato da un sito che mi serviva. – Buoy

Problemi correlati