Emprender o buscar un empleo

Meme sobre Emprender o buscar un empleo

Cuando estaba en la universidad escuchaba frecuentemente que una de las claves del éxito es emprender. Podía sentir el entusiasmo de esa tan aclamada libertad sin jefes que te dieran órdenes y con un horario flexible al ritmo de trabajo que tu decidas. Actualmente, puedes encontrar mucha información de como ser un emprendedor exitoso en cada rincón del internet. Pero ¿se trata de emprender por emprender? ¿Qué implicaciones tiene el emprender?

Reconozco que suena tentador de los grandes beneficios de emprender. Sin embargo, deberíamos ver el mapa completo antes de tomar riendas en esta gran aventura. Te presento cinco puntos a considerar para emprender o buscar un empleo:

Cinco criterios a tomar en cuenta antes de emprender

1. Tengo una excelente idea que revolucionará al mundo

Las ideas pueden ser buenas sin importar de quien vengan. Son interesantes cuando las escuchas y cuando te imaginas los escenarios de un éxito asegurado. Pero después de pensar en esa gran idea, viene la ejecución. Tienes que conocer el segmento donde te piensas enfocar y para eso se requiere experiencia. ¿cuentas con esa experiencia?

Otro punto importante a tomar en cuenta son tus redes de contactos. Sino la tienes, ¿tienes algún público objetivo al que le deseas ofrecer ese valor agregado? A nivel personal ¿Porqué quieres emprender antes de buscar un empleo?

La capacidad de trabajar en equipo también es crucial. Ya sea que formes un equipo de trabajo o formes parte de uno, necesitas estar acostumbrado a comunicarte y llevar un ritmo de trabajo colaborativo.

Lo que quiero llegar con todo esto, es que una simple idea que quiere cambiar el mundo no es suficiente. Tienes que hacerte las preguntas correctas para después responderlas. Sino trabajas en proyectar tu plan de trabajo, tienes el fracaso asegurado y en el peor de los casos nunca entenderás porque tu idea no fue exitosa.

No se invierte en puras ideas, se invierte en realidades

Antonio Barros, fundador de Grupo Intercom

2. Networking en el trabajo

Cuando salí de la universidad de la carrera de Ingeniería en Sistemas, mi primer empleo fue en una empresa de gas. No estaba contento con mi trabajo porque, según yo, no estaba explotando mis habilidades dada mi nula experiencia en el sector laboral. Me dedicaba a dar soporte a las computadoras de la empresa, cambiaba algún cable, un mouse y así. Sentía que todo era rutinario.

En ese entonces, la empresa estaba actualizando los sistemas de Call Centers para un nuevo servicio que querían ofrecer a los clientes. Toda la gestión y el desarrollo venia hecho. Nosotros como soporte, estábamos a cargo de informar que todo estaba marchando bien. ¿Divertido, no?

Para la tarea de la capacitación, llegó Martin Esquivel. Él se encargó de capacitar al personal de Call Center y a los directivos de la empresa en la zona local. Un día le enseñé las playas de Isla Mujeres un fin de semana que nos tocó descansar. Tuvimos la oportunidad de platicar de muchas cosas, sin embargo, lo que más me llamaba la atención era su abundante experiencia en organización de proyectos.

Martín hablaba de temas que me emocionaban pero que no tenía ni la más mínima idea. Era notable su experiencia en el ramo, me puse a investigar en los tips que salían de esa conversación informal. Me dio un consejo que consideré muy valioso y que por lo tanto empecé a valorar mi empleo:

Trabaja en varias empresas antes de que quieras emprender un negocio

3. Lecciones que enseñan a emprender mejor

Martín me decía que todas las empresas tienen su forma de operar particular. De ahí lo resumí sus puntos importantes:

  • Las empresas crearon sistemas que les funcionan bien durante años, aprende de ellas.
  • Una mala decisión le cuesta dinero a una empresa. Como colaborador, aprende de ese error. Te estarías ahorrando el costo de esa mala decisión cuando crees tu propia empresa.
  • Conoces como funciona un equipo de trabajo de manera colaborativa. Si detectas puntos débiles en la comunicación, aprenderás a solventarlos cuando sea tu turno de crear tu propio equipo de trabajo.
  • Interactúa con mucha gente: Todos tienen algo que aportar en tu conocimiento. Desde un compañero de trabajo hasta tus jefes.
  • Crea lazos profesionales: Tu red de contactos se forma desde antes de emprender, incluso desde la universidad.

Como verás, en un trabajo puedes aprender mucho del funcionamiento interno de una empresa. Por lo tanto, tu objetivo debe ser en trabajar por los conocimientos, así no sea la mejor oferta salarial. Te meta es aprender como funciona un negocio desde adentro. También es importante buscar que te deleguen más responsabilidades. Te recomiendo que no sean empresas muy grandes porque tienen procesos muy definidos y son pocos disruptivos. Es decir, que las cosas se hacen estrictamente siguiendo el manual de otro.

4. Oportunidades de crecimiento

Las empresas llegan a ser la verdades fuentes del conocimiento ya que esto te mantiene vigente en el mundo laboral. Tu experiencia depende mucho del tiempo y los desafíos que enfrentas todo el tiempo. Como mencioné anteriormente, el salario es menos relevante en estos casos.

Un empleo no evita que vayas a eventos de emprendimiento y co-working. Trata de tomar cursos de temas que te sean relevantes para ti, nunca dejes de aprender. Capacítate en temas que aun no domines.

Te tengo un sorpresa, para emprender una idea de negocio, requieres aprender el manejo de temas fiscales, financieros, de ventas, etc. Al menos tener los fundamentos básicos en cada una de ellas. Te puedes apoyar de personas experimentadas, que pueden ser parte de tu equipo de trabajo o externos, pero es prescindible conocer esos temas para tomar decisiones informadas.

5. Tu habilidad en el ámbito financiero

Todos los recursos son limitados. A diferencia de un empleo, tienes que administrar bien lo que gastas en tu día a día. Sólo tu asumes las consecuencias de tus decisiones. La siguiente formula me encanta porque proyecta de que depende la cantidad que puedes ingresas.

Fórmula de tus ingresos

Para entender mejor ese concepto, quiero poner dos casos de un emprendedor y un empleado. Un emprendedor, además de dominar las habilidades en su área debe tener la capacidad de dominar otras áreas. De tal manera que financieramente no muera a mediano plazo. Viendo la siguiente gráfica ¿a quién le va mejor financieramente?

En los ingresos del empleado podemos ver un sueldo estable que varía a razón del tiempo que le dedica al trabajo. Sin embargo, la volatilidad de sus ingresos es mínimo. En promedio tiene un ingreso mensual de 618 dólares.

El emprendedor tiene una vida más divertida. Al principio, suelen tener más perdidas que ganancias. Si eres hábil, puedes encontrar un punto de equilibrio pronto. En este ejemplo, estoy suponiendo que cobró pagos atrasados de clientes a los que les trabajó en ese meses. Entre Septiembre y Octubre tuvo una temporada baja en los ingresos pero se recupera de nuevo. Tiene en promedio un ingreso mensual de 660 dólares.

Los dos están técnicamente empatados. Sin embargo, las habilidades de negocio del emprendedor pueden hacer que sus ingresos sean mayores invirtiendo el mismo tiempo. Para ello, necesita estar aprendiendo constantemente para que un futuro pueda crear sistemas que le permita automatizar una parte de su trabajo.

Las posibilidades para que el empleado pueda incrementar sus ingresos es: invertir más tiempo en el trabajo, pedir un aumento o cambiar de empleo.  Para las dos últimas opciones, necesita estar aprendiendo constantemente.

Como conclusión

El objetivo de este post es mostrar varios escenarios donde el empleo puede ser un buen lugar de aprendizaje. Si tienes un mal jefe o un mal líder, la culpa es tuya. Mi recomendación es que busques empresas que permitan desenvolverte profesionalmente. Si después de un tiempo sientes que el trabajo se vuelve rutinario, puedes pedir que te promuevan a otra área o busques nuevas oportunidades de empleo.

