¿Cómo usar Python para iniciar sesión en una página web y recuperar cookies para su uso posterior?

146

Quiero descargar y analizar la página web usando Python, pero para acceder necesito un par de cookies. Por lo tanto, primero debo iniciar sesión a través de https en la página web. El momento de inicio de sesión implica enviar dos parámetros POST (nombre de usuario, contraseña) a /login.php. Durante la solicitud de inicio de sesión, quiero recuperar las cookies del encabezado de respuesta y almacenarlas para poder usarlas en la solicitud para descargar la página web /data.php.

¿Cómo haría esto en Python (preferiblemente 2.6)? Si es posible, solo quiero usar módulos integrados.

mandom
fuente

Respuestas:

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()es el html directo de la página que desea abrir, y puede usar openerpara ver cualquier página usando su cookie de sesión.

Harley Holcombe
fuente
1
¿Es esto seguro? ¿Esto no permitirá que los rastreadores de paquetes vean las contraseñas de texto sin formato? ¿Usar Https sería más seguro?
Heartinpiece
2
@Heartinpiece Sí, si el servidor lo ofrece, debe usar HTTPS.
Harley Holcombe
Gracias ... pero imagina que iniciamos sesión y queremos publicar algo ... ¿cómo configurar Coockie en este hilo para publicar datos?
MLSC
Recomiendo utilizar la biblioteca de solicitudes si está escribiendo un código grande. (experiencia personal)
swapnil jariwala
157

Aquí hay una versión que usa la excelente biblioteca de solicitudes :

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
fuente
3
¿Es 'action': 'login'realmente necesario en este ejemplo, o es solo un parámetro adicional que se envía con la solicitud?
Ted
1
@Ted Esa parte es totalmente necesaria.
Sanghyun Lee
@Ted Quizás sea necesario en este ejemplo en particular. No fue necesario en mi programa.
Highstaker
Esto es lo mejor que sé. Es posible que tenga que datos según el sitio web.
Jithin Pavithran