Web Scraping con php

Web Scraping con php

Web Scraping con php. Seguro que como programador has necesitado acceder alguna fuente de datos pública sin APIs para hacer periodismo de datos. Con PHP puedes extraer información de una web aunque tambien lo puedes hacer con Phyton, Ruby o Perl. Has pensado en algún trabajo complicado. Con los Frmeworks y ejemplos vas a comprobar que es realmente sencillo poder sacar información de otra web. Empezaremos con un ejemplos muy básicos y os daremos un listado de algunos framework y servicios que ayudarán al rastreo y extracción de datos en la que puedes crearte un API con datos de una web.

¿Que es el web scraping?

El web scraping es una técnica que permite leer el contenido de un sitio web mediante un software con la finalidad de extraer datos del sitio por ejemplo. Los motores de búsqueda como Google utilizan estas técnicas para analizar e indexar los contenidos de los sitios web. Además, entre los usos más comunes encontramos recolección de datos, comparación de precios, simulación de navegación, testing, etc. No seas malo que no sólo sirve para robar contenido sino que lo usan todos los motores de búsquedas. El uso del web scraping  es controvertido, debido a que muchas veces puede violar los términos y condiciones . Asegurate antes que por ejemplo en contenido sea público.

Ejemplo básico

Antes que nada en este ejemplo básico vamos a usar dos funciones que son:

  1. file_get_contents: tiene co1mo parámetro una URL y devuelve el contenido en HTML de esta. Ver documentación
  2. preg_match: sirve para encontrar coincidencias dentro de una cadena, usando expresiones regulares. Ver documentación

En el siguiente ejemplo vamos a sacar el título de mi web, que es lo que está dentro de la etiqueta <title>

$html = file_get_contents('http://www.frikipandi.com/');
preg_match('/<title>(.*)<\/title>/i', $html, $title);
$title_out = $title[1];

Y poco más se puede decir de este sencillo ejemplo, que sólo hace falta ponerle un poco de creatividad y sacarás cualquier elemento de una web.

Ejemplo con curl

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,’http://www.frikipandi.com’);
curl_setopt($ch,CURLOPT_USERAGENT,’Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0′);
curl_setopt($ch,CURLOPT_HTTPHEADER,array(“Accept-Language: es-es,en”));
curl_setopt($ch,CURLOPT_TIMEOUT, 10);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
//Guardar pagina
$result = curl_exec($ch);
curl_close($ch); //Cerramos la conexion CURL.

//Saco la seccion
preg_match_all(“(<title>(.*)<\/title>)siU”, $result, $matches1);

$titulo = $matches1[1][0];
echo “Titulo: ” . $título;

Ejemplo con SimpleXML

Para leer el rss de las aplicaciones top gratuitas de Apple. SimpleXMLElement en u objeto de PHP 5 muy util para tratar xml, rss incluso html ya que lo conviertes en un vertor accesible de forma sencilla.

$xml = file_get_contents(‘http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topfreeapplications/limit=10/xml’);
$sxe = new SimpleXMLElement($xml);
var_dump($sxe);

Frameworks en PHP