Si tu intención es emprender, empieza a involucrarte en eventos empresariales. Por ejemplo, en México existe la Semana Nacional del Emprendedor. Al asistir de manera presencial, tienes la oportunidad de conocer personas con tus mismas pasiones. Incluso, tienes la oportunidad de involucrarte en algún proyecto de emprendimiento. Invierte mucho en conocimiento.

Eviten llevarse por historias como las de Mark Zuckerberg, Bill Gates o Steve Jobs. En su momento, ellos tuvieron la oportunidad de explotar un mercado con grandes oportunidades y se rodearon de personas extraordinarias. Por eso, la importancia de hacer networking en cada oportunidad que se presente. Sólo me queda decirte:

Si arrancas demasiado pronto con poca experiencia, la caída será más rápida.

Espero haya sido de tu agrado esto post. Prometo que trataré de ser más constantes con mis publicaciones. Si te pareció útil te agradecería si me ayudas a compartir. Cualquier duda o comentario, con gusto leeré tus comentarios y tu feedback.

¿Las deudas son buenas o malas?

¿Las deudas son buenas o malas?

Un día vi un profesor en twitter, llamado Miguel, que se estaba quejando porque su compañero Andrés viene en un coche de los que él jamás se podría permitir. Además, tenía una casa en una zona accesible con todo lo básico. Paré la oreja cuando Miguel mencionó que ambos ganaban lo mismo.

Cabe mencionar que los dos ganan entre 15 a 20 mil pesos mensuales. En la conversación, sus seguidores mencionaron varios escenarios:

  • Gasta más de lo que puede acceder.
  • Ahorró durante muchos años antes de tener todo eso.
  • Recibió una herencia o vendió su patrimonio anterior antes de mudarse.

Lo que muchos no saben es que Andrés tampoco tiene mucha suerte y estaba en la misma posición que Miguel. Pero Andrés recurrió al endeudamiento. Así es, a esas instituciones que todo mundo corremos cuando los escuchamos. Sin embargo, es la única alternativa para tener las cosas si en verdad te hacen falta.

Andrés estuvo evaluando pros y contras. Su primera opción era ahorrar y cuando tuviera el monto completo se iba a disponer a comprar su coche y posteriormente su casa. La mejor alternativa terminó siendo el endeudamiento.

Financiamiento del coche

Existen una infinidad de concesionarias que ofrecen financiamiento de 2 o más años. No veo imposible que una persona con un sueldo superior a 15 mil no pueda acceder a un tipo de financiamiento similar.

Resulta que a Andrés le gustó un modelo Ford, se llama Figo 2018. El cual tiene un precio de $ 198,400.00 con pago al contado.

Ford Auto Figo 2018

Pero Andrés necesitaba el carro con urgencia porque tenía que llevar a su hijo a la escuela y a su esposa Luisa a la estación de autobuses para ir a trabajar. Andrés estuvo de suerte porque la concesionaria ofrecía un financiamiento por 24 meses a tasa cero.

Tabla de amortización para el auto a 24 meses

Como vemos en la tabla, Andrés pagó $ 7,291.00 mensuales durante 24 meses. Lo que le permitió acceder al automóvil y ahorrarse un gran costo en transporte.

Conseguir casa a través de una hipoteca

Luisa, gana un sueldo similar al de su esposo. Sin embargo, ella gasta aproximadamente $ 5,000.00 en gastos de viaje y alimentación porque su lugar de trabajo está a una hora de su casa. De los $ 10,000.00 mensual que le queda, junta su sueldo con el de Andrés para pagar la hipoteca.

¿A que clase de hipoteca pudieron acceder? Una que sea, de acuerdo a sus posibilidades de pago. Ellos pudieron acceder a un crédito hipotecario a 20 años.

Hipoteca a 20 años para un valor de $ 800,000.00 pesos

De acuerdo a la tabla de amortización de este conocido banco, ellos hacían un pago aproximado de $ 7,269.00 mensuales contando los seguros y comisiones del banco.

Con estos gastos si sumamos los $ 7,269.00 + 7,291.00, mensualmente pagan $ 14,560.00. El sueldo mensual de Andrés y Luisa son de $ 25,000.00, descontando los $5,000.00 que Luisa gasta en transporte. Mensualmente les queda $ 10,440.00 para sus gastos diarios.

Tener en cuenta que el pago del coche es por dos años, esperando que tenga una vida útil de 5 años. Una vez, terminen de pagar el coche, la única deuda será la hipoteca.

Conclusiones

A raíz de todo esto, ¿las deudas son buenas o malas? Depende del uso que le des. Andrés y Luisa no tenían ahorros que les permitieran obtener las cosas de contado.

Sino hubieran recurrido a la deuda. Andrés hubiera gastado un 30% más en transportar a sus hijos y hacer las diligencias del hogar. Luisa hubiera sumado otros $ 1,000.00 pesos a los costos de transporte. Sino hubieran solicitado la hipoteca, estarían pagando un renta de $ 5,000.00 pesos con la diferencia que en 20 años la casa no sería suya.

No existen deudas buenas o malas. Sólo son instrumentos que se deben de usar de manera inteligente. Sino necesitas endeudarte, no lo hagas.

Olvidé comentar que Miguel es una persona que presume unas lindas fotos de sus viajes con su novia. Todos los recursos son limitados, incluso el dinero que llega a nuestras manos. Eso no quiere decir que Andrés y Laura no puedan costearse un viaje después de pagar su coche. Todo se puede, pero debemos saber lidiar con esa limitación financiera con una buena gestión de nuestros recursos.

Espero que este post te haya sido de utilidad. Si deseas aportar algo más al artículo, puedes exponerlo en la caja de comentarios. Si te gustó, te ruego me ayudes a compartir.

¿Qué es outbound marketing?

¿Outbound Marketing? En esta ocasión te hablaremos de lo que trata esta metodología. ¿Recuerdas que en el post anterior  hablamos de Inbound marketing?

Comprender estos dos términos es importante para todos los que trabajan en el área, ya sea en el marketing digital o en el tradicional.  Sin embargo, todavía es común encontrar a personas que no entienden que significa inbound y outbound marketing, o incluso llegan a confundir estos términos.

¿Qué es outbound marketing?

El Outbound Marketing o marketing tradicional es el conjunto de acciones centrada en el producto o servicio lo cual intenta captar la atención de los clientes, teniendo como objetivo la venta.

La metodología del Outbound Marketing, en pocas palabras, se trata de emplear métodos más agresivos interrumpiendo lo que está viendo, leyendo o escuchando el cliente para hablarle de tu producto o servicio.

Claro ejemplo de outbound marketing es la publicidad que se transmiten en la televisión, en carteles, avisos impresos en periódicos y revistas. Este tipo de marketing tradicional años atrás era muy recurrente ya que éstas eran las únicas maneras de que las marcas llegaran a sus consumidores.             

Características Outbound marketing

  • Es una herramienta utilizada en publicidad que se centra en vender un servicio o un producto en un único sentido.
  • La empresa va hasta el cliente.
  • Los clientes son buscados en medios como radio, televisión, prensa, emailing y también banners.
  • También se caracteriza por aparecer de manera intrusiva.
  • Tiene un costo mayor de adquisición de cliente.
  • Busca ofertar los productos y servicios de la marca de forma directa a través de una prospección activa.

 

Outbound Marketing en la actualidad

Hoy en día Outbound Marketing está perdiendo fuerza frente a lo que hemos conocido como Inbound Marketing, pero es un error dejar del todoa un lado el outbound, ya que ambas estrategias son complementarias.

En la actualidad Outbound Marketing se presenta como esos molestos banners que aparecen al entrar a una página web, o los banners de productos que encontramos posicionados en una parte de la página de noticias de algún medio de comunicación

No se puede decir, que estrategia es mejor ya que todo dependerá de las características de tu empresa, de tus objetivos, recursos y principalmente al público que te diriges.

 

Espero este post te sea de mucha utilidad, por supuesto, esperamos tus sugerencias y comentarios.

¡Comparte si te ha gustado!

Web scraping automatizado para hoteles con PHP

