
Negocios del Web
Épsilon
Hospedaje
Verificación en dos pasos activada
Crear un pequeño BOT [Extraer información de webs] [1/2]
Hola a todos 🙄. Antes de nada quiero aclarar que este pequeño tutorial es 100% mio y no ningún copypaste. Realizado especialmente para Forobeta.
Ese tutorial es para guiar un poco sobre como realizar dicho tutorial, claro esta que no con ese tutorial se podrá extraer todo sin problemas Empezamos...
Requisitos:
Primero nos descargamos la class desde su web y la añadimos en nuestra carpeta de trabajo. Después quedamos un index.php (por ejemplo) ya que desde ahí trabajaremos.
Primero añadimos la class con require_once y todo seguido vamos a añadir set_lime_time(0) para que en ese script no haya tiempo limite de ejecución.
Después de eso añade un cuerpo html para configurar el meta charset. Nos quedara a si:
Enlace eliminado
Ahora vamos a crear 1 variable con una función para extraer la información: $web = file_get_html('http://www.marca.com/');. Como podéis ver vamos a hacer el ejemplo extrayendo información deportiva de la website "Marca.com".
En este ejemplo es necesario añadir un patrón con expresión regular entonces yo he añadido otra variable con un patron que explicare mas adelante: $expresion = "^http://";
Quedando a si:
Enlace eliminado
Ahora llega lo interesante, para este ejemplo quiero extraer el titular y la información de todas las noticias. La librería simplehtmldom extraer información mediante elementos CSS, tranquilo no te asustes vamos a ello.
Para extraer la información que hay dentro de la noticia primero hay que extraer el enlace para entrar a cada articulo, para ello vamos revisar donde esta ese enlace mediante el código de fuente. Yo utilizo Enlace eliminado (F12) para examinar el código de fuente de manera ordenada.
En este ejemplo para acceder a la noticia hay que dar click al h2 de la noticia breve.
Enlace eliminado
Ahora toca mirar el lado del código de fuente estudiando el código de fuente de este ejemplo solo se utiliza el h2 para el titulo de la entrada entonces procedemos a hacer la extracción de información.
Vamos a buscar todos los h2 sin hacer filtro por class ya que todos los h2 son el titular de la web.
Enlace eliminado
Como podemos ver en la foto dentro del h2 esta lo que necesitamos el anchor para ello realizamos la misma operación que la anterior para buscar los "a" dentro de los "h2" y imprimimos el resultado para ver como va quedando.
Quedando a si:
Enlace eliminado
Y ya podemos ver resultados por pantalla. Le he añadido un <br> para que se visualicen bien los enlaces.
Enlace eliminado
Ya se visualizan resultados aunque hay algunos que no me interesan que son los que empiezan por http://. Recordar que anterior mente he añadido un patrón para que los resultados que empiecen con http:// no se visualicen.
Como no me interesan los enlaces que empiecen por http:// los voy a excluir y empezar a extraer la información de todos los artículos.
Ahora solo tengo enlaces incompletos pero tan solo tengo que añadir la url principal. La lógica del asunto hasta lo que llevamos es:
Ya tengo el condicional para que los resultados que empiecen por http:// los excluya, tengo una variable que almacena y completa la URL para extraer la información y por ultimo extraigo el dom de cada URL que va pasando por el bucle. Quedando a si:
Enlace eliminado
Ya estamos en la recta final ahora nos toca buscar en el dom donde se encuentran por ejemplo; el titulo y la descripcion. Vamos a extraer el titulo y la descripción de todos los artículos.
Primero buscamos el titular en el dom:
Enlace eliminado
Como podemos ver en la imagen se encuentra en el h1 de un div con class llamada cab_articulo.
Ahora procedemos a hacer el escaneo con find(".cab_articulo h1").
Como también me interesa la descripción del articulo vamos al código de fuente y buscamos donde se encuentra.
Enlace eliminado
Como podemos ver en la imagen se encuentra en los p de un div con class llamada cuerpo_articulo.
Ahora procedemos a hacer el escaneo con find(".cuerpo_articulo p").
Nos quedaría el código a si, yo le he añadido un poco de formato para que se pueda visualizar el código con claridad.
Enlace eliminado
Y el resultado en pantalla es...:
Enlace eliminado
En la imagen podemos ver unas cuantas cosas como por ejemplo todas las noticias que a extraído (ver en el scroll derecha), también que a extraído todo correctamente el articulo que hemos tomado como ejemplo y ahora ya podríamos por ejemplo añadirlo a una base de datos todo.
Espero que les haya gustado el tutorial, parece complicado pero no lo es una vez pilles el truco lo podrás hacer sin problemas y rápido. Tengo que decir que es un bot muy básico y simple. No lo he querido hacer complejo, orientado a objetos, etc para que los nuevos no les asuste tanto 🙂
Si te a gustado el tutorial por favor dame un "Me agrada".
Respondo dudas si las tenéis.
Un saludo!
Hola a todos 🙄. Antes de nada quiero aclarar que este pequeño tutorial es 100% mio y no ningún copypaste. Realizado especialmente para Forobeta.
Ese tutorial es para guiar un poco sobre como realizar dicho tutorial, claro esta que no con ese tutorial se podrá extraer todo sin problemas Empezamos...
Requisitos:
- Conocimientos muy basicos de PHP
- Conocimientos muy basicos de CSS
- Class de PHP llamada "simplehtmldom"
Primero nos descargamos la class desde su web y la añadimos en nuestra carpeta de trabajo. Después quedamos un index.php (por ejemplo) ya que desde ahí trabajaremos.
Primero añadimos la class con require_once y todo seguido vamos a añadir set_lime_time(0) para que en ese script no haya tiempo limite de ejecución.
¿Por que?: Como es obvio no todas las web's tienen el mismo contenido una puede tener 4 o 5 entradas o 2.000 entradas. Por defecto php deja de funcionar con un fatal error si sobrepasa los 30 segundos de ejecución. Dejándolo a cero podrá trabajar todo el tiempo el bot sin que se pare la ejecución. Por ejemplo: Para extraer miles de películas es obligatorio dejar ilimitado el tiempo de ejecución para que trabaje el tiempo que necesite.
Después de eso añade un cuerpo html para configurar el meta charset. Nos quedara a si:
Enlace eliminado
Ahora vamos a crear 1 variable con una función para extraer la información: $web = file_get_html('http://www.marca.com/');. Como podéis ver vamos a hacer el ejemplo extrayendo información deportiva de la website "Marca.com".
En este ejemplo es necesario añadir un patrón con expresión regular entonces yo he añadido otra variable con un patron que explicare mas adelante: $expresion = "^http://";
¿Que hace la función file_get_html?: Extrae el DOM(Document Object Model) o Codigo de fuente de la website.
Quedando a si:
Enlace eliminado
Ahora llega lo interesante, para este ejemplo quiero extraer el titular y la información de todas las noticias. La librería simplehtmldom extraer información mediante elementos CSS, tranquilo no te asustes vamos a ello.
Para extraer la información que hay dentro de la noticia primero hay que extraer el enlace para entrar a cada articulo, para ello vamos revisar donde esta ese enlace mediante el código de fuente. Yo utilizo Enlace eliminado (F12) para examinar el código de fuente de manera ordenada.
En este ejemplo para acceder a la noticia hay que dar click al h2 de la noticia breve.
Enlace eliminado
Ahora toca mirar el lado del código de fuente estudiando el código de fuente de este ejemplo solo se utiliza el h2 para el titulo de la entrada entonces procedemos a hacer la extracción de información.
Explicación breve:: La class simplehtmldom tiene una función llamada find que se utiliza para mediante un tag buscar información: Ejemplo: $web->find("h2").
Vamos a buscar todos los h2 sin hacer filtro por class ya que todos los h2 son el titular de la web.
Enlace eliminado
Como podemos ver en la foto dentro del h2 esta lo que necesitamos el anchor para ello realizamos la misma operación que la anterior para buscar los "a" dentro de los "h2" y imprimimos el resultado para ver como va quedando.
Explicación breve:: Para extraer un tag en concreto por ejemplo el href es tan sencillo como: Ejemplo: $web->href.
Quedando a si:
Enlace eliminado
Y ya podemos ver resultados por pantalla. Le he añadido un <br> para que se visualicen bien los enlaces.
Enlace eliminado
Ya se visualizan resultados aunque hay algunos que no me interesan que son los que empiezan por http://. Recordar que anterior mente he añadido un patrón para que los resultados que empiecen con http:// no se visualicen.
Alternativa:: Si no queréis utilizar expresiones regulares utilizar strpos.
Como no me interesan los enlaces que empiecen por http:// los voy a excluir y empezar a extraer la información de todos los artículos.
Explicación breve:: No me interesan por que no son entradas/artículos nuevos.
Ahora solo tengo enlaces incompletos pero tan solo tengo que añadir la url principal. La lógica del asunto hasta lo que llevamos es:
- Extraemos todo el DOM de la web principal.
- Buscamos en que lugar del dom se encuentra el enlace para ver el articulo.
- Cuando ya tenemos el enlace {estamos en este punto} procedemos a extraer la información como en el paso 1.
Ya tengo el condicional para que los resultados que empiecen por http:// los excluya, tengo una variable que almacena y completa la URL para extraer la información y por ultimo extraigo el dom de cada URL que va pasando por el bucle. Quedando a si:
Enlace eliminado
Ya estamos en la recta final ahora nos toca buscar en el dom donde se encuentran por ejemplo; el titulo y la descripcion. Vamos a extraer el titulo y la descripción de todos los artículos.
Primero buscamos el titular en el dom:
Enlace eliminado
Como podemos ver en la imagen se encuentra en el h1 de un div con class llamada cab_articulo.
Ahora procedemos a hacer el escaneo con find(".cab_articulo h1").
Como también me interesa la descripción del articulo vamos al código de fuente y buscamos donde se encuentra.
Enlace eliminado
Como podemos ver en la imagen se encuentra en los p de un div con class llamada cuerpo_articulo.
Ahora procedemos a hacer el escaneo con find(".cuerpo_articulo p").
Nos quedaría el código a si, yo le he añadido un poco de formato para que se pueda visualizar el código con claridad.
Enlace eliminado
¿Que hace la función plaintext?: Hace que se muestre en texto plano ya que si se visualiza tal cual lo extra podríamos ver el resultado en HTML cosa que no es lo que queremos..
Y el resultado en pantalla es...:
Enlace eliminado
En la imagen podemos ver unas cuantas cosas como por ejemplo todas las noticias que a extraído (ver en el scroll derecha), también que a extraído todo correctamente el articulo que hemos tomado como ejemplo y ahora ya podríamos por ejemplo añadirlo a una base de datos todo.
Espero que les haya gustado el tutorial, parece complicado pero no lo es una vez pilles el truco lo podrás hacer sin problemas y rápido. Tengo que decir que es un bot muy básico y simple. No lo he querido hacer complejo, orientado a objetos, etc para que los nuevos no les asuste tanto 🙂
Si te a gustado el tutorial por favor dame un "Me agrada".
Respondo dudas si las tenéis.
Un saludo!
Última edición: