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