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.