En esta sección vamos a comentar algunos de los frameworks más completos que he encontrado para PHP, no se trata de una documentación ni de ejemplos porque esto ya lo encontrarás en cada una de las webs de dichas librerías. Estos son los frameworks para scrapear en PHP:

  1. Selenium WebDriver: La característica nueva en Selenium 2.0 es la integración de la API WebDriver. WebDriver está diseñado para proporcionar una interfaz de programación más sencilla además de abordar algunas limitaciones en la API de selenio-RC. Selenio-WebDriver fue desarrollado para apoyar mejor las páginas web dinámicas donde los elementos de una página pueden cambiar sin la propia página se vuelve a cargar. El objetivo de WebDriver es suministrar una API orientada a objetos. Para PHP tenemos una interpretaciónhttps://code.google.com/p/php-webdriver-bindings/ Aunque también esta para Java, Pyton , Ruby, C#, perl y Javasscript.
  2. Goutte: Es una librería de web crawling en PHP. Goutte proporciona una agradable API para rastrear sitios web y extraer los datos de las respuestas ya sea HTML o XML. Ha sido creado con Symfony2, por lo que si tu proyecto PHP empleas este framework te viene genial para integrarlo.
  3. Guzzle: Es un framework que incluye las herramientas necesarias para crear un cliente robusto de servicios web. Incluye: descripciones de Servicio para definir las entradas y salidas de una API, iteradores para recorrer webs paginadas, procesamiento por lotes para el envío de un gran número de solicitudes . Indispensable si usas Symfony2.
  4. Snoopy: Es una clase PHP que simula un navegador web. Automatiza la tarea de recuperar los contenidos de la página web y la publicación de los formularios, por ejemplo.
  5. PHPCrawl: Es un framework para el rastreo de sitios web usando el lenguaje de programación PHP, por lo que es conocido como la librería webcrawler o rastreador de PHP. Ofrece varias opciones para especificar el comportamiento de la extracción como filtros Content-Type, manejo de cookie, manejo de robots.txt, limitación de opciones, multiprocesamiento y mucho más.
  6. Ultimate Web Scraper Toolkit: The Ultimate Web Scraper Toolkit es un potente conjunto de herramientas diseñadas para manejar todas sus necesidades de web scrapping en casi todos los servidores web
  7. Simple DOM Parser:  Un DOM analizador HTML escrito en PHP5 + le permiten manipular HTML de una manera muy fácil.$$html = file_get_html(‘http://www.google.com/’);// Find all images
    foreach($html->find(‘img’) as $element)
    echo $element->src . ‘<br>’;// Find all links
    foreach($html->find(‘a’) as $element)
    echo $element->href . ‘<br>’;

Import.io

Interesante proyecto en el que puedes acceder a cualquiera web como si tuviera un API, sin necesidad de que ésta lo ofrezca. Muy interesante para sacar datos de BOE o de las administraciones españolas. Sólo tienes que crear un conector desde un programa que te descargas e indicar los datos que vas a extraer de tal web y el ya se encarga de ofrecértelo en un formato más cómodo como un Json o XML. Lo bueno también es que si en algún momento la estructura del HTML de la web cambia este te avisa para que le vuelvas a indicar donde están los datos que deseas sacar.
Échale un vistazo en Import.io

Morph.io

Escriba en su web Crawler en el idioma que conoces Ruby , Python , PHP y Perl son compatibles. No necesitas tener un servidor para ejecutarlo y lo puede unir con Github. El código se mantienen en repos GitHub públicos y luego nos consumen los datos con una API https://morph.io/

Más de 2.000 código públicos, con gran cantidad de datos, disponible para reutilizar, de forma gratuita. Descarga de datos como un archivo CSV, JSON o puedes utilizar su API. Para sacar el listado de diputados. http://www.congreso.es/portal/page/portal/Congreso/Congreso/Diputados/BusqForm?_piref73_1333155_73_1333154_1333154.next_page=/wc/fichaDiputado?idDiputado=268&idLegislatura=10 Os dejamos un Ejemplo con Ruby
# This is a template for a Ruby scraper on Morph (https://morph.io)
# including some code snippets below that you should find helpful

require ‘scraperwiki’
require ‘mechanize’
#
agent = Mechanize.new
#
# # Read in a page
page = agent.get(” http://www.congreso.es/portal/page/portal/Congreso/Congreso/Diputados?_piref73_1333056_73_1333049_1333049.next_page=/wc/menuAbecedarioInicio&tipoBusqueda=completo&idLegislatura=10″)
#todos los enlaces de una pagina
#page.links.each do |link|
#puts link.text
#end
#todos los diputados
diputados = [] while true
diputados.concat(page.links_with(href: /fichaDiputado/))
page.links_with(href: /fichaDiputado/).each do |link|
# puts link.text
end
next_page=page.link_with(text: /Siguiente/)
break if next_page ==nil
page= next_page.click
end
#page = agent.get(“http://www.congreso.es/portal/page/portal/Congreso/Congreso/Diputados/BusqForm?_piref73_1333155_73_1333154_1333154.next_page=/wc/fichaDiputado?idDiputado=268&idLegislatura=10″)

diputados.each do |diputado
page =diputado.click
name = page.search(‘div.nombre_dip’).text
#mail = page.links_with(href: /mailto/)
div = page.search(‘div#curriculum’)
div.search(‘a’).each do |link|
#puts link[‘href’] if link[‘herf’] =~/mailto:/
end
#email= div.search(‘a[href*=mailto’).text.strip
email_link= div.search(‘a[href*=mailto]’)
email=email_link ? email_link.text.strip : ”

puts “‘#{name}’, #{email}””
#div.search(‘a[href*=mailto’).text.strip
end

Kimono

Échale un vistazo a esta herramienta. https://www.kimonolabs.com/ Simplemente genial

A mi me ha salvado en unas cuantas ocasiones. Te lo instalas como extensión en el navegador y seleccionas aquello que quieres scrapear con el ratón. Es muy fácil. Puedes indicarle incluso los botones de paginación y no necesitas conocimiento de scrapping o programación

Los datos extraídos te los puedes descargar desde su web en Json,csv y xml creo, o hacer una consulta desde tu propio código PHP al API que te han generado y obtener la respuesta en estos mismos formatos. Muy fácil para automatizar fuentes de daatos no muy complicado por ejemplo para sacar por ejemplo listado de los diputados para hacer periodismo de datos. http://www.congreso.es/portal/page/portal/Congreso/Congreso/Diputados?_piref73_1333056_73_1333049_1333049.next_page=/wc/menuAbecedarioInicio&letraElegida=A&tipoBusqueda=porLetra&idLegislatura=10

Si conoces otros framework o aplicaciones y servicios similares a import.io o Kimono compártelas en un comentarios y si te gusta el artículo compartelo con tus amigos en las redes sociales. Espero que guste el Web Scraping con php

Te interesa

Las series y películas más vistas en Netflix de 2017

Las series y películas más vistas en Netflix de 2017. Termina un año 2017 marcado por la consagración de …

  • ronald cardenas

    muchas gracias por el tutorial esta muy bueno, una pregunta tu que recomiendas para scraping de cualquier web y lo mas sencillo posible curl y php o alguno de los frameworks que compartiste ?

Últimas noticias de Frikipandi.com

Las noticias se actualizan cada 15 minutos.