2008-10-09 6 views
138

Chcę pobrać i parsować stronę przy użyciu Pythona, ale aby uzyskać do niej dostęp, potrzebuję kilku plików cookie. Dlatego muszę najpierw zalogować się przez stronę https do strony internetowej. Moment logowania polega na wysłaniu dwóch parametrów POST (nazwa użytkownika, hasło) do /login.php. Podczas żądania logowania chcę odzyskać pliki cookie z nagłówka odpowiedzi i zapisać je, aby móc je wykorzystać w żądaniu pobrania strony/data.php.Jak używać Pythona do logowania się na stronie internetowej i pobierania plików cookie do późniejszego wykorzystania?

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

Odpowiedz

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() jest prosty HTML strony, którą chcesz otworzyć, a można użyć opener aby wyświetlić dowolną stronę przy użyciu sesji ciasteczko.

+9

'resp.read()' daje zawartość –

+1

Czy to bezpieczne? Czy to nie pozwoli, aby sniffery pakietów widziały hasła w postaci zwykłego tekstu? Czy korzystanie z protokołów Https byłoby bezpieczniejsze? – Heartinpiece

+2

@Heartinpiece Tak, jeśli serwer go oferuje, powinieneś użyć HTTPS. –

149

Oto wersja używając doskonałą requests bibliotekę:

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 Jest to nowoczesny sposób, aby to zrobić w python. –

+2

Czy "akcja": "login" jest rzeczywiście konieczna w tym przykładzie, czy jest to tylko dodatkowy parametr, który jest wysyłany wraz z żądaniem? – Ted

+1

@Ted Ta część jest całkowicie potrzebna. –

Powiązane problemy