Completar formularios con mechanize y BeautifulSoup

Python, mechanize y BeautifulSoup
Python, mechanize y BeautifulSoup

Hace unos días que estoy jugando con las librerías mechanize y BeautifulSoup, y la verdad que me han dejado con muchas ganas de seguir aprendiendo. En la entrada anterior les mostré un ejemplo sencillo de como acceder a los datos de una pagina web con Python y BeautifulSoup, hoy veremos como llenar un sencillo formulario con la librería mechanize, capturar la respuesta con BeautifulSoup y extraer los datos de interés de dicha respuesta.

Les dejo la entrada anterior: Web Scraping con Python y BeautifulSoup

Les dejo el código en GitHub: https://github.com/DiegoCaraballo/SignificadoDeNombres.git

Mechanize
La librería mechanize se utiliza para navegar a travez de formularios web. Sin rodeos y para que nos entendamos, automatiza la tarea de entrar en un sitio web, llenar un formulario (de Contacto por ejemplo) y enviarlo (Ejemplo: presionar el botón "Guardar", "Enviar", "Buscar", etc)
Si quieren saber un poco más, les dejo el enlace: https://pypi.python.org/pypi/mechanize/

Su instalación: pip install mechanize

Luego de estar haciendo algunas pruebas, se me vino una imagen a la cabeza

¿Y si no es un humano?
¿Y si no es un humano?

Script SignificadosDeNombres.py
Luego de ver que podía compartirles, tratando de que el código no fuera muy invasivo, se me ocurrió hacer un script que entre en un sitio que contiene el significado de muchos nombres (hay nombres que no aparecen :(), pida por un nombre y luego nos retorne su significado. El script es muy básico, pero pretende ser de ayuda para futuros códigos.

Buscar Nombre
Buscar Nombre
El formulario a llenar con mechanize
El formulario a llenar con mechanize

Las pruebas las hice en un sistema linux (Ubuntu) y probé nombres como (Diego, Roberto, Mariela, Mirta, etc).

En los comentarios del código explico sus lineas
Código:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Diego Caraballo
# www.pythondiario.com

# Importamos librerias necesarias
from bs4 import BeautifulSoup
import mechanize
import os

# Instanciamos el objeto br
br = mechanize.Browser()

# Opciones para el navegador
# Ingnora robots.txt
br.set_handle_robots(False)
br.set_handle_equiv(False)
# Simula ser una persona
br.addheaders = [('User-agent', 'Mozilla/5.0')] 

# Opcion para terminar el bucle
opcion = "N"

# Bucle para seguir mostrando nombres
while (opcion != "S"):
 nombre = raw_input("Ingrese un nombre: ")
 
 # Pagina web
 url = 'http://www.misabueso.com/nombres/nombre.php'

 br.open(url)   

 br.select_form(nr= 0)

 br.form[ 'nombre' ] = nombre
 print ""

 # Guardo el contenido del resultado de apretar el boton buscar en formato (html)
 data = br.submit()
 
 # Instancio el objeto soup
 soup = BeautifulSoup(data, "html.parser")

 # Busco dentro del div, donde tengo el texto del nombre
 div = soup.find_all("div", {"class" : "in_a_box"})
 
 # Cantidad de lineas
 cant = len(div)
 
 # Recorro hasta la penultima linea del div y luego muestro
 for i in div[:(cant-1)]:
  print i.text + "n"
  
 print ""
 
 opcion = raw_input("Presiones 'S' para Salir...")
 # Convierto la letra a Mayusculas
 opcion = opcion.upper()
 # Limpia pantalla, usar 'cls' para Windows
 os.system("clear")

Cualquier duda, comentario o sugerencia, siempre es bienvenida. Seguiré aprendiendo sobre el tema de la automatización y extracción de datos con Python y por lo tanto iré compartiendo lo aprendido. Saludos

  1. Unknown dice:

    Saludos Diego. Para completar formulario de una web externa, el script de python debe estar en un servidor?

    1. PythonDiario dice:

      Hola Ander, no entiendo que te refieres a una web externa? Si puedes plantearme mejor el caso.
      Saludos, Diego.

  2. Unknown dice:

    Hola Diego Caraballo, una pregunta, he intentado hacer lo mismo para una pagina en especial, pero esta pagina la modifican muy seguido, habra alguna forma de abrir esta pagina en python, poder acceder llenando a mano el formulario y despues capturar el link resultante y poder obtener los documentos de este link?

    1. PythonDiario dice:

      Hola Maricelam, lo que cambia es el login?
      Saludos y gracias por visitar el blog!!!

  3. Diego Lopez dice:

    Una pregunta es que en mi codigo bota un error al hacer el submit()
    muestra un error 405 method not allowed Sabes la solucion ?

  4. Unknown dice:

    Estimado Diego muy buen tutorial con BeautifulSoup, una pregunta cuando el campo a llenar es un campo selec o de vaias opcciones. Capo favor responderme con una lijera respuesta....Gracias

  5. Unknown dice:

    Hola diego yo quiero rellenar un formulario pero me da error en la pagina para entrar es como si la tuvieran tufada como puedo romper el tufe

  6. Juan Camilo Pérez dice:

    Hola Dario, tengo un problema al usar esta pagina https://reactivoenlinea.invima.gov.co/TransparenciaWeb/ y es que me deja introducir los valores del grupo y la fecha, y presionar el submit de consultar, pero cuando hago esto debería aparecer el boton de exportar, lo cual no me aparece. Sabes por qué pasa esto?
    Gracias.

    1. PythonDiario dice:

      Hola Juan ¿Cómo estás?
      Luego que presionas en consultar ¿El script espera algunos segundos? porque el botón veo que se carga después de load de carga (unos 2 segundos en mi caso). Quizá no está apareciendo porque no esperas que aparezca. Saludos

    2. Juan Camilo Pérez dice:

      Dario podrías enviarme el código que has usado por favor? No entiendo por qué a mi no me aparece ese botón si le estoy dando una espera luego de hacer la consulta.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Te has suscrito correctamente al boletín

Se produjo un error al intentar enviar tu solicitud. Inténtalo de nuevo.

Mi Diario Python will use the information you provide on this form to be in touch with you and to provide updates and marketing.