Uso de Python para iniciar sesión en el sitio web, completar un formulario y luego cerrar sesión

3 minutos de lectura

Como parte de mi búsqueda para mejorar en Python, ahora intento iniciar sesión en un sitio web que frecuento, enviarme un mensaje privado y luego cerrar sesión. Hasta ahora, he logrado iniciar sesión (usando urllib, cookiejar y urllib2). Sin embargo, no puedo averiguar cómo completar el formulario requerido para enviarme un mensaje.

El formulario se encuentra en /messages.php?action=send. Hay tres cosas que deben completarse para que se envíe el mensaje: tres campos de texto llamados nombre, título y mensaje. Además, hay un botón de envío (llamado “enviar”).

¿Cómo puedo rellenar este formulario y enviarlo?

  • posible duplicado de los valores de formulario de relleno en una página web a través de un script de Python (sin pruebas)

    – ravi404

    23 de enero de 2014 a las 8:26

Avatar de usuario de Jan Vorcak
Jan Vorcak

import urllib
import urllib2

name =  "name field"
data = {
        "name" : name 
       }

encoded_data = urllib.urlencode(data)
content = urllib2.urlopen("http://www.abc.com/messages.php?action=send",
        encoded_data)
print content.readlines()

solo reemplaza http://www.abc.com/messages.php?action=send con la URL donde se envía su formulario

responder a su comentario: si la url es la url donde se encuentra su formulario, y necesita hacer esto solo para un sitio web, mire el código fuente de la página y encuentre

<form method="POST" action="some_address.php">

y poner esta dirección como parámetro para urllib2.urlopen

Y tienes que darte cuenta de lo que submit el botón lo hace. Solo envía un Http solicitud a la url definida por action en la forma. Entonces, lo que haces es simular esta solicitud con urllib2

  • Vaya, lo siento. Es la página donde se encuentra el formulario. (continúa en el siguiente comentario gracias a mi tonto iPod)

    – Mateo

    19 de diciembre de 2011 a las 12:04


  • (continuación) ¡Gracias! Eso parece que funcionará. Lo intentaré por la mañana. ¿Eso también enviará el formulario o tengo que poner algo en la lista de datos para “enviar”?

    – Mateo

    19 de diciembre de 2011 a las 12:05

Puedes usar Mechanize para trabajar fácilmente con esto. Esto facilitará su trabajo de enviar el formulario. No olvide verificar con los parámetros como nombre, título, mensaje al ver el código fuente del formulario html.

import mechanize
br = mechanize.Browser()
br.open("http://mywebsite.com/messages.php?action=send")
br.select_form(nr=0)
br.form['name'] = 'Enter your Name'
br.form['title'] = 'Enter your Title'
br.form['message'] = 'Enter your message'
req = br.submit()

Quiere que el mecanizar biblioteca. Esto le permite automatizar fácilmente el proceso de navegar por sitios web y enviar formularios/seguir enlaces. El sitio al que me he vinculado tiene muy buenos ejemplos y documentación.

  • 😀 Ya lo tengo instalado, ¡voy a jugar con él! Gracias: D

    – Mateo

    20 de diciembre de 2011 a las 2:32

  • Recibo este error cuando trato de importar mecanizar: Rastreo (última llamada más reciente): Archivo ““, línea 1, en importar mecanizar Archivo “C:\Users\Admin\Desktop\WinPython -64bit-3.6.1.0Qt5\python-3.6.1.amd64\lib\site-packages\mechanize_en eso_.py”, línea 119, en de _version import versión ModuleNotFoundError: ningún módulo llamado ‘_version’

    – chica101

    15 de marzo de 2018 a las 10:23

Trate de resolver las solicitudes que se realizan (por ejemplo, utilizando la herramienta de desarrollo web de Chrome o con Firefox/Firebug) e imite la solicitud POST que contiene los datos del formulario deseado.

Además de la gran biblioteca mecánica mencionada por Andrew, en caso de que también te sugiero que uses HermosaSopa para analizar el HTML.

Si no quiere usar mechanize pero aún quiere una solución fácil y limpia para crear solicitudes HTTP, le recomiendo el excelente peticiones módulo.

Para publicar datos en la página web, use cURL algo como esto,

curl -d Name="Shrimant" -d title="Hello world" -d message="Hello, how are you" -d Form_Submit="Send" http://www.example.com/messages.php?action=send

La opción “-d” le dice a cURL que el siguiente elemento son algunos datos que se enviarán al servidor en http://www.ejemplo.com/mensajes.php?action=send

¿Ha sido útil esta solución?