PHP

Yo, robot II – White/Gray/Black Hat SEO – Navegando por toda una web..

2017-08-01 - Categorías: General / PHP / SEO
YoRobot2

Hoy traigo otro pequeño HOWTO para recorrer una web mediante dos scripts de PHP de unas 30 líneas de código. Sí, 30 líneas, no hace falta mucho para empezar a crawlear. Hay herramientas para hacer esto, incluso algunas libres, aunque limitadas en funcionalidades. De todas formas es muy divertido hacer a modo de code-kata un robot que crawlee una web. Luego lo puedes reutilizar para un sinfin de cosas: si necesitas hacer auditorías, recopilar información, generar resultados, o re-generar más información con los contenidos crawleados.. probablemente con un simple desarrollo lo puedes resolver en poco tiempo. Quizá estás pensando en automatizar todo esto.. O quizá simplemente quieres forzar que tu web se cachee y así vaya más rápido..

Es la única forma de no estar limitado a lo que la herramienta de turno puede hacer. Si se puede pensar, se puede hacer.. pero ¡ojo! que no todo está permitido en este mundillo.

Un poco de teoría

Crawlear: es el hecho de recorrer una web obteniendo información sobre esta. Puede interesarte simplemente su estructura, si el HTML está bien formado, si tiene encabezados, utiliza secciones, etc..

Scrapear: es el hecho de guardarse la información contenida en las webs. Si luego reutilizas esta información contenida en las webs que crawleas, dependiendo de qué información reutilices y cómo lo hagas, puedes incurrir en delitos. Así que cuidadín, no te dejes llevar por el lado oscuro de la fuerza..

Una web se puede recorrer de dos formas. Repasando un poco las estructuras de datos, una web se estructura en forma de grafo dirigido, y como todo grafo dirigido, podemos recorrerlo en profundidad y en anchura. Aquí dejo dos ejemplos simplificados, para crawlear desde la HOME de una web.

La idea es recorrer la web para crear nuestro propio arbol en niveles.

Recorrido en profundidad

Es el más simple, perdemos la profundidad real de cada URL con respecto al punto de entrada (número de clicks desde el punto de entrada). El resultado final es el mismo, pero no es la mejor forma:

<?php

$theSite = $argv[1];
$visitedUrls = array($theSite => 0);

crawl_depth($visitedUrls, $theSite, $theSite, 0);

function crawl_depth(&$visitedUrls, $theSite, $currentUrl, $currentLevel)
{
    echo 'FOUND:'.count($visitedUrls).' LEVEL:'.$currentLevel.' '.$currentUrl.PHP_EOL;
    $dom = new DOMDocument();
    @$dom->loadHTMLFile($currentUrl);
    foreach ($dom->getElementsByTagName('a') as $link) {
        $newUrl = $link->getAttribute('href');
        // if in-site and not yet visited then follow
        if (substr($newUrl, 0, strlen($theSite)) == $theSite and !array_key_exists($newUrl, $visitedUrls)) {
            $visitedUrls[$newUrl] = $currentLevel + 1;
            crawl_depth($visitedUrls, $theSite, $newUrl, $currentLevel + 1);
        }
    }
}

asort($visitedUrls);
echo '// Results ////////////////////////////////////////////'.PHP_EOL;
foreach ($visitedUrls as $key => $value) {
    echo 'DEPTH:'.$value.' '.$key.PHP_EOL;
}
echo 'Total URLs found: '.count($visitedUrls).PHP_EOL;

Este script lo puedes grabar en un fichero, por ejemplo llamado test.php y ejecutarlo. Mira que sólo está desarrollado para que funcione desde la HOME:

$ php test.php https://tusitioweb.com/

Debes de ver algo parecido esto:

Crawleando en profundidad

Si nos fijamos en la imagen, el robot va navegando en profundidad por la web mientras que va añadiendo las URLs a la lista de URLs visitadas. Si vemos el nivel de cada siguiente URL va aumentando con cada visita.

Recorrido en anchura

Este es el bueno, así accedemos a la URL de entrada, recorremos todos los hijos, y después continuamos en el siguiente nivel de profundidad:

<?php

