Come posso accedere a un sito Web con Python?


88

Come posso farlo? Stavo cercando di inserire un link specificato (con urllib), ma per farlo devo effettuare il login.

Ho questa fonte 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?

Risposte:


70

Forse vuoi usare twill . È abbastanza facile da usare e dovrebbe essere in grado di fare quello che vuoi.

Sarà simile al seguente:

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

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

submit('0')

È possibile utilizzare showforms()per elencare tutti i moduli una volta utilizzati go…per accedere al sito a cui si desidera accedere. Provalo dall'interprete Python.


si noti che in alcuni casi è necessario utilizzare submit (). vedi: lists.idyll.org/pipermail/twill/2006-August/000526.html Confermo questo problema, per me, accedendo a www.pge.com, usando submit () works.
user391339

2
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 2to3ma ora ottengo un ModuleNotFoundErrorquando provo a importarlo.
CGFoX

In realtà, potrei risolvere il problema ModuleNotFoundErrorusando / convertendo Twill 1.8.0 e installando lxmle requestscon pip install. Ma ora ottengo un messaggio SyntaxErrorquando provo a importare perché da qualche parte False = 0....
CGFoX

2
E 'una specie di dolore per risolvere il problema, ma funziona: stackoverflow.com/a/45459994/2745116
CGFoX

Funziona con siti HTTPS o devo fare qualcosa di simile questo ?
Mahesha999

53

Vorrei provare a semplificare, supponiamo che l'URL del sito sia www.example.com e che tu debba registrarti inserendo nome utente e password, quindi andiamo alla pagina di accesso dicendo http://www.example.com/login .php ora e visualizza il suo codice sorgente e cerca l'URL dell'azione che sarà nel tag del modulo qualcosa di simile

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

ora prendi userinfo.php per creare un 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.


questo non funziona per la maggior parte dei siti Web che ho provato
Anurag Pandey

Delle due dozzine di pagine di aiuto / stackoverflow che ho esaminato, questa era l'unica soluzione che funzionava sull'unico sito di cui avevo bisogno.
Boa

la scelta migliore per l'automazione web è webbot. stackoverflow.com/a/51170181/6665568
Natesh Bhat

Tutti i valori sono sempre nome utente e password? Non credo che questo funzioni per il mio sito scelto.
Dylan Logan

@DylanLogan Devi sempre controllare ciò che la pagina web effettiva invia al server e adattare il tuo script ad esso. Il server non dovrebbe essere in grado di distinguere tra il tuo script e il browser web.
Jeyekomon

28

In genere avrai bisogno dei cookie per accedere a un sito, il che significa cookielib, urllib e urllib2. Ecco una lezione che ho scritto quando giocavo ai giochi web di Facebook:

import cookielib
import urllib
import urllib2

# set these to whatever your fb account is
fb_username = "your@facebook.login"
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 avrai necessariamente bisogno dei gestori HTTPS o Redirect, ma non fanno male e rende l'apri molto più robusto. Potresti anche non aver bisogno dei cookie, ma è difficile dirlo solo dal modulo che hai pubblicato. Ho il sospetto che potresti, puramente dall'input "Ricordami" che è stato commentato.


19
import cookielib
import urllib
import urllib2

url = 'http://www.someserver.com/auth/login'
values = {'email-email' : 'john@example.com',
          '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


Il collegamento non funziona: a è 2stato aggiunto negli docs.python.orgURL: docs.python.org/2/library/urllib2.html
Michael Kopp

18

Automazione delle pagine web? Sicuramente "webbot"

webbot Funziona anche su pagine web che hanno id e nomi di classi che cambiano dinamicamente e hanno più metodi e funzionalità rispetto al selenio o alla meccanizzazione.

Ecco uno snippet :)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('mymail@gmail.com' , into='Email')
web.click('NEXT' , tag='span')
web.type('mypassword' , into='Password' , id='passwordFieldId') # specific selection
web.click('NEXT' , tag='span') # you are logged in ^_^

I documenti sono anche piuttosto diretti e semplici da usare: https://webbot.readthedocs.io


Questo esempio funziona alla grande. Funzionerà anche dove autocomplete=off.?
S Andrew,

non installare su Win 64 bit. Errore:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa

Prova a usare python3
Natesh bhat

Come gestire iframe in webbot .?.. intendo dire che devo chiudere un iframe che si apre dopo che la pagina è stata caricata ..
arihanth jain

7

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

Tutto ciò che serve è POSTl' auth/loginURL di un blob forma codificata con i vari campi che vedi lì (dimenticare le etichette for, sono decorazione per i visitatori). handle=whatever&password-clear=pwde così via, finché conosci i valori per l'handle (email AKA) e la password dovresti stare bene.

Presumibilmente quel POST ti reindirizzerà a qualche pagina "hai effettuato l'accesso con successo" con Set-Cookieun'intestazione che convalida la tua sessione (assicurati di salvare quel cookie e rimandarlo indietro su ulteriori interazioni durante la sessione!).


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.