Wie kann ich mich mit Python auf einer Webseite anmelden und Cookies für die spätere Verwendung abrufen?

146

Ich möchte die Webseite mit Python herunterladen und analysieren, aber um darauf zugreifen zu können, müssen ein paar Cookies gesetzt werden. Daher muss ich mich zuerst über https auf der Webseite anmelden. Der Anmeldemoment umfasst das Senden von zwei POST-Parametern (Benutzername, Kennwort) an /login.php. Während der Anmeldeanforderung möchte ich die Cookies aus dem Antwortheader abrufen und speichern, damit ich sie in der Anforderung zum Herunterladen der Webseite /data.php verwenden kann.

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

mandom
quelle

Antworten:

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()ist das reine HTML der Seite, die Sie öffnen möchten, und Sie können openerjede Seite mit Ihrem Sitzungscookie anzeigen.

Harley Holcombe
quelle
1
Ist das sicher? Erlaubt dies Paket-Sniffern nicht, Klartext-Passwörter zu sehen? Wäre die Verwendung von HTTP sicherer?
Herzstück
2
@Heartinpiece Ja, wenn der Server es anbietet, sollten Sie HTTPS verwenden.
Harley Holcombe
Vielen Dank ... aber stellen Sie sich vor, wir haben uns angemeldet und möchten etwas posten ... wie man Coockie in diesem Thread für Post-Daten einstellt?
MLSC
Es wird dringend empfohlen, die Anforderungsbibliothek zu verwenden, wenn Sie großen Code schreiben. (persönliche Erfahrung)
Swapnil Jariwala
157

Hier ist eine Version, die die Bibliothek für hervorragende Anfragen verwendet:

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)
Boden Garman
quelle
3
Ist 'action': 'login'dies in diesem Beispiel tatsächlich erforderlich oder handelt es sich nur um einen zusätzlichen Parameter, der mit der Anforderung gesendet wird?
Ted
1
@ Ted Dieser Teil wird unbedingt benötigt.
Sanghyun Lee
@ Ted Vielleicht ist es in diesem speziellen Beispiel erforderlich. Es wurde in meinem Programm nicht benötigt.
Highstaker
Das ist das Beste, was ich weiß. Möglicherweise müssen Sie Daten gemäß Website angeben.
Jithin Pavithran