Web Scraping con Selenium

En entradas anteriores comentabamos sobre el uso de Selenium para hacer test, en esta oportunidad lo utilizaremos para extraer datos de una web en particular, ahora manos a la obra.
Para hacer la extracción de datos primero necesitamos conocer bien la página web objetivo, en este caso es una página de consulta de datos de teléfonos de personas y empresas llamada “Páginas Blancas” su URL es la siguiente:
http://www.paginasblancas.pe/

Y también debemos conocer el modo de funcionamiento de la página en cuestión, en este caso se debe ingresar la cadena a buscar en una caja de texto y presionar un botón que dice “Buscar” para enviar la consulta, si hay datos coincidentes con el texto ingresado, la página nos mostrará una lista de resultados que contienen la razón social o nombre, la dirección y el teléfono:

Búsqueda

busqueda

Resultados

resultados

Nos ayudaremos con las herramientas que tiene Firefox para poder identificar los elementos HTML de la página objetivo:
Herramientas

Empezamos identificando la caja de texto donde se envían los datos a consultar:

caja

Y el botón que ejecuta la consulta:

boton

Ahora que ya tenemos identificados estos elementos procedemos a escribir nuestro script en python:

[sourcecode language="python"]

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os

def ir_paginas_blancas_web(cadena):
    driver = webdriver.Firefox()
    #Página a la que queremos acceder
    driver.get("http://www.paginasblancas.pe")
    lista_datos = []
    try:
        #Verificamos si el elemento con ID="nName" ya está cargado, este elemento es la caja de texto donde se hacen las busquedas
        WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "nName")))
        #Obtenemos la caja de texto de busquedas
        input_nombre = driver.find_element_by_id("nName")
        #Enviamos la cadena que estamos buscando
        input_nombre.send_keys(cadena)
        #Obtenemos el botón que ejecuta la búsqueda
        boton = driver.find_element_by_id("btnSrchName")
        #Damos click al botón
        boton.click()
    except:
        #Mostramos este mensaje en caso de que se presente algún problema
        print "El elemento no está presente"
    try:
        #Si se encuentran resultados la página los muestra en elementos de nombre "m-results-business"
        #Para ello esperamos que estos elementos se carguen para proceder a consultarlos
        WebDriverWait(driver, 5).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "m-results-business")))
    except:
        print ‘Elementos no encontrados’
    #Obtenemos en una lista los elementos encontrados
    resultados = driver.find_elements_by_class_name("m-results-business")
    for resultado in resultados:
        #En cada uno de los elementos encontrados buscamos un elemento interno que tiene por nombre info
        datos = resultado.find_element_by_class_name("info")
        #Dentro del elemento interno encontrado buscamos aquellos elementos que son enlaces(etiqueta <a>)
        nombre = datos.find_element_by_tag_name(‘a’)
        #Comprobamos si la cadena que buscamos coincide con la razón social o el nombre mostrado por la página
        if nombre.text.upper().find(cadena)<>-1 or cadena.find(nombre.text.upper())<>-1:
            #Obtenemos la parte de la dirección
            span = datos.find_elements_by_tag_name(‘span’)
            direccion = span[2].text
            partes_ubigeo = span[3].text.split(‘-’)
            distrito = partes_ubigeo[0].strip()
            try:
                departamento = partes_ubigeo[1].strip()
            except:
                departamento = ‘-’
        #Obtenemos los Datos telefonicos para ello debemos simular el click en el botón que dice "Ver Teléfono"
        boton_telefono = resultado.find_element_by_class_name("m-button–results-business–icon")
        boton_telefono.click()
        #Obtenemos los teléfonos que se muestran como enlaces
        enlaces = resultado.find_elements_by_tag_name(‘a’)
        telefono = enlaces[1].text.replace(‘ ‘, ”)
        #Finalmente metemos en una lista de listas los datos obtenidos
        lista_datos.append([direccion,distrito,departamento,telefono])

    driver.close()
    return lista_datos

def main():
    print ir_paginas_blancas_web(‘UNIVERSIDAD DE LIMA’)

main()

[/sourcecode]

 

Comentarios

Comments powered by Disqus