sábado, 20 de agosto de 2016

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

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

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

      Eliminar
  2. 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?

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

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

    ResponderEliminar
  4. 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

    ResponderEliminar
  5. 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

    ResponderEliminar
  6. 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.

    ResponderEliminar
    Respuestas
    1. 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

      Eliminar
    2. 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.

      Eliminar

Tu comentario es importante y nos motiva a seguir escribiendo...

Powered by Blogger .