Jak używać Pythona do logowania się na stronie internetowej i pobierania plików cookie do późniejszego wykorzystania?

146

Chcę pobrać i przeanalizować stronę internetową za pomocą Pythona, ale aby uzyskać do niej dostęp, potrzebuję zestawu kilku plików cookie. Dlatego muszę najpierw zalogować się do strony internetowej przez https. Moment logowania polega na wysłaniu dwóch parametrów POST (nazwa użytkownika, hasło) do /login.php. Podczas żądania logowania chcę pobrać pliki cookie z nagłówka odpowiedzi i zapisać je, aby móc ich użyć w żądaniu pobrania strony internetowej /data.php.

Jak miałbym to zrobić w Pythonie (najlepiej 2.6)? Jeśli to możliwe, chcę używać tylko wbudowanych modułów.

mandom
źródło

Odpowiedzi:

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()to prosty kod HTML strony, którą chcesz otworzyć, i możesz użyć openerdo wyświetlenia dowolnej strony za pomocą pliku cookie sesji.

Harley Holcombe
źródło
1
Czy to jest bezpieczne? Czy to nie pozwoli snifferom pakietów zobaczyć hasła w postaci zwykłego tekstu? Czy korzystanie z HTTPS byłoby bezpieczniejsze?
Heartinpiece
2
@Heartinpiece Tak, jeśli serwer to oferuje, powinieneś użyć HTTPS.
Harley Holcombe
Dziękuję ... ale wyobraź sobie, że się zalogowaliśmy i chcemy coś wysłać ... jak ustawić coockie w tym wątku dla danych postów?
MLSC
Gorąco polecam korzystanie z biblioteki żądań, jeśli piszesz duży kod. (osobiste doświadczenie)
swapnil jariwala
157

Oto wersja korzystająca z doskonałej biblioteki żądań :

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
źródło
3
Czy jest to 'action': 'login'rzeczywiście konieczne w tym przykładzie, czy jest to tylko dodatkowy parametr wysyłany z żądaniem?
Ted
1
@Ted Ta część jest całkowicie potrzebna.
Sanghyun Lee
@Ted Może jest to wymagane w tym konkretnym przykładzie. Nie było to potrzebne w moim programie.
Highstaker
To najlepsze, o czym wiem. Możesz potrzebować danych jak na stronie internetowej.
Jithin Pavithran