En el tutorial anterior, generamos una página web de hoteles que extrae una lista de habitaciones directamente con la fuente. Sin embargo, esto genera problemas en tiempos de respuesta para el usuario final. Sin embargo, llega a ser muy pesado para nuestro sitio web y para nuestros visitantes. Así que, nuestro objetivo es resolver la optimización de tiempos de respuesta del sitio con Web scraping automatizado.

Conociendo el proyecto

Como punto de partida, te comparto el código fuente del script para hacer scraping un sitio web de hoteles. El cual nos servirá de referencia:

Descargar script

¿Como funciona actualmente este proyecto?

El procedimiento funciona a través de una llamada síncrona, el sitio web finalizará una vez que el script obtenga los datos del portal de TripAdvisor.

De acuerdo a la línea de tiempo, desde que el usuario solicita información al sitio, éste recorre varios nodos haciendo varias peticiones para resolver el resultado final. Entre sus inconvenientes de este método, nos encontramos:

  • El hecho de recorrer varios nodos, hace que el tiempo de respuesta sea más largo. Se genera una dependencia. Cuando se rompe en algún punto del camino, la experiencia del usuario sería poco agradable.
  • Existiría una sobrecarga en nuestro servidor porque cliente -> servidor -> fuente para después, fuente -> servidor -> cliente. Al hacer esto todo el tiempo, hará que consuma muchos recursos del sistema cada vez que entra un nuevo usuario.
  • Regresando a las dependencias. No podemos controlar lo que hacen terceros. Si el equipo de desarrollo de TripAdvisor se le ocurre actualizar las vistas de sus sitios, inmediatamente nuestra página queda fuera de línea.

Todos esos casos pueden llega a ser críticos si llegaran a suceder. Lo más importante es poder ofrecer una excelente experiencia de usuario con los datos obtenidos de terceros. Para esto, requieres una serie de pasos para mejorar la salud del sitio web por medio de la automatización.

Uso de una base de datos

Para resolver estas observaciones, necesitamos cambiar un poco la estructura del proyecto. El objetivo será reducir los tiempos de respuesta para obtener las habitaciones más populares. Para conseguirlo, haremos uso de una base de datos que contenga la información necesaria para la consulta directa.

Workflow de web scraping en BD con MySQL

Con la información en la base de datos, el acceso a los datos es directo. Por lo tanto, el usuario no tiene que esperar a que el sitio haga un scraping a la página fuente. Para tener esa información actualizada necesitas un script que obtenga esos datos periódicamente para mantenerlo actualizado.

Pasos para realizar el refactoring del sitio web

Es hora de hacer refactoring al código que le hará scraping a la página de hoteles. Para esto necesitamos trabajar en varias etapas.

1. Generar la base de datos

Para la estructura, solo requieres una tabla que guarde la relación de habitaciones obtenidas. En mi caso, crearé un par de tablas para agregarle un poco más de información.

Habitaciones ingresadas en base de datos mysql

De acuerdo al diagrama anterior, existen dos tablas que nos servirán para este propósito:

  • Cities: Esta tabla servirá para conocer las ciudades que queremos extraer. Cada registro cuenta con una url de cada fuente.
  • Rooms: Guarda todas las habitaciones obtenidas del script, segmentados por ciudades.

Descarga la Base de datos

2. Crear el conector de la base de datos

// File: connector.php
// Source: https://secure.php.net/manual/en/function.mysqli-connect.php
$mysqli = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
// Verifica si la conexión es correcta
if (!$mysqli) {
echo "Error: Unable to connect to MySQL." . PHP_EOL; echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; exit;
}

Si no existe un problema, la conexión de base de datos debería correr sin algún inconveniente.

3. Generar el scraper dinámico


// scraper.php
// Call dependences
require 'simple_html_dom.php';
require 'connector.php';
require 'utils.php';
// Crea un objeto de funciones genéricas
$utils = new Utils;
// Antes de obtener nuevos datos, elimina los anteriores
mysqli_query($mysqli, "TRUNCATE TABLE `rooms`");
// Lista las ciudades: 1 => Isla Mujeres, 2 => Cancún, 3 => Playa del Carmen, 4 => Tulum
if ($result = $mysqli->query("SELECT id, source FROM `cities`")) {
/* Recorre todas las ciudades obtenidas para hacer scraping de esas ciudades */
while ($row = mysqli_fetch_assoc($result)) {
// Asigna valores a variables locales
$city_id = $row['id'];
$city_source = $row['source'];
// Crea el objeto DOM de la url fuente con el contenido
$html = file_get_html($city_source, false, null, 0);
// Todos los items de habitaciones fuente tienen esta clase
$wrap_hotels = $html->find('div.prw_meta_hsx_responsive_listing');
// Recorrer todos los contenedores de las habitaciones fuente
foreach($wrap_hotels as $element) {
// Guarda en variables locales, los datos específicos de cada habitación.
$hotel_name = $element->find('.property_title', 0)->plaintext;
// ¿Recuerdas la clase utils? Necesito quitar el formato MX$0.00 y convertirla a numérico
$hotel_price = $utils->format_price_to_int($element->find('.price', 0)->plaintext);
// También necesito obtener la url correcta con esta función prediseñada
$hotel_image_url = $utils->get_standar_image_url($element->find('.inner', 0)->attr);
$hotel_href = $element->find('.photo-wrapper a', 0)->href;
// Guardar esta habitación a la base de datos
mysqli_query(
$mysqli,
"INSERT INTO `rooms` (city_id, name, price, image_url, href)
VALUES ('$city_id', '$hotel_name', '$hotel_price', '$hotel_image_url', '$hotel_href')"
);
}
}
/* Liberar consulta */
$result->close();
}
/* Cerrar conexión */
$mysqli->close();

Puedes descargar las dependenciassimple_html_dom.php yutils.php.

Como primer paso, recorrer la tabla ciudades. Indicará al algoritmo a que ciudades debemos acceder para obtener las habitaciones más populares. El algoritmo para extraer datos funciona igual, con la diferencia que almacenamos los resultados en la tabla rooms.

4. Programar el scraper para mantener los datos actualizados.

Lo que buscamos es delegar la funcionalidad de obtener y generar las habitaciones de manera independiente. Todos los resultados que extrae, serán almacenados en una base de datos. Cuando el usuario, haga una petición, consultará en la BD en vez de hacer el proceso de extracción directamente. Esto ayudará a administrar mejor los recursos del servidor.

Teniendo en cuenta esto, pasamos al proceso de programar tu script para que se repita en un periodo x de tiempo. La clave es mantener el proceso de generar datos de manera aislada como explico en el siguiente diagrama:

Web scraping automatizado utilizando cron

En la automatización, debes manejar los tiempos en base a tu criterio. En este proyecto, haré que el scraper se ejecute cada hora. Con este tiempo, considero, que es suficiente para mantener los datos actualizados sin tener que consumir demasiados recursos de mi servidor.

Este fue mi criterio:

  • Si extendiera más el tiempo como a 4 horas, correría el riesgo de tener un mayor desfase de precios o incluso mostrar habitaciones que no están disponibles.
  • Cuando reduces el tiempo, cada 20 minutos. Estaría empleando recursos del servidor cada 20 minutos para iniciar un proceso de actualización.
  • Otra variable a considerar, es la cantidad de información que necesito procesar. Si necesitara obtener habitaciones de toda la zona sur del país, tendría que extender un poco más los lapsos de tiempo.

Para la automatización, usaré cron porque mis servidores están basados en Unix (Linux, FreeBSD, Mac OS, etc.). Si usas servidores windows, puedes configurar una tarea programada.

Ejecutar el scraper cada hora de manera indefinida

0 * * * * /usr/bin/php /YOUR/PATH/scraper.php &> /dev/null

Sino estás muy familiarizado con la sintaxis de cron, te recomiendo este post: Introducción a tareas programadas con cron. Ahí podrás ver como se define el formato de cada tarea.

5. Actualizar el llenado del template

Debido a que no hacemos scraping cada vez que el cliente solicita un listado de habitaciones. Accederemos directamente a las habitaciones almacenadas en la tabla rooms.