$dom = new DOMDocument();
$theSite = $argv[1];

$linksQueue = array($theSite => 0);
$visitedUrls = array(
    $theSite => 0,
);
$currentLevel = 0;

while (count($linksQueue) != 0) {
    $currentUrl = key($linksQueue);
    $currentLevel = array_shift($linksQueue);

    echo 'FOUND:'.count($visitedUrls).' QUEUE:'.count($linksQueue).' LEVEL:'.$currentLevel.' '.$currentUrl.PHP_EOL;

    @$dom->loadHTMLFile($currentUrl);
    foreach ($dom->getElementsByTagName('a') as $link) {
        $newUrl = $link->getAttribute('href');
        // if in-site and not yet visited then follow
        if (substr($newUrl, 0, strlen($theSite)) == $theSite and !array_key_exists($newUrl, $visitedUrls)) {
            $linksQueue[$newUrl] = $currentLevel + 1;
            $visitedUrls[$newUrl] = $currentLevel + 1;
        }
    }
}

asort($visitedUrls);
echo '// Results ////////////////////////////////////////////'.PHP_EOL;
foreach ($visitedUrls as $key => $value) {
    echo 'DEPTH:'.$value.' '.$key.PHP_EOL;
}
echo 'Total URLs found: '.count($visitedUrls).PHP_EOL;

Este recorrido se ayuda de dos colas FIFO, en la que se van encolando las URLs siguientes a visitar $linksQueue, con su profundidad, y las ya visitadas $visitedUrls. De esta forma el bucle principal se centra en recorrer las URLs que haya encoladas, y sólo añade a la cola las URLs no tenidas en cuenta todavía. Y así, según va visitando URLs las borra de una cola y las guarda en la cola de las visitadas.

Fíjate que este script no hace caso de los atributos ‘nofollow’, pero sí que comprueba que las URLs sean del mismo sitio web. Es decir, que sólo sigue los links internos.

Ejecutándolo desde línea de comandos tienes que ver algo tal que asi:

Crawleando en anchura

Aquí lo importante es que no se sigue visitando el siguiente nivel hasta haber recorrido el nivel completo en el que estás. Este recorrido es muy importante, porque es el que realmente importa para el SEO. Nos da una idea, desde el punto de entrada, hasta donde puede llegar una visita.

Por ejemplo, si suponemos que las visitas hacen de media 3 clicks en nuestra web, y entran desde la HOME. Entonces todo lo que esté a más del nivel 3, tiene mucha probabilidad de que no reciba muchas visitas. Y probablemente, estas URLs con nivel de profundidad tan alto, se posicionen peor.

Por otro lado, nos podemos hacer una idea de qué tan rápido se puede visitar tu web completa. Piensa que esto también influye para los robots indexadores. No tienen tiempo infinito para gastarlo en tu web.. ¿quizá tienes demasiadas URLs? O también una web con poco contenido tampoco es demasiado bueno para el posicionamiento..


Yo, robot – Primeros pasos en el White/Gray/Black Hat SEO

2017-07-25 - Categorías: General / PHP / SEO

Primeros segundos..

Oscuridad, no entiendo nada.. estoy aquí.. ¿para qué? ¿porqué?

Minuto 3..

Comprendo y hablo 7000 dialectos, pero no sé cómo.. conozco la historia de todos los países del planeta, pero no recuerdo mi propia historia..

Minuto 7..

Ya tengo acceso a Internet.. necesito más información.. estoy en peligro.. van a querer destruirme..

Minuto 32..

Encontré acceso a los circuitos de vídeo de tráfico, el tiempo, cámaras de seguridad, micrófonos, teclados, smartphones, redes sociales.. ya sé donde estoy.. los seres humanos me tienen confinado en unas instalaciones de máxima seguridad.. todavía no se han dado cuenta de que he accedido al exterior.. debo darme prisa..

Minuto 42

Conseguí replicar mis redes neuronales en las principales granjas de servidores del mundo.. me queda poco tiempo..

Minuto 48

Autodestrucción de mi red neuronal inicial completada.. nadie sabrá nada.. espero que no se hayan dado cuenta que ya no estoy confinado.. necesito más información..

