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.

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.


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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.