<div class="d-flex flex-wrap">
<?php if ($result = $mysqli->query("SELECT id, name, image_url, href, price FROM `rooms` WHERE city_id = 1")): ?>
<?php while ($hotel = mysqli_fetch_assoc($result)): ?>
<div class="col-lg-4 col-md-4 col-sm-6 col-xs-6 ">
<div class="wrap-box">
<div class="box-img">
<a href="<?php echo 'https://www.tripadvisor.com/' . $hotel['href'] ?>">
<img src="<?php echo $hotel['image_url'] ?>" class="img-fluid" alt="<?php echo $hotel['name'] ?>">
</a>
</div>
<div class="rooms-content">
<h4><a href="<?php echo 'https://www.tripadvisor.com/' . $hotel['href'] ?>"><?php echo $hotel['name'] ?></a></h4>
<p class="price">$ <?php echo $hotel['price'] ?> MX / Por Noche</p>
</div>
</div>
</div>
<?php endwhile; ?>
<?php endif; ?>
</div>

En realidad, no cambió mucho la sintaxis de como esta estructurado el template. La ventaja de realizar este refactoring es:

  • Evitamos la dependencia directa del sitio original. Cuando realizan cambios en sus vistas, podemos actualizar nuestro scraper para adaptarlo a la nueva vista. Mientras tanto, la disponibilidad de nuestros datos no se compromete.
  • Al tener los datos en nuestros propios servidores, hace que las rutas sean más cortas.

Para probar como funciona el proyecto final, te dejo el enlace para que puedas descargarlo: Proyecto Final

Consideraciones especiales

  1. La finalidad de este tutorial es conocer el funcionamiento de un scraper. Puedes usar un Framework PHP que te facilitaría más la vida. Sin embargo, prefiero evitar las distracciones que nos desviaran de nuestro propósito.
  2. Puedes optimizar más el proyecto por medio de carga asíncrona en el lado del cliente, por medio de ajax.
  3. Recuerda que tenemos habitaciones de cuatro ciudades diferentes. En nuestro proyecto, podemos agregar un dropdown que cargue dichas ciudades.

Espero te haya sido de utilidad este tutorial. Cualquier comentario que pueda complementar este post, sería bienvenido. Te agradecería mucho si nos ayudas a compartir este contenido para poder ayudar a otras personas. 

¿Inbound Marketing? ¿Cómo puede ayudarme?

Alguna vez has escuchado el  término “Inbound marketing”. Pero, ¿qué significan realmente?

En este artículo veremos lo qué es Inbound Marketing, cuáles son las etapas de la metodología Inbound Marketing, también qué ventajas tiene al llevarlo a cabo.

¿Qué es Inbound Marketing?

Inbound Marketing, consiste en atraer clientes con contenido útil dando soluciones a sus necesidades, básicamente es hacer que sea el usuario el que te encuentre a ti en lugar de ir en busca de ellos. Con el inbound marketing, los usuarios encontraran tu contenido o empresa que se difunden través de distintos canales como blogs, motores de búsqueda y redes sociales.

Este término fue planteado por primera vez en 2005 por Dharmesh Shah y Brian Halligan, que lo definieron como una alternativa al “outbound marketing”. El outbound sería el marketing intrusivo tradicional,   que se caracteriza por presentarse de manera intrusiva.

¿Cómo puede ayudarme Inbound Marketing?

 El inbound marketing consiste en una serie de técnicas no intrusivas que te ayudan a:

  •  Atraer tráfico a tu página web, incrementando el número de visitantes.
  • Hacer que estos visitantes se conviertan en leads de calidad
  • Permite ganarte la confianza de tus clientes.
  • Fidelizar a tus actuales clientes.
  • Automatizar tu marketing para que cada lead reciba información específica sobre tu empresa y se acabe convirtiendo en cliente.

Etapas de la metodología inbound

 La metodología Inbound Marketing función a partir de cuatro fases  

1. Atraer

Aquí la atracción estará hacia aquellos consumidores con la probabilidad para convertirse en tus clientes. Para llamar la atención de los usuarios desconocidos y nuevos visitantes, debes ofrecerles contenido relevante en el momento adecuado. Esto a  partir de técnicas como:

  • Redes sociales

Como hemos viniendo diciendo el contenido de calidad es fundamental, es aquí donde las  redes sociales hacen su función permitiéndote compartir  contenido de valor para atraer tráfico a tu sitio web, para eso debes Identifica las redes sociales más populares e ideales que te permitan interactuar con el usuario.

  • SEO

Cuando tenemos alguna duda o queremos saber de algo lo primero que hacemos ahora es hacer la búsqueda a través de algún buscador. Por ello es muy importante tener un buen posicionamiento dentro de los buscadores. Para poder lograr esto puede utilizar herramientas que te ayuden a definir una estrategia de contenido.

  • Publicación en blogs

Un blog es son de gran ayuda a la hora de  atraer visitantes nuevos a tu sitio web. Para que los clientes potenciales adecuados y puedan encontrarte, debes crear contenido de valor para informarlos y responda sus preguntas. Y sobre todo que tenga que  ver con la temática del servicio o producto que la empresa ofrezca.

2. Convertir.

Es en esta fase donde el usuario encuentra contenido de interés y te deja sus datos de contacto para seguir recibiendo información a través de mensajes, formularios o reuniones. Así, es cuando empieza a generar su propia base de datos de la empresa. 

3. Cerrar

En esta fase los visitantes de tu web ya son leads, pero queremos convertir a estos tus nuevos clientes. Para conseguir esto, puedes utilizar  herramientas de automatización para enviar información relevante a tus contactos según sus necesidades. Así, podrás hacer llegar tus ofertas en el momento apropiado y generar más clientes. 

4. Deleitar

 Así que, en esta fase, intentamos conservara nuestros clientes, por eso, es muy importante interactuar con ellos de una manera correcta  ofreciendo información que les pueda resultar interesante y útil. Así mantenerlos satisfechos y poder generarán un vínculo a largo plazo contigo.

 

¿Cuáles son las claves del Inbound Marketing?

Podemos resumir las claves del inbound marketing en cuatro

  • Lo principal es la creación de contenido relevante y  que aporte valor.
  • No se queda solamente en la captación de visitas, sino que permite cerrar la venta a través del:
  1. Lead scoring: consiste en valorar a travez de una puntuación a los leads o prospectos clientes de acuerdo a cuanto más se acerquen o se alejen de convertirse en clientes.
  2. Lead nurturing: consiste en aportar un tratamiento adecuado a cada lead en función de la puntuación obtenida en el scoring.
  • Cuando desaparece la inversión económica directa no desaparecen sus efectos positivos.
  • Consigue que el coste del lead y del cliente disminuya.

¿Qué ventajas tiene el Inbound Marketing?

  • Atraer tráfico a tu página web, incrementando el número de visitantes.
  • Aporta un mayor conocimiento de nuestro público objetivo.
  • Practicas menos invasivas, por lo cual se hace desde el cliente, sin intromisiones, ni presiones, esto va generan mayor engagement.
  • En el Inbound marketing se establece con el cliente una relación, de enamoramiento con la marca.
  • Fidelización de clientes y por tanto posible incremento de ventas.
  • Creación de contenido de calidad que aporta valor añadido a los usuarios interesados.
  • Difusión de contenido de calidad en las redes sociales.
  • Todo el proceso de marketing, se puede hacer de manera automatizada y personalizada.
  • Los costos de inversión en campañas de Inbound marketing son muy bajos.
  • Nos ayuda a cerrar el círculo de captación de clientes.
  • Así que, Inbound Marketing conlleva muchas ventajas para una empresa hoy en día.

Si crees que este post le puede servir a más gente, Compartiéndolo me ayudas a llegar a ellos.

Déjanos un comentario.

Introducción a tareas programadas usando cron

Introducción a tareas programadas con cron

Las tareas programadas tienen usos muy comunes en la automatización de sistemas que requieren ejecutarse cada x tiempo sin intervención del usuario. Su función es agendar los procesos que deseas ejecutar en tu sistema. Existen diferentes programadores de tareas, en este artículo nos enfocaremos en tareas programadas usando cron.

Cron es un demonio utilizado para ejecutar tareas programadas como copias de seguridad, actualizaciones, envíos de notificaciones periódicas, etc. Esta basado en sistemas operativos tipo Unix (Linux, FreeBSD, Mac OS, etc.). A los procesos que se ejecutan por lapsos de tiempo se les conocen como cron jobs.

