Pagina 1 di 1

[Python] Mechanize: Cliccare un link con testo uguale a...

Inviato: giovedì 4 giugno 2015, 17:35
da ubuntumate
Ciao a tutti!
Siccome sono pigro ma pazzo,vorrei scrivere uno piccolo programmino che quando ,esco col portatile,mi permetta di loggarmi nella rete del comune in automatico,premendo solo un pulsante.La pagine iniziale contiene un link con testo accedi che mi reindirizza al form che chiede numero di telefono e password.Il problema è come fare a individuare il link Accedi,cliccarlo e farsi portare alla pagina del login e loggarsi per poter usufruire del servizio.Ecco quello cho ho combinato:

Codice: Seleziona tutto

def follow():
        browser = Browser() # istanza di Mechanize.Browser()
        browser.set_handle_robots(False) # Chissenefrega,io visito tutto quel che mi pare
        response = browser.open(http://paginalogin) # apro la pagina del login
        iter = browser.links(text_regex=Accedi) # cerco il link <a .......>Accedi</a> e ottengo un iteratore
        for link in iter:
                print link # in teoria dovrei stampare tutti gli url che hanno Accedi come testo e dovrei cliccarli
                # qui com faccio a seguire il link e compilare il form?
        return 0

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: giovedì 4 giugno 2015, 17:37
da vaeVictis
Domanda: stai facendo tutto questo perché poi pensi che se accedi al sito con il browser sei già loggato?
Se la risposta è sì, non funziona :)

Detto questo, non devi seguire i link, ma cercare il form del login. Hai fatto qualche ricerca online? Ci stanno tonnellate di esempi.
Cerca "mechanize login form how to" e trovi tutto :)

edit:
credo di non aver capito cosa devi fare. Devi loggarti o cliccare un link?

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: giovedì 4 giugno 2015, 18:00
da ubuntumate
Non ho capito la prima domanda,scusami.

Si ho già cercato su internet ovviamente,ma il fatto è che non posso andare direttamente alla pagina del login perchè mi dà il famoso 404,perchè il sito deve prima recuperare il MAC e l'ip(per sicurezza credo,avranno associato account-dispositivo)tramite l'homepage e poi tramite il link "Accedi" ti rimanda al form.È questo il cuore del problema,altrimenti se dovessi farlo per questo forum andrei direttamente alla pagina di login e mi loggherei.Per questo ci sono davvero tonnellate di guide su stackoverflow.

Risposta a edit: Devo cliccare un link nella home page che mi porta alla pagina di login per poi compilare il form.Come spiegato sopra è neccessario passare per la home page ahimè.

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: giovedì 4 giugno 2015, 18:02
da vaeVictis
Posta l'url della pagina, o il sorgente.

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: giovedì 4 giugno 2015, 18:12
da ubuntumate
Questo è il sorgente e naturalmente ho cambiato numero e password per motivi ovvi.

Codice: Seleziona tutto

 from mechanize import Browser
numero="3333333333"
password="password"
def login():
        browser = Browser()
        browser.set_handle_robots(False)
        response = browser.open("http://www.openwifimilano.it")
        iter = browser.links(text_regex="Accedi")
        # qui devo  trovare il link per accedere
login()

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: giovedì 4 giugno 2015, 18:15
da vaeVictis
Intendevo il sorgente html della pagina in cui devi cliccare "Accedi".
Quindi è "www.openwifimilano.it" ?

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: giovedì 4 giugno 2015, 18:20
da ubuntumate
Adesso sono a casa,se faccio CTRL + U sul sito indicato non si vede "Accedi" perchè sono su quella rete,ma quella di casa.Se vai sul sito openwifimilano.it vedi solo un'introduzione del servizio.Appena esco,mi salvo il sorgente.

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: giovedì 4 giugno 2015, 18:28
da vaeVictis
ubuntumate [url=http://forum.ubuntu-it.org/viewtopic.php?p=4765563#p4765563][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Adesso sono a casa,se faccio CTRL + U sul sito indicato non si vede "Accedi" perchè sono su quella rete,ma quella di casa.Se vai sul sito openwifimilano.it vedi solo un'introduzione del servizio.Appena esco,mi salvo il sorgente.
Sì, devi darmi il sorgente tu. Perché, come giustamente dici, se lo apro io non vedo quel link :)
Aspetto allora, ciao :)

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: giovedì 4 giugno 2015, 18:46
da ubuntumate
Volendo posso fare una prova con il nostro forum,cliccando sulla voce "forum" e poi "Accedi".Tanto il concetto è quello,solo che posso farlo da casa senza spostarmi.