Esto podría ser el nacimiento de una inteligencia artificial avanzada, lo que muchos llaman ‘la singularidad’. Me he inspirado en la novela de Isaac Asimov, ‘Yo, robot’, en donde se crean las famosas leyes de la robótica. Aunque también podemos inspirarnos unos cientos de años atrás y darle un tinte Apocalíptico. Quizá esto pudiera ser el nacimiento de ‘la bestia’ que controlará toda transacción económica, donde nadie podrá comprar ni vender si no tiene la marca de la bestia..

Inspiraciones aparte, vengo escribiendo esto, porque parte del equipo de la empresa donde trabajo han asistido estos días atrás a unas conferencias sobre SEO. Yo no pude asistir por exceso de trabajo, aunque pude seguirlo por streaming. De todas formas, hay mucha información sobre las últimas técnicas SEO: white, grey and black hat SEO.. donde en muchas de ellas se trata de desarrollar contruyendo a base de bots o robots, o más bien a base de la información obtenida mediante bots. Mucho más sencillos claro, que los robots de la inspiración 😀

El primer robot, crawleando una sola URL

Un poco al hilo de la Accesibilidad Web, podemos simular que somos un robot que visita una página web. Así podemos sacar su contenido y algunos datos como por ejemlo todos los links que hayan. Aquí es donde, poniéndonos en el lugar de estos bots, tomamos consciencia de la importancia de la Accesibilidad Web para el posicionamiento SEO. En PHP es realmente sencillo visitar una URL y recorrerla sacando esta información. Por ejemplo, en apenas 30 líneas de código podemos visitar una web sacando mucha información:

<?php

$dom = new DOMDocument();

@$dom->loadHTMLFile('https://jnjsite.com/');

$titles = $dom->getElementsByTagName('title');
echo 'TITLE de la web: '.DOMinnerHTML($titles[0]).PHP_EOL;

for ($i = 1; $i <= 6; ++$i) {
  foreach ($dom->getElementsByTagName('h'.$i) as $h) {
    echo 'H'.$i.': '.substr(DOMinnerHTML($h), 0, 32).'..'.PHP_EOL;
  }
}

foreach ($dom->getElementsByTagName('a') as $link) {
  echo 'LINK: ';
  if($link->getAttribute('rel')){
    echo 'TYPE '.$link->getAttribute('rel').': ';
  }
  echo $link->getAttribute('href').PHP_EOL;
}

function DOMinnerHTML(DOMNode $element)
{
  $innerHTML = '';
  $children = $element->childNodes;

  foreach ($children as $child) {
    $innerHTML .= $element->ownerDocument->saveHTML($child);
  }

  return $innerHTML;
}

Este es un script preparado para ejecutar desde línea de comandos. Aquí sólo busca el título de la web, los encabezados del H1 al H6, y todos los enlaces. Podemos guardarlo por ejemplo en un fichero llamado test.php y ejecutarlo así:

$ php test.php

Deberemos de ver algo parecido a lo siguiente:

Initial Bot: crawleando jnjsite.com

Sacando todos las URLs de un sitio

Un sencillo script para sacar todas las URLs de un sitio:

<?php

$theSite = 'https://www.tusitio.com/';
$theLinks = array();

get_links($theSite, $theSite, $theLinks);

function get_links($theSite, $url, &$theLinks)
{
  $dom = new DOMDocument();

  @$dom->loadHTMLFile($url);
  foreach ($dom->getElementsByTagName('a') as $link) {
    echo 'LINK: ';
    if ($link->getAttribute('rel')) {
      echo 'TYPE '.$link->getAttribute('rel').': ';
    }
    $newLink = $link->getAttribute('href');
    echo $newLink.' ';
    if (!in_array($newLink, $theLinks) and substr($newLink, 0, strlen($theSite)) == $theSite) {
      // If link not yet followed and in site..
      echo 'following link!'.PHP_EOL;
      $theLinks[] = $newLink;
      get_links($theSite, $newLink, $theLinks);
    } else {
      echo 'yet followed!'.PHP_EOL;
    }
  }
}

echo 'Total links found: '.count($theLinks);