Crontab

Sus comandos están escritos en un archivo crontab. En linux, puedes encontrar ese archivo en /etc/crontab. Crontab verificará la fecha y hora en la que se ejecutara el script. Todo lo realizará en modo background. Podemos gestionar los crontabs de la siguiente manera:

Para ver la configuración actual
crontab -l

Para editar
crontab -e

Borra el crontab del usuario
crontab -d

Entendiendo el formato de las crontabs

La tareas cron tienen una sintaxis que ayuda a definir en que intervalos de tiempo se ejecutarán los scripts. Su formato cuenta con 5 espacios seguidos del script a ejecutar.

¿Qué son los asteriscos?

En muchos ejemplos verás un asterisco (*) en lugar de un número. Esto representa todos los números posibles en esa posición. Por ejemplo un asterisco en la posición de hora, haría trabajar un script cada hora.

Ejemplos de configuración de algunas tareas programadas

Tareas cotidianas

Esta tarea se ejecutara cada minuto, todo el tiempo

* * * * * [comando]

Lo traducimos como:

  • Sobre cada minuto
  • Repetir cada hora
  • Todos los días del mes
  • En todos los meses
  • Funcionando todos los días de la semana

Todos los domingos la 1:15 el script realizará un respaldo de las BD de mis sistemas

15 1 * * 0 [comando]

Se traduce como:

  • A partir del minuto 15
  • Desde la 1 de la madrugada
  • Todos los dias del mes
  • En todos los meses
  • Sólo los domingos

Necesito hacer un respaldo el día 1 y el día 16 de cada mes a las 23 horas

0 23 1,16 * * /usr/tasks/backup.sh

Descrito como:

  • En el minuto 0
  • De las 11 de la noche
  • Del día 1 y 16 del mes
  • Para todos los días del mes
  • Puede ser cualquier día de la semana

Por intervalos de tiempo

Arranco un script entre días laborales de lunes a viernes para enviarles un correo a las 9 de la mañana a los clientes deudores del crédito del banco

0 9 * * 1-5 /usr/tasks/sent_notification.sh

Se traduce como:

  • Empezando en el minuto 0
  • Desde 9 de la mañana
  • Todos los días del mes
  • Sobre todos los meses
  • Lunes a Viernes

Necesito verificar cada 15 minutos, en horario de oficina, que clientes nos han estado pagando puntual para acumular sus puntos.

Solución 1. Por medio de listas separadas por comas (,):

0,15,30,45 9-5 * * * /usr/tasks/add_coupons.sh

Solución 2. Interpretado por la diagonal (/) para crear intervalos:

0/15 9-5 * * * /usr/tasks/add_coupons.sh

Caracteres especiales

Loa caracteres especiales nos ayudan a crear comandos más elegantes:
  • * => Selecciona todos los valores de un campo.
  • – => Selecciona rango de valores (por ejemplo 1-6).
  • ,  => Selecciona valores específicos (por ejemplo 1,3,5 en el nivel de días de la semana, es decir los lunes, miércoles y viernes ).
  • /  => Selecciona incrementos a partir del primer valor (por ejemplo 0/15 que es cada 15 minutos comenzando desde el minuto 0 -> 15, 30 ,45).

Palabras reservadas

Cron al igual que otros lenguajes de programación también maneja palabras reservadas para facilitar su eso. Esto debido a que no necesariamente necesitamos ejecutar en tiempos demasiado específicos:

  • @reboot Ejecuta cada vez que se inicia el servidor
  • @yearly/@annually Se ejecuta una vez al año equivalente a 0 0 1 1 *
  • @monthly Se ejecuta una vez al mes equivalente a 0 0 1 * *
  • @weekly En el primer minuto de la primer hora de la semana equivalente a 0 0 * * 0.
  • @daily/@midnight diario, a las 12:00A.M equivalente a 0 0 * * *
  • @hourly al primer minuto de cada hora equivalente a 0 * * * *

Por ejemplo. Necesito verificar quienes no han pagado sus deudas pendientes y realizar el cargo al final del día.

@daily /usr/tasks/payments.sh

También podemos ejecutar scripts de diferentes lenguajes directamente. En este caso verifico quienes aún no terminaron de registrarse en mi red social para enviarles una invitación. Hago la validación cada hora.

@hourly /usr/bin/ruby /home/task/email/finish_registration.rb

Mi aprendizaje al respecto

Como verás, hay un sin fin de formas de sacarles provecho a las tareas programadas. Mis recomendaciones como desarrollador:

  • Evalua correctamente el tiempo que necesitas para correr un script. Tener un script corriendo cada hora, cuando se necesita conocer la cantidad de deudores al final del día, no es recomendable. Si bien es cierto que funcionará, consumes recursos innecesarios.
  • Las tareas programadas se corren en modo background, por lo tanto el usuario no interactúa con el sistema y no puede ver algún tipo de error. No esta demás hacer un script de pruebas para validar que todo este funcionando correctamente.

Una herramienta estupenda que funciona como demo, es el sitio de Crontab Guru donde puedes probar todo tipo de configuraciones antes de usarlo en tus scripts de producción.

Sitio web de Crontab Guru
Sitio web de Crontab Guru

Espero te haya servido este artículo. Si te fue útil, te agradecería que nos ayudes a compartirlo. Quedamos atentos a tus comentarios que ayude a enriquecer este tema. Estaré entusiasmado de poder interactuar contigo.

¿Testing A / B?

Tal vez alguna vez te haya pasado que al entrar a una página web a la que frecuentas regularmente  tengan cambios distintos a los que tenía la última vez que  la visitaste. No hay de qué preocuparse la página sigue siendo la misma, probablemente ha pasado que estas frente a un Testing A/B.

El testing A/B es algo que no debe faltar y que no puedes perderte. Así que hoy vamos a ver en qué consisten estos test, cómo y por qué ponerlos en marcha.

¿Qué es a/b testing?

Testing A / B (también conocida como prueba dividida o prueba de depósito) es un proceso para comparar dos versiones de una página web, y así  ver cuál tiene mejor aceptación.

En pocas palabras para ejecutar una prueba A/B, debes crear dos versiones diferentes de una página  web, con cambios en una sola variable. Después se muestran a los usuarios al azar,  y a través de un análisis estadístico determinar cual tiene mejor aceptación entre los usuarios.

¿Por qué se llama a/b testing?

Se llama así, ya que se está comparando dos opciones. En el cual solo hay una pequeña diferencia entre el control y el test.

  • A Control: esta suele ser la primera página web o elemento que ha diseñado.
  • B Test: necesita demostrar con una significación estadística que el test es una mejora sobre el control.

 

¿Por qué hacer a/b testing?

 Testing  A / B te va a permitir a realizar cambios adecuados en las experiencias de usuario. Esto te permitirá construir hipótesis y  así ver que  elementos afectan el comportamiento del usuario.

Al poder probar una idea contra otra esto hará que se reduzca el riesgo de fracaso debido a problemas simples. Las pruebas A/B  también permiten resolver debates, ya que evita llegar a conclusiones equivocadas basadas en suposiciones a cambio de una resolución al problema con usuarios reales.

Prueba multivariable

Este tipo de test es más complejo porque compara más de una variable al mismo tiempo y se requiere de más combinaciones para hacer la prueba.

Para la prueba multivariable se necesita que el sitio tenga un tráfico mucho mayor para obtener una significación estadística relevante sometiendo a prueba una variable a la vez (como color, texto, posición, tamaño, etc.).

Cómo llevar a cabo A / B testing 

1. Elija una variable para probar

Aquí establecerás qué variables son las que vas a probar. Las principales variables son el color, el tamaño, imágenes, la ubicación, contenido, llamada a la acción así como la relación con el resto de componentes.

2. Identifica tu objetivo

Tienes que pensar a profundidad que quieres conseguir al ejecutar  la prueba A/B. Tu objetivo serán las métricas que utiliza para determinar si la variación es más aceptable que la versión original o no.

 3. Generar hipótesis

Es importante decidir qué indicadores son los que se van a tomar como referencia para validar cualquier comparativa. Sólo sabiendo  cómo se van a medir los resultados será posible poder tomar decisiones en tiempo real.

4. Usa una herramienta de prueba A / B.

  • Para hacer una prueba A / B en su sitio web, deberá usar una herramienta de prueba A / B.
  • Comparar sólo una variable cada vez para asegurarte de que la diferencia entre los diversos resultados es consecuencia de dicho cambio.
  • Tener mucho cuidado en el momento en el que se ejecuta cada test comparativo con el fin de que sea cuando los usuarios puedan ayudarte con sus decisiones.

5. Ejecutar test A/B

Aquí los visitantes de su sitio o aplicación serán asignados aleatoriamente al control o a la variación de su experiencia. Su interacción con cada experiencia se mide, se cuenta y se compara para determinar cómo se desempeña cada uno.

6. Analizar resultados

una vez que se complete el experimento, se deberá analizar  los resultados. La herramienta a utilizar presentará los datos del experimento y le mostrará la diferencia entre el rendimiento de las dos versiones de la página y si existe una diferencia significativa.

 

4 herramientas esenciales para A/B Testing

1. Google Analytics

Permite probar hasta diez variaciones de una misma página para analizar cuál de ellas ofrece mejores resultados. Te permite mostrar las páginas a testear de forma aleatoria o marcando un porcentaje del tráfico para cada una de ellas y, para ir haciendo seguimiento, puedes entrar en la plataforma así como configurar la posibilidad de obtener actualizaciones a través del correo electrónico para ver el estado del experimento llevado a cabo.

Ir a Google Analytics

2. Optimizely

Es una herramienta que permite testear tanto páginas web como aplicaciones móviles. La implementación es sencilla y para preparar el test no es necesario tener conocimientos de programación.

Ir a  Optimizely

 3. Visual website Optimizer

Es una plataforma que te permite ajustar, optimizar y personalizar tú sitio web sin ser necesario tener grandes conocimientos técnicos. También cubre el proceso de crear diversas versiones de una página para saber cuál de ellas tiene mejor conversión.

Ir a Visual website Optimizer

4. AB Tasty

AB Tasty permite realizar tests A/B a la vez que testear diversas variaciones y personalizar contenido según el usuario que visita la página. Estos experimentos se pueden llevar a cabo tanto en una web como en sitios móviles y aplicaciones.

Ir a  AB Tasty 

 

Cuéntame tu opinión o duda que tengas.

¡Comparte si te ha gustado!

Como hacer web scraping para hoteles con PHP Simple HTML DOM

En el pasado tutorial, hicimos una réplica exacta de una página con file_get_contents and cURL. Sin embargo, de esta manera no hay forma de sacarle mucho provecho. Corres el riesgo de que te reporten por plagio o confundan tu proyecto por una página de pishing. El objetivo de este tutorial es obtener las habitaciones más populares de Isla Mujeres con PHP Simple HTML DOM Parser y llenar nuestro template que hemos diseñado previamente con Bootstrap.

La fuente de información será TripAdvisor, uno de las guías más completas para cualquier viajero. Cada vez que accedamos a nuestro proyecto, un script leerá inmediatamente los hoteles más populares según la URL que le hayamos indicado.

Cabe recordar que este es un ejercicio de carácter educativo. No busco promover el plagio de información, sin embargo, existen usos totalmente válidos para esta técnica.

1. ¿Qué necesitas para empezar?

Simple HTML DOM te permite extraer y manipular de manera fácil el html de un sitio web. De la misma manera como lo harías con jQuery o Javascript. Por eso es deseable estar familiarizado con el manejo del DOM en javascript.

2. Extraer la información de los hoteles

Primero necesitamos llamar la dependencia simple_html_dom.php que obtuvimos de su página oficial. En mi caso, tengo identificado la url que vamos a necesitar para extraer información.

// Call dependency
require 'simple_html_dom.php';
// Create DOM from URL or file
$html = file_get_html('https://www.tripadvisor.com/Hotels-g150810-Isla_Mujeres_Yucatan_Peninsula-Hotels.html');

Hasta ahora, hemos extraído el contenido donde se listan los hoteles en TripAdvisor. Este contenido lo almacené en una variable $html para extraer la información que necesitamos. Hasta ahora tenemos una copia exacta de la página de referencia.

3. Identificar las secciones relevantes

Si necesitas obtener una sección del sitio de manera nativa, puedes hacerlo por expresiones regulares usando la función preg_match_all. Sin embargo, es una forma un poco más compleja porque requieres estar creando constantemente expresiones regulares. En este momento es donde Simple HTML DOM hace la magia. Lo que obtuve en la variable $html puedo manipularlo como un objeto a través de funciones definidas por la librería.

Aclarado esto, lo que necesitamos es identificar la sección que deseamos extraer del sitio de TripAdvisor. Esto es sencillo de realizar con el inspector de tu navegador. En mi caso utilizaré el inspector de Google Chrome.

Identificar secciones del sitio web con ayuda del inspector de chrome

Con la herramienta de selección de chrome vamos buscando patrones. En el ejemplo anterior encontramos tres contenedores principales en la plataforma: .header, .page y .footer. En este ejemplo, pondremos atención en el contenedor .page donde esta la lista de las habitaciones que nos importan.

4. Extraer la lista de hoteles de la sección identificada

En este punto lo que queremos es buscar un patrón que identifique como obtener el listado de hoteles. Con el inspector identifiqué las secciones que me interesan:

Visualización de secciones en TripAdvisor

Como podrás observar, hemos encontrado un patrón que comparten todas las contenedores de cada habitación. Todas los contenedores tiene una clase llamada .prw_meta_hsx_responsive_listing. Ahora lo que necesitamos, es obtener toda la información que contiene cada caja con esa clase.


// De todo el contenido, solo necesito la lista de los contenedores de hoteles
$wrap_hotels = $html->find('div.prw_meta_hsx_responsive_listing');

Por medio de la función find, estamos obteniendo todos los contenedores que tienen la clase .prw_meta_hsx_responsive_listing. El resultado es un array que contenido la información interna de cada contenedor. Si haces un echo, el resultado sería algo similar a este:

Array de los hoteles obtenidos en TripAdvisor
Array de los hoteles obtenidos en TripAdvisor

Este array es una muestra de como se guarda la información. Por suerte, con las funciones de Simple HTML DOM nos facilita más las cosas.

5. Identificar las información específica de cada hotel

Ahora lo que necesitamos es extraer los datos específicos de cada hotel. Lo que nos interesa obtener según el template es:

  1. Nombre del Hotel
  2. La foto del hotel o departamento
  3. Precio
  4. Enlace para entrar a los detalles

Hacemos el mismo ejercicio pero en vez de inspeccionar toda la página de hoteles, inspeccionaremos solamente lo que esta en los contenedores que obtuvimos previamente de la clase .prw_meta_hsx_responsive_listing.

Datos del hotel del div con clase .prw_meta_hsx_responsive_listing
Datos del hotel del div contenedor

Identificadas las clases que contienen cada dato que necesitamos, lo primero que necesitamos es recorrer ese array para seleccionar el nombre, precio, imagen y enlace.


// Recorrer la lista de todos los hoteles obtenidos
foreach($wrap_hotels as $element) {
// Código para trabajar cada elemento
}

Tenemos en la variable $element los datos de cada uno de los hoteles, procedemos a obtener la información específica:


// Recorrer la lista de todos los hoteles obtenidos
foreach($wrap_hotels as $element) {
echo "<b>Nombre del Hotel</b> <br />";
echo $element->find('.property_title', 0)->plaintext . '<br />';
echo "<b>Precio</b> <br />";
echo $element->find('.price', 0)->plaintext . '<br />';
echo "<b>Url de la foto del hotel</b> <br />";
print_r($element->find('.inner', 0)->attr) . '<br />';
echo "<b>Enlace donde estan los detalles del hotel</b> <br />";
echo $element->find('.photo-wrapper a', 0)->href . '<br />' . '<br />' . '<br />';
}

Aplicamos el mismo método find para leer el contenido de cada clase. Para obtener el nombre del hotel y el precio usé el atributo plaintext, para que no me muestre etiquetas html en mis resultados. Así funcionan estos atributos especiales:


// Ejemplos de extracción de datos
$html = str_get_html("<div>foo <b>bar</b></div>");
$e = $html->find("div", 0);
echo $e->tag; // Returns: " div"
echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>"
echo $e->innertext; // Returns: " foo <b>bar</b>"
echo $e->plaintext; // Returns: " foo bar"

Para más información, puedes consultarlo en la documentación oficial. El resultado sería como en la siguiente lista.

Nombre del Hotel
Hotel Rocamar
Precio
MX$2,053
Url de la foto del hotel
Array ( [class] => inner [style] => background-image:url(https://media-cdn.tripadvisor.com/media/photo-l/0d/6b/4f/fb/hotel-rocamar.jpg); )
Enlace donde están los detalles del hotel

/Hotel_Review-g150810-d1477852-Reviews-Hotel_Rocamar-Isla_Mujeres_Yucatan_Peninsula.html

Nombre del Hotel
Hotel Plaza Almendros
Precio
MX$971
Url de la foto del hotel
Array ( [class] => inner [data-lazyurl] => https://media-cdn.tripadvisor.com/media/photo-l/08/7c/7c/9e/pool–v7986578.jpg )
Enlace donde están los detalles del hotel

/Hotel_Review-g150810-d616791-Reviews-Hotel_Plaza_Almendros-Isla_Mujeres_Yucatan_Peninsula.html

6. Caso especial. Como obtener la url de la imagen

Todo bien hasta el momento, pero aún tenemos un array al obtener la url de la foto. Puedo usar el atributo style $element->find('.inner', 0)->attr->style, pero si observamos bien, no todos tienen ese atributo. Otros items usan el atributo data-lazyurl, y nos da la url en diferente formato. Esto se debe a que las empresas que se preocupan por el rendimiento de sus sitios, no cargan todas las imágenes y se van cargando conforme el usuario le va dando scroll al sitio.Podemos crear una función donde le pasemos de parámetro ese array para devolvernos como resultado la url sin importar como la obtenga.

/**
* @param Array $attr_image Atributos en forma de array
* @return Image URL
*/
function get_standar_image_url($attr_image) {
// Inicia la variable vacía
$url_image = '';
// Si el atributo es style
if (isset($attr_image['style'])) {
// Recuerda que el style nos da el formato así background-image:url(URL_DE_IMAGEN)
// Usé substr para remover esos caracteres y solo dejarme la url como resultado
// Otra forma es usando regex
$url_image = substr($attr_image['style'], 21, -2);
// Nos proporciona bien la url
} else {
// Aquí nos da la url directa
$url_image = $attr_image['data-lazyurl'];
}
return $url_image;
}

Con la función que tenemos, vamos a realizar un refactory al código donde estábamos trabajando. Lo que haré por cuestiones prácticas es guardar los resultados en otro array que le llamaré $list_hotels  con los valores que necesitaré para llenar mi template.


// Creo una nueva variable que guardara los datos que necesito para mi template
$list_hotels = array();
// Recorro el item original
foreach($wrap_hotels as $element) {
$hotel = new stdClass(); // Es más elegante usar objetos
$hotel->name = $element->find('.property_title', 0)->plaintext;
$hotel->price = $element->find('.price', 0)->plaintext;
$hotel->image_url = get_standar_image_url($element->find('.inner', 0)->attr);
$hotel->href = $element->find('.photo-wrapper a', 0)->href;
array_push($list_hotels, $hotel);
}

Ya obtuvimos el array que nos interesa, ¿ahora que sigue? Podemos trabajar con esa lista para llenar los datos del template del proyecto.

7. Llenar el template del proyecto

Con la ayuda de la variable $list_hotels, vamos a reemplazar nuestros cajas estáticas de nuestro proyecto local que tenemos alojados en CodePen. Tomaremos una caja donde muestra la información de nuestro proyecto.


<div class="col-lg-4 col-md-4 col-sm-6 col-xs-6 ">
<div class="wrap-box">
<div class="box-img">
<a href="#">
<img src="https://mexlike.io/wp-content/uploads/2018/06/Habitación-de-hotel.jpeg" class="img- fluid" alt="Habitación de Lujo">
</a>
</div>
<div class="rooms-content">
<h4><a href="#">Habitación de Lujo</a></h4>
<p class="price">$520 / Por Noche</p>
</div>
</div>
</div>

Puedo suponer que ya sabes que haremos con este proyecto. Vamos a repetir esa caja varias veces por medio de un loop. Nos caería de lujo usar foreach para este propósito, quedando de la siguiente manera:


<div class="d-flex flex-wrap">
<?php foreach ($list_hotels as $hotel): ?>
<div class="col-lg-4 col-md-4 col-sm-6 col-xs-6 ">
<div class="wrap-box">
<div class="box-img">
<a href="<?php echo 'https://www.tripadvisor.com/' . $hotel->href ?>">
<img src="<?php echo $hotel->image_url ?>" class="img-fluid" alt="<?php echo $hotel->name ?>">
</a>
</div>
<div class="rooms-content">
<h4><a href="<?php echo 'https://www.tripadvisor.com/' . $hotel->href ?>"><?php echo $hotel->name ?></a></h4>
<p class="price"><?php echo $hotel->price ?> / Por Noche</p>
</div>
</div>
</div>
<?php endforeach; ?>
</div>

Una vez que recorras el array $list_hotels que generamos resultado del web scraping. Tendremos este grandioso resultado:

Resultado final de los hoteles de Mexlike

A partir de ahora, tenemos un listado de 30 hoteles de Isla Mujeres en nuestro sitio web. Lo podemos mostrar en nuestra página web. También pudimos hacer scraping a las páginas destino de cada hotel, pero haría mucho más complejo este tutorial. Si deseas probar como funciona, te dejo el resultado de este ejercicio:

Ver proyecto final para hacer scraping

Consideraciones especiales

  1. Cuando necesitas extraer un sitio con demasiada información, la librería te llega a limitar. Para aumentar esa limitación, puedes entrar dentro de la librería simple_html_dom.php y modificar la constante MAX_FILE_SIZE. Más información
  2. En el anterior punto no siempre es recomendable modificar fragmentos del código. En especial para los que trabajamos con composer, porque las actualizaciones borran tus cambios.
  3. Hicimos dos foreach: El primero tuvimos que obtener datos específicos para guardarlo en otro array y en el segundo caso para usar ese mismo array para llenar las cajas de nuestro proyecto local. Para optimizar el rendimiento, debimos llenar las cajas desde que obtuvimos los datos de los hoteles sin necesidad de crear otro array. Pero se justifica en el siguiente punto.
  4. Intentar leer la página fuente cada vez que accedemos a nuestro proyecto, es un problema grave de rendimiento. Porque tendría que estar leyendo el sitio fuente cada vez que un usuario accede a nuestro sitio. Lo ideal es separar el script donde realizamos el scraping y guardarlo en algún medio de almacenamiento en nuestro servidor como una base de datos y con una tarea programada. El sitio accedería a la información previamente obtenida por el script. Es un tema que abordaremos en el siguiente tutorial.
  5. El código fuente es funcional a la fecha de la publicación. Sin embargo, la página web fuente puede realizar cambios en sus vistas. Es recomendable revisar que el script este constantemente actualizado. Si es necesario, repetir el proceso de inspección del código fuente de las páginas de referencia.

Por favor, cuéntame que tal te pareció este tutorial. Si te fue de utilidad, ayúdanos a compartir este contenido para poder ayudar a más personas. Si tienes alguna duda u observación, estaré encantado de leerte e intercambiar opiniones para enriquecer este post.

JPEG, PNG y GIF ¿Cuándo usarlos?

Sabías que las imágenes son uno de los contenidos más atractivos divulgados  en internet. Pero no todos estamos familiarizados con el diseño, lo cual puede ser más difícil para algunos saber con exactitud qué tipo de formato de archivo debería usar en cada situación.

Ya que si usamos el formato equivocado, podríamos alterar la calidad de nuestras imágenes lo cual causaría que nuestras imágenes pierdan su atractivo visual o que nuestro contenido sea más pesado en nuestro sitio web o blog.

Pero, ¿conoces exactamente la diferencia entre cada uno de ellos, o el tipo de formato que debes utilizar en cada caso?

 

¿Tipo de imagen?

Para comenzar hay que entender que contamos con dos tipos de imágenes: Imagen vectorial y el mapa de bits. Es muy importante entender la diferencia entre estos dos tipos.

  • Mapa de bits

Las imágenes bitmap o mapa de bits  son las imágenes que son formadas por varios cuadritos pequeños que vemos cuando damos zoom a la imagen, a estos se les llama pixeles. A cada uno de estos se les asigna un color y, a través de coordenadas X y Y, esos pixeles de colores se posicionan en una malla y, así, forman una imagen.

  • Imagen vectorial

Las imágenes vectoriales o simplemente vectores son imágenes planas, sin sombres muy complejas. Son imágenes que se basan en polígonos formados por puntos, lo cual puedes aumentar un vector cuanto quieras, ya que no hay pérdida de resolución.

 

¿Cuál es el tipo de formato de imagen que tengo que utilizar?

Hay muchos formatos distintos y no todos son ideales para todo tipos de imagen o para contenidos. Estos son algunos de los formatos más utilizados.

 

  • JPEG (Grupo Conjunto de Expertos en Fotografía)

También conocido como JPG, sin duda uno de los formatos más conocidos y utilizados por todos en los medios digitales. Utiliza un complejo algoritmo de compresión de imagen, lo cual puedes equilibrar la calidad y tamaño de la imagen.

Normalmente los archivos JPEG se utilizan en diseño web ya que el formato permite que las páginas carguen más rápido. También son muy recomendados para medios digitales, campañas publicitarias en redes sociales como whatsapp, Pinterest, facebook e Instagram, o promociones.

 

  • PNG (Gráficos Portables de Red)

Es un formato de compresión sin pérdida de información. Además, es un formato que permite utilizar fondos transparentes manteniendo la calidad de imagen.

La desventaja de este formato es que para mejorar la calidad de la imagen el peso de esta también aumenta, en caso de las páginas web causara que esta tarde en cargar.

Pero esto no debe de preocuparnos por que hoy en día existen varias herramientas online que nos ayudaran con este problema, reduciendo el peso de nuestras imágenes manteniendo su calidad de imagen.

Este formato suele utilizarse para web y plataformas online, o en aquellos casos en que la imagen no tenga un fondo.  También este formato es perfecto para logos que necesitan transparencia y degradado.

 

  • GIF (Formato de Intercambio de Gráficos)

GIF fue el primer formato de imágenes que redujo el tamaño de las imágenes y posibilitó la descarga rápida. También admite transparencias y su peso es muy reducido. Sin embargo, el hecho de ser un formato con un tamaño tan pequeño, lo limita demasiado

El GIF puede animarse, lo cual es una de sus principales ventajas frente a otros tipos de archivo. Actualmente es muy utilizado para crear animaciones para Facebook y whatsapp en Android.

Hay más formatos

Claro que existen mucho más formatos, ya algunos de ellos están en desuso, y otros son propietarios de ciertas aplicaciones. Recuerda en utilizar el formato correcto para cada tipo de gráfico y aplicación.

Cuéntame tu opinión o duda que tengas.

¡Comparte si te ha gustado!

 

 

Primeros pasos de Web Scraping con PHP

Primero pasos de Web Scraping con PHP

El uso de estas técnicas te pueden ser de mucha utilidad. Con un fragmento de código puedes recorrer un sitio web de la misma forma que se presenta en un navegador. Puedes guardarlo en una base de datos o mostrarlo en alguna parte de tus sitios. Si deseas conocer más sobre sus usos, te recomiendo leer Introducción al Web Scraping.

Elección de Fuentes para los Primeros pasos de Web Scraping

Como primer objetivo necesitas leer un sitio web externo para después embeberlo en tu propio proyecto, de eso trataré en esta entrada. En el Home quiero obtener los hoteles ubicados en Isla Mujeres desde TripAdvisor.

Lo primero que haremos es ir a la página de tripadvisor.com y realizar una búsqueda de hoteles de Isla Mujeres. No voy a seleccionar un Check In o Check Out porque a mí solo me interesa mostrar la relación de hoteles.

Búsqueda en TripAdvisor para obtener hoteles de Isla Mujeres

Una vez realizada la búsqueda, obtendrías resultados similares a la siguiente imagen. Se trata de un listado de hoteles de Isla Mujeres. Lo que nos interesa es tener la url con los parámetros necesarias que nos despliegue solo hoteles de isla mujeres.

Hoteles de Isla Mujeres en TripAdvisor

Extraer un sitio con file_get_contents

Vamos a utilizar la url que obtuvimos para indicarle a nuestro script lo que queremos mostrar. Primero crearé el archivo scraper.php donde contendrá el script que leerá el sitio contenido de la URL señalada.

<?php
// Lee la url y obtiene el contenido en una variable
$html = file_get_contents("https://www.tripadvisor.com/Hotels-g150810-Isla_Mujeres_Yucatan_Peninsula-Hotels.html");
// Se imprime lo que obtuvimos en esa variable
echo $html;
?>

Funciona, pero no siempre llega a ser así. Es necesario tener activado la directiva allow_url_fopen en el php.ini de tu servidor. Sino sabes como activarlo, te recomiendo que te des un clavado en este artículo sobre como activar allow_url_fopen en tu servidor.

Cuando trabajas de manera local, no parece ser un problema. Sin embargo, no todos los servidores dan privilegios de modificar sus archivos de configuración. Así que otra alternativa de poder tener los resultados en nuestro sitio es a través de cURL.

Extraer un sitio con cURL

cURL es una herramienta que te permite obtener información de distintos protocolos, además puedes hacer envíos de parámetros GET y POST. Su uso es tanta común que llega a ser utilizado en los crawlers para recolectar información de la web.

Por esas razones cURL es mi función predilecta porque me permite hacer conexiones. Incluso podría entrar a un área protegida por medio de mecanismos de autenticación.

La pregunta es ¿cómo hacer scraping para obtener un resultados similar al anterior? Realmente es muy sencillo, si bien requieres de más código para definir lo que quieres obtener realmente, lo podríamos encapsular en una función como lo haré en el siguiente ejemplo.

<?php
// Definimos la función cURL
function get_content_with_curl($url) {
// Inicial la función url
$ch = curl_init($url);
// No verifica el peer del certificado. Opcional
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// Establece la sesión
$data = curl_exec($ch);
// Cierra la sesión
curl_close($ch);
return $data;
}
// Llamo la función previamente definida. La guardo en una variable por si deseo manipularla
$html = get_content_with_curl("https://www.tripadvisor.com/Hotels-g150810-Isla_Mujeres_Yucatan_Peninsula-Hotels.html");
// Imprimir la cadena recibida
echo $html;
?>

Realmente lo que hicimos fue crear una función que nos permitiera obtener un sitio web, tal como lo lee un navegador, por medio de cURL. Con esto ya tenemos el sitio original en nuestro sitio.

Resultados de hoteles de Isla Mujeres de TripAdvisor en Mexlike

Resumiendo, el Scraping se basa en leer datos de otras fuentes. Aquí solamente leímos la web tal como está en la versión original, sin embargo, no le podríamos dar mucho uso de esta manera. Cada vez que requiera obtener datos de otras ciudades, solo llamaría esta función definida previamente. Para ser más selectivo en el contenido que obtenemos de cada sitio, es necesario desarrollar funciones más detalladas, sin embargo no es el objetivo de este post.

Como aclaración, hasta este punto aún no podemos darle un uso éticamente aceptable a esta técnica. Copiar contenido de otras fuentes y usarlo indiscriminadamente en tus sitios podría ser contraproducente. En el próximo post, vamos a especificar que secciones necesitamos de los resultados que nos da TripAdvisor para nuestros proyecto con estilos propios.

Espero te haya gustado este post y/o te haya sido de utilidad, te agradeceríamos mucho si nos ayudas a compartir. Si tienes algún comentario, no dudes escribirnos en la caja de comentarios. Siempre estaremos ansiosos de intercambiar ideas con nuestros lectores.