Codice: Seleziona tutto

from mechanize import Browser
br = Browser()
response = br.open("http://www.ubuntu-it.org")
# Ora come clicco su " forum"?
br.follow_link(text_regex="forum") # va bene?

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: giovedì 4 giugno 2015, 21:32
da vaeVictis
Facciamo riferimento a questo forum.

Importi il Browser dal modulo mechanize e lo imposti come hai fatto

Codice: Seleziona tutto

from mechanize import Browser
br = Browser()
br.set_handle_robots(False)
Apri la pagina principale del forum

Codice: Seleziona tutto

br.open('http://forum.ubuntu-it.org/')
Cerchi il "link" del login

Codice: Seleziona tutto

for link in br.links():
  if link.url.endswith('login'):
    break
else: #linea aggiunta
  link=None #linea aggiunta
 
Lo "clicchi"

Codice: Seleziona tutto

if link: #linea aggiunta, con i due spazi sotto
  br.follow_link(link)
Al che, sei nella pagina del login.

Ora, per cercare il "link" puoi fare in diversi modi. Io ho usato un if di controllo sulla parte finale dell'url. Quando "pizzico" un link il cui url termina con la parola "login", tramite il break interrompo il ciclo for, quindi la variabile di nome link contiene l'url desiderato. Url che poi "clicco" con follow_link. Se riadatti al tuo caso la condizione che vedi nell'if, credo tu risolva il problema.

Fammi sapere :ciao:

edit:
Ho editato il codice, contrassegnandoti le linee che ho aggiunto.
Con il codice aggiunto, controlli di aver preso proprio il link che stai selezionando e non l'ultimo dell'iterazione for (l'else viene eseguito se (e in caso dopo che) l'ultima iterazione non va a buon fine. Per questo, se non trova quello che cerchi, imposta a None la variabile link, cosa che puoi controllare prima di fare operazioni sulla variabile).

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: venerdì 5 giugno 2015, 14:11
da ubuntumate
Ottimo! Grazie mille per l'aiuto!
Adesso provo ad adattarlo al mio caso,usando sempre questo forum come riferimento(fino a settimana prossima non ho modo di recuperare il sorgente),usando però regex al posto di endswith.Vorrei seguire un link in base a quel che sta in mezzo ai tag <a> </a>.

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: venerdì 5 giugno 2015, 14:36
da vaeVictis

Codice: Seleziona tutto

for link in br.links(text_regex='.*Accedi.*'):
  break
else:
  link=None

Codice: Seleziona tutto

if link:
  br.open(link.url)

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: venerdì 12 giugno 2015, 12:17
da ubuntumate
Grazie per la risposta che si è rivelara risolutrice .
L'ultimo problema che ho sorge quando voglio comporre l'url: ad esempio se faccio

Codice: Seleziona tutto

utente = "user"
url = "www.sito.it/utente =" + utente .....etc
br.open(url)
mi dice "TypeError: cannot concatenate 'str' and 'builtin_function_or_method' objects".Come faccio a comporre un 'url?

Re: [Python] Mechanize: Cliccare un link con testo uguale a

Inviato: venerdì 12 giugno 2015, 13:57
da vaeVictis
Riporta il codice che ti produce questo errore.