Как использовать Python для входа на веб-страницу и получения файлов cookie для последующего использования?

Я хочу загрузить и проанализировать веб-страницу с помощью python, но для доступа к ней мне нужно установить несколько файлов cookie. Поэтому мне сначала нужно войти через https на веб-страницу. Момент входа в систему включает отправку двух параметров POST (имя пользователя, пароль) в /login.php. Во время запроса на вход я хочу получить файлы cookie из заголовка ответа и сохранить их, чтобы использовать их в запросе на загрузку веб-страницы /data.php.

Как мне сделать это на Python (желательно 2.6)? Если возможно, я хочу использовать только встроенные модули.


person mandom    schedule 09.10.2008    source источник


Ответы (2)


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() - это прямой HTML-код страницы, которую вы хотите открыть, и вы можете использовать opener для просмотра любой страницы с помощью файла cookie сеанса.

person Harley Holcombe    schedule 09.10.2008
comment
Это безопасно? Разве это не позволит анализаторам пакетов видеть пароли в виде открытого текста? Будет ли использование HTTPS более безопасным? - person Heartinpiece; 10.12.2012
comment
@Heartinpiece Да, если сервер предлагает это, вы должны использовать HTTPS. - person Harley Holcombe; 11.12.2012
comment
Спасибо ... но представьте, что мы вошли в систему и хотим опубликовать что-то ... как установить coockie в этой ветке для данных публикации? - person MLSC; 09.06.2014
comment
Настоятельно рекомендую использовать библиотеку запросов, если вы пишете большой код. (личный опыт) - person swapnil jariwala; 29.08.2015
comment
@HarleyHolcombe, какой Python 3 эквивалентен этому коду? - person Mohsen Kiskani; 09.12.2020

Вот версия, использующая отличную библиотеку requests:

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)
person Boden Garman    schedule 24.08.2012
comment
Действительно ли 'action': 'login' необходим в этом примере или это просто дополнительный параметр, отправляемый с запросом? - person Ted; 26.06.2014
comment
@Ted Эта часть совершенно необходима. - person Sanghyun Lee; 16.03.2015
comment
@Ted Может быть, это требуется в данном конкретном примере. В моей программе это было не нужно. - person Highstaker; 08.01.2016
comment
Это лучшее, что я знаю. Возможно, вам понадобятся данные в соответствии с веб-сайтом. - person Jithin Pavithran; 21.11.2016