¿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.

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.


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)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.