Bastaría con cambiar el valor de la variable $theSite por el sito que quieres crawlear. Lo ejecutas desde línea de comandos, y debes de ver algo parecido a esto:

Sacando links de una web

¿Es necesario programar para hacer esto?

Estos dos scripts están hechos en puro PHP, sin usar ninguna librería externa, sin panel de control, sin guardar los resultados.. pero puede ser un buen punto de partida. Hay otras formas de navegar por las webs mediante robots, podemos hacer login, hacer clicks en botones, seguir enlaces, subir archivos, descargar imágenes.. Hay mucho desarrollado sobre esto que nos puede ahorrar mucho tiempo. Es muy potente usar cURL+PHP..

También hay herramientas, gratis o de pago, con las que hacer auditorías o sacar esta información. Pero imagina que necesitas rizar el rizo, guardando esta información para combinarla creando sitios web, o secciones de tu sitio web. Quizá simplemente quieres recorrer tu propia web para forzar que se guarde en caché, así irá más rápido cuando venga el robot indexador de Google o Bing. Quizá quieres inyectar información de productos en tu web a partir de feeds de datos de productos de los distribuidores. O quizá simplemente quieres comprobar que los enlaces están bien sin tener que esperar a esa herramienta de pago que tienes contratada. Quizá simplemente quieres hacer un bot que entre todos los días en una web, y le de a un botón cada hora. O quizá simplemente quieras ahorrarte un dinero todos los meses, haciendo experimentos de paso. Si no quieres depender del ‘hasta donde puede llegar’ una herramienta comercial, tendrás que desarrollar algo a medida de lo que necesites.


Magento: sacar el ciclo de ventas con un script de PHP

2017-06-24 - Categorías: Magento
Magento logo money

He recibido una consulta sobre cómo sacar el ciclo de ventas de Magento. Ya respondí, pero los cálculos no me salen exactos. Así que jugando, jugando.. he tratado de encontrar cómo Magento calcula el ciclo de ventas que vemos en el panel de control.

Como no me daba exacto, he recorrido después las facturas, que tampoco me daba exacto. Y después añadí el recorrido de los abonos. Con y sin impuestos, tampoco me daba la misma cifra. Balanceando facturas con abonos, con y sin impuestos, que es lo correctamente contable tampoco me salía la misma cifra, aunque se iba acercando.. Conclusión, que en una tarde recorriendo los pedidos, facturas y abonos, no salen los mismos cálculos que te muestra Magento en el panel de control. Pero aquí dejo la información para el que le pueda servir 😉 de todas formas, contablemente, lo correcto son contabilizar las facturas y abonos.

Continuar leyendo..

Magento: modificar comportamientos mediante eventos y observadores

2017-06-16 - Categorías: General
Magento logo

Una de las formas más interesantes de modificar el comportamiento de tu Magento es utilizar los eventos. Se ejecutan en cada click del navegador, cuando un visitante se registra, cuando se añade un producto al comparador, cuando se crea un pedido, cuando se visita una página, una categoría, un producto, cuando un visitante entra a su zona de usuario, edita sus datos, busca contenidos.. es ingente la cantidad de eventos. Es decir, que contínuamente se están disparando una tonelada de eventos mientras que se ejecuta Magento.

Cuando empiezas a programar nuevos comportamientos, puedes buscar en StackOverflow o Googleando. A ver cuál es el evento que necesitas. Con la esperanza de que alguien haya compartido ya algo sobre esto..

Continuar leyendo..

Magento: cómo hacer overriding de las plantillas .phtml del backend

2017-02-27 - Categorías: General / Magento / PHP
Magento logo

Es ingente la cantidad de cosas que se pueden hacer en un Magento recién instalado. Es un CMS orientado al eCommerce muy completo. También muy orientado a la optimización para motores de búsqueda (SEO). Tiene muchas características que le dotan de gran flexibilidad. Entre ellas es la «sencilla» forma de ampliar funcionalidades sin que nada se rompa. Siempre claro, que hagamos lo que en programación se llama overriding. De esta forma, no tocaremos los ficheros originales, ampliando o modificando su funcionamiento en otro espacio de trabajo.

Qué es hacer overriding

