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
Resultados
Nos ayudaremos con las herramientas que tiene Firefox para poder identificar los elementos HTML de la página objetivo:
Empezamos identificando la caja de texto donde se envían los datos a consultar:
Y el botón que ejecuta la consulta:
Ahora que ya tenemos identificados estos elementos procedemos a escribir nuestro script en 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()