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

146

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

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

mandom
источник

Ответы:

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

Харли Холкомб
источник
1
Это безопасно? Разве это не позволяет анализаторам пакетов видеть незашифрованные пароли? Будет ли использование Https более безопасным?
Heartinpiece
2
@Heartinpiece Да, если сервер предлагает это, вы должны использовать HTTPS.
Харли Холкомб
Спасибо ... но представьте, что мы вошли в систему и хотим опубликовать что-нибудь ... как установить coockie в этой теме для публикации данных?
MLSC
Настоятельно рекомендуем использовать библиотеку запросов, если вы пишете большой код. (личный опыт)
свапнил jariwala
157

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

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
Это 'action': 'login'действительно необходимо в этом примере, или это просто дополнительный параметр, который отправляется с запросом?
Тед
1
@Ted Эта часть совершенно необходима.
Санхьюн Ли
@Ted Может быть, это требуется в этом конкретном примере. Это не было нужно в моей программе.
Highstaker
Это лучшее, что я знаю. Возможно, вам придется данные в соответствии с веб-сайта.
Джитин Павитран