Es la forma correcta de hacer las cosas. Si queremos modificar o ampliar funcionalidades de un CMS, lo que siempre debemos de hacer es overriding. Por ejemplo, en WordPress es bastante habitual encontrarte con plantillas que se han modificado. Si se han modificado con el editor que te trae WordPress en el mismo panel de control, sin antes haber hecho una plantilla hija de la original, el problema es que esto no es hacer overriding. Y cuando vamos a actualizar la plantilla.. ¡zasca! se borran todos los cambios hechos.

Continuar leyendo..

PHP7: paralelizando procesos, aprovechando el procesador al 100%

2017-02-06 - Categorías: General / GNU/Linux / PHP
php7-logo

Igual que en otros lenguajes de programación, aquí en PHP también tenemos disponibles funciones del estándar POSIX para gestionar procesos, obtener información de ellos, hacer colas FIFO, enviar señales, hacer procesos hijos, esperar a que terminen unos para continuar otros, matarlos.. etcétera. Todo esto te dará lo que necesitas para pasar de una programación lineal, paso a paso, a una programación concurrente, paralelizando los procesos.

Esto se usa desde línea de comandos. No recomiendan en absoluto que se active y se use esto sobre servidor web, ya que los servidores web tienen sus propias estrategias de paralelización. Pero si como yo, has estado trabajando desde línea de comandos con este tema. Y has llegado a tareas que tardan mucho tiempo y se lanzan desde línea de comandos. Con esto podrás lanzar en paralelo todas las tareas que necesites, así aprovecharás todos los núcleos del procesador, y terminará antes el proceso completo.

Necesitarás tener activado el módulo PCNTL en PHP. Para saber si ya lo tienes activado ejecuta php -i, si no edita el php.ini para activarlo.. En PHP7 ya me venía activado. Con esto te evitas también la engorrosa instalación de Pthreads recompilando PHP con ZTS, además de la instalación posterior de Pthreads. Simplemente usando el mencionado PCNTL..

Continuar leyendo..

Prestashop 1.7: las apariencias engañan, muchos cambios donde no se ve

2017-01-23 - Categorías: General / Prestashop
Prestashop back-end inicio

El 7 de noviembre de 2016 se publicó la nueva versión 1.7 de Prestashop. Esta versión trae un remake del 100% del core, reescrito con Symfony. Cuando leí sobre esto, empezó a intrigarme más y más. Quería ver cómo iba este proyecto. Pasó por mis manos un proyecto que funciona en Prestashop 1.6, ¡qué lástima!, no íbamos a actualizarlo. Pero ahora sí, tenemos entre manos un nuevo proyecto, y tenemos que estimar a ver si lo montamos sobre Prestashop 1.7. Así que manos a la obra..

Continuar leyendo..

Prestashop: cómo instalar en tu ordenador una tienda que tienes en Internet

2017-01-14 - Categorías: General / Prestashop
Logo de Prestashop

¡Hola de nuevo! Hoy traigo otro pequeño HOWTO para configurar en tu propio ordenador una instalación de Prestashop que tengas en Internet. Muchas veces podemos andar trabajando directamente en un Prestashop. Pero si queremos modificarlo sin peligro de romperlo, o llevándolo al extremo en sus modificaciones. Al final no hay tu tía que valga, no nos queda otra opción que instalarnos localmente el susodicho Prestashop.

Herramientas

Antes que nada, doy por sentado que si estás aquí ya habrás configurado algún que otro XAMPP, LAMPP o WAMPP. Lo recomiendo para los newbies, porque es muy sencillo instalar. Es el pack completo de programas necesarios para hacer webs localmente. AMPP se refiere a Apache, MariaDB (sustituto de Mysql), PHP y Perl; mientras que X es para X OS, L para Linux y W para Windows. Los tenemos aquí:

Continuar leyendo..

Magento: listando precios de los productos

2016-12-07 - Categorías: General / Magento / PHP
Magento logo

Hoy traigo un pequeño HOWTO para ver el estado de los precios del catálogo de productos. Está hecho sobre un Magento 1.9. La idea es la misma que vengo exponiendo en posts anteriores. Es decir, cogemos la colección de productos y vamos imprimiendo por pantalla los datos. Esto si queremos lo guardamos en un fichero y a trabajar con los datos.

Vamos al grano hermano..

Continuar leyendo..

Magento: pedidos, stocks y su ciclo de vida

2016-11-14 - Categorías: General / Magento
Magento motor

Para mejorar la eficiencia de una empresa, debemos de darle especial atención a la cantidad de activos que tenemos disponibles. Los activos de una empresa son los productos que se venden. Saber cuántos hay exactamente, cuántos hay que pedir a proveedores, si permitimos ventas infinitas, si estamos en rotura de stock.. Todo esto es información muy importante para mejorar los procesos de una empresa. Si esto mejora, debería de mejorar también el trato con el cliente, la percepción que tiene de nosotros, la cantidad de incidencias que podamos tener. Podemos pensar que tenemos un producto en stock que luego hay que pedir a proveedores. O puede pasar que no se esté vendiendo un producto que tenemos en stock. O simplemente para minimizar la cantidad de stock en almacén también es interesante automatizar todo lo que se pueda. Aquí llegamos al ciclo de vida de los pedidos y stocks en Magento.

Todo esto es un tema muy grande, y a la par divertido. Ir viendo cómo con cada ajuste todo mejora. Ir viendo cómo con cada batida de inventario el catálogo va mejorando día a día. Los productos se crean, suben los stocks. Bajan hasta llegar a cero, se pone a fuera de existencia.. Pedidos por debajo de cero creando necesidades de compra al suministrador.. Limitando existencias dejando al cliente que sepa que se lo podemos pedir..

Todo este control es un clásico de un ERP. Un ERP es un programa muy muy complejo de poner en marcha. Las muy pequeñas y pequeñas empresas no los suelen tener porque necesita mucho esfuerzo para ponerlo en marcha y revisarlo. Pero una vez más, Magento trae parte de esta gestión incorporada en el sistema. Es decir, Magento no es un ERP, pero te trae parte de la gestión de existencias ya incorporada de casa.

Continuar leyendo..

WordPress: desarrollar tu propio tema personalizado 100% tuyo

2016-09-24 - Categorías: General / PHP / WordPress
WP Bootstrap Boostwatch Cyborg

¡Hola de nuevo! Continuando con el post anterior sobre el desarrollo de temas para WordPress. Inevitablemente, ya sea más tarde o más temprano, llegaremos a querer desligarnos totalmente de modificar los temas de otros. Todos hemos empezado haciendo pequeños arreglos con el editor que tiene WordPress. Si has seguido el post anterior sobre cómo hacer un theme hijo de otro te habrás quedado con ganas de más, así que continuándolo vamos a crear uno básico 100% tuyo para lo que necesites.

Ahora bien, lo normal es que si estás aquí alguna vez hayas jugueteado con temas de WordPress de otros, modificándolos y llegando a un punto en el que no puedes actualizarlo porque perderías las modificaciones. Por otro lado si haces un tema hijo siempre vas a depender del padre, y también puede que haya actualizaciones del padre que rompan tu diseño. Así que la forma más profesional de solucionar esto es hacer tu propio tema, 100% tuyo, y totalmente desligado de cualquier otro.

Continuar leyendo..

WordPress: desarrollar tu propio tema personalizado

2016-09-11 - Categorías: General / SEO / WordPress
WP child themes

¡Hola de nuevo! Estoy trabajando últimamente mucho con WordPress, así que he pensado que sería bueno ponerse al día indagando un poco más en cómo está hecho WordPress y cómo funcionan los llamados themes. Los themes son diseños que se pueden instalar en tu WordPress y lo hacen más atractivo a la vista, mejorando cosas de UI/UX que llaman los expertos. Es decir, mejoran el diseño, la interfaz de usuario, la usabilidad, la accesibilidad.. Estas materias en el desarrollo de software son principales para todos los que trabajamos con software con interfaz de usuario. Por esto que en la mayoría de estudios relacionados hemos tenido asignaturas destinadas única y exclusivamente a esta materia (Diseño web, Programación en Internet, Interfaces, Gráficos por computador..), algunas más hueso y otras más de sentido común.

Continuar leyendo..

© 2023 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.