Come utilizzare Python per accedere a una pagina Web e recuperare i cookie per un utilizzo successivo?


146

Voglio scaricare e analizzare la pagina Web usando Python, ma per accedervi ho bisogno di un paio di cookie impostati. Pertanto prima devo accedere tramite https alla pagina web. Il momento di accesso prevede l'invio di due parametri POST (nome utente, password) a /login.php. Durante la richiesta di accesso, desidero recuperare i cookie dall'intestazione della risposta e memorizzarli in modo da poterli utilizzare nella richiesta per scaricare la pagina web /data.php.

Come lo farei in Python (preferibilmente 2.6)? Se possibile, voglio solo usare i moduli integrati.

Risposte:


147
import urllib, urllib2, cookielib

username = 'myuser'
password = 'mypassword'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'j_password' : password})
opener.open('http://www.example.com/login.php', login_data)
resp = opener.open('http://www.example.com/hiddenpage.php')
print resp.read()

resp.read()è il codice HTML diretto della pagina che desideri aprire e puoi utilizzare openerper visualizzare qualsiasi pagina utilizzando il cookie di sessione.


1
È sicuro? Questo non consentirà agli sniffer di pacchetti di vedere password in chiaro? L'uso di Https sarebbe più sicuro?
Heartinpiece il

2
@Heartinpiece Sì, se il server lo offre è necessario utilizzare HTTPS.
Harley Holcombe,

Grazie ... ma immagina di aver effettuato l'accesso e desideri pubblicare sth ... come impostare i cookie in questo thread per i dati dei post?
MLSC

Consiglio vivamente di utilizzare la libreria delle richieste se stai scrivendo codice di grandi dimensioni. (esperienza personale)
swapnil jariwala,

157

Ecco una versione che utilizza l'eccellente libreria di richieste :

from requests import session

payload = {
    'action': 'login',
    'username': USERNAME,
    'password': PASSWORD
}

with session() as c:
    c.post('http://example.com/login.php', data=payload)
    response = c.get('http://example.com/protected_page.php')
    print(response.headers)
    print(response.text)

3
'action': 'login'In questo esempio è effettivamente necessario o è solo un parametro aggiuntivo inviato con la richiesta?
Ted,

1
@Ted Quella parte è assolutamente necessaria.
Sanghyun Lee,

@Ted Forse è richiesto in questo esempio particolare. Non era necessario nel mio programma.
Highstaker,

Questo è il migliore che io conosca. Potrebbe essere necessario dati come da sito Web.
Jithin Pavithran,
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.