2008-10-09 2 views
138

Ich möchte Webseite mit Python herunterladen und analysieren, aber um darauf zuzugreifen, brauche ich ein paar Cookies gesetzt. Deshalb muss ich mich zuerst über https auf der Webseite einloggen. Der Login-Moment beinhaltet das Senden von zwei POST-Parametern (Benutzername, Passwort) an /login.php. Während der Login-Anfrage möchte ich die Cookies aus dem Response-Header abrufen und speichern, damit ich sie in der Anfrage verwenden kann, um die Webseite /data.php herunterzuladen.Wie benutze ich Python, um sich auf einer Webseite anzumelden und Cookies für die spätere Nutzung abzurufen?

Wie würde ich das in Python tun (vorzugsweise 2.6)? Wenn möglich, möchte ich nur eingebaute Module verwenden.

Antwort

144
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() ist der gerade HTML-Code der Seite, die Sie öffnen möchten, und Sie opener verwenden können jede Seite mit Ihrem Session-Cookie anzuzeigen.

+9

'resp.read()' geben Sie den Inhalt –

+1

Ist das sicher? Werden die Paket-Sniffer nicht Klartext-Passwörter sehen? Https wäre sicherer? – Heartinpiece

+2

@Heartinpiece Ja, wenn der Server es anbietet, sollten Sie HTTPS verwenden. –

149

Hier ist eine Version der ausgezeichneten requests Bibliothek:

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) 
+27

+1 Dies ist der moderne Weg, es in Python zu tun. –

+2

Ist ''action': 'login'' in diesem Beispiel wirklich notwendig, oder ist es nur ein zusätzlicher Parameter, der mit der Anfrage gesendet wird? – Ted

+1

@Ted Dieser Teil wird total benötigt. –

Verwandte Themen