Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby
Code

Construyendo tu Primer Scraper Web, Primera Parte

by
Length:LongLanguages:

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Rubyland tiene dos piedras preciosas que han ocupado el foco del scraping de la tela para los últimos años: Nokogiri y Mechanize. Pasamos un artículo sobre cada uno de estos antes de ponerlos en acción con un ejemplo práctico.

Temas

  • ¿Qué es la Web Scraping? 
  • Permiso
  • El problema
  • Nokogiri
  • ¿Extracción?
  • Páginas
  • API
  • Navegación del Nodo

¿Qué es Web Scraping?

Hay términos más sofisticados que la web o el scraping de pantalla. La recolección de la tela y la extracción de datos de la tela casi te dicen enseguida qué está sucediendo. Podemos automatizar la extracción de datos de páginas web — y no es tan complicado.

En cierto modo, estas herramientas te permiten imitar y automatizar la navegación web humana. Escribes un programa que sólo extrae el tipo de datos que te interesan. La orientación de datos específicos es casi tan fácil como usar selectores CSS.

Hace unos años me suscribí a algún curso de vídeo en línea que tenía como un millón de videos cortos, pero no hay opción para descargarlos en masa. Tuve que ir a través de cada enlace por mi cuenta y hacer el temido "guardar como" yo mismo. Era una especie de scraping web humano, algo que a menudo necesitamos hacer cuando no tenemos el conocimiento necesario para automatizar ese tipo de cosas. El curso en sí estaba bien, pero no usé más sus servicios después de eso. Era demasiado tedioso.

Hoy, no me interesaría demasiado ese UX tan revelador. Un scraper que me hiciera la descarga me llevaría solo un par de minutos armarlo. ¡No hay problema!

Déjame desglosarlo muy rápido antes de comenzar. Todo se puede condensar en un par de pasos. Primero buscamos una página web que tenga los datos deseados que necesitamos. Luego buscamos en esa página e identificamos la información que queremos extraer.

El último paso es enfocar estos bits, cortarlos si es necesario y decidir cómo y dónde desea almacenarlos. El HTML bien escrito es a menudo la clave para que este proceso sea fácil y agradable. Para extracciones más complicadas, puede ser doloroso si tiene que lidiar con marcados mal estructuradas.

¿Qué hay de las API? Muy buena pregunta. Si tiene acceso a un servicio con una API, a menudo hay poca necesidad de escribir su propio scraper. Este enfoque es principalmente para sitios web que no ofrecen ese tipo de conveniencia. Sin una API, esta es a menudo la única forma de automatizar la extracción de información de los sitios web.

Podrías preguntar, ¿cómo funciona realmente? Sin saltar al fondo, la respuesta corta es atravesando el árbol de estructuras de datos. Nokogiri construye estas estructuras de datos a partir de los documentos que lo alimenta y le permite orientar las partes de interés para la extracción. Por ejemplo, CSS es un lenguaje escrito para cruzar árboles, para buscar estructuras de datos de árbol, y podemos utilizarlo para la extracción de datos.

Hay muchos enfoques y soluciones para usar. Rubyland tiene dos gemas que han ocupado el centro de atención durante varios años. Muchas personas todavía confían en Nokogiri y Mechanize para las necesidades de scrapping HTML. Ambos han sido probados y probados para ser fáciles de usar y altamente capaces. Los miraremos a ambos. Pero antes de eso, me gustaría tomar un momento para abordar el problema que vamos a resolver al final de esta breve serie introductoria.

Permisos

Antes de comenzar scrapping, asegúrese de tener permiso de los sitios a los que intenta acceder para la extracción de datos. Si el sitio tiene una API o una fuente RSS, por ejemplo, puede que no solo sea más fácil obtener ese contenido deseado, sino que también podría ser la opción legal de elección.

No todos apreciarán si lo haces masivamente en sus sitios, comprensiblemente. Obtenga información sobre ese sitio en particular que le interesa y no se meta en problemas. Hay pocas probabilidades de que inflijas un daño grave, pero correr el riesgo, sin saberlo, no es el camino a seguir.

El problema

Necesitaba construir un nuevo podcast El diseño no estaba donde yo quería, y odiaba la forma de publicar publicaciones nuevas. ¡Maldito WYSIWYG! Un poco de contexto. Hace aproximadamente dos años, construí la primera versión de mi podcast. La idea era jugar con Sinatra y construir algo súper liviano. Me encontré con un par de problemas inesperados ya que hice casi todo a medida.

Viniendo de Rails, definitivamente fue un viaje educativo que aprecié, pero rápidamente lamenté no haber usado un sitio estático que podría haber implementado en GitHub a través de GitHub Pages. Implementar nuevos episodios y mantenerlos carecía de la simplicidad que estaba buscando. Por un tiempo, decidí que tenía peces más grandes para freír y me concentré en producir nuevo material de podcast.

El verano pasado comencé a ponerme serio y trabajé en un sitio Middleman alojado en las páginas de GitHub. Para la segunda temporada del espectáculo, quería algo genial. Un diseño nuevo y simplificado, Markdown para publicar nuevos episodios y ninguna pelea con Heroku. ¡Cielos! El caso es que tenía 139 episodios por ahí que necesitaban ser importados y convertidos primero para poder trabajar con Middleman.

Para publicaciones, Middleman usa archivos .markdown que han llamado frontmatter para datos, que básicamente reemplaza mi base de datos. Hacer esta transferencia a mano no es una opción para 139 episodios. Para eso es la computación. Necesitaba encontrar una forma de analizar el HTML de mi sitio web anterior, eliminar el contenido relevante y transferirlo a publicaciones de blog que utilizo para publicar nuevos episodios de podcast en Middleman.

Por  lo tanto, en los próximos tres artículos, les presentaré las herramientas comúnmente usadas en Rubyland para tales tareas. Al final, revisaremos mi solución para mostrarte algo práctico también.

Nokogiri

Incluso si eres completamente nuevo en Ruby/Rails, es muy probable que ya hayas oído hablar de esta pequeña gema. El nombre se quita a menudo y se pega contigo fácilmente. No estoy seguro de que muchos sepan que nokogiri es japonés para "sierra".

Es un nombre apropiado una vez que entiendes lo que hace la herramienta. El creador de esta gema es el encantador Tenderlove, Aaron Patterson. Nokogiri convierte documentos XML y HTML en una estructura de datos, una estructura de datos en árbol, para ser más precisos. La herramienta es rápida y ofrece una interfaz agradable también. En general, es una biblioteca muy potente que se encarga de una multitud de necesidades de scrapping HTML.

Puedes usar Nokogiri no solo para analizar HTML; XML también. Le brinda las opciones tanto del lenguaje de ruta XML como de las interfaces CSS para recorrer los documentos que carga. XML Path Language, o XPath para abreviar, es un lenguaje de consulta.

Nos permite seleccionar nodos desde documentos XML. Los selectores de CSS son probablemente más familiares para los principiantes. Al igual que con los estilos que escribe, los selectores de CSS hacen que sea increíblemente fácil orientar las secciones específicas de las páginas que son de interés para la extracción. Solo debe informar a Nokogiri qué es lo que persigue cuando se dirige a un destino en particular.

Páginas

Lo que siempre necesitamos para empezar es buscar la página real que nos interesa. Especificamos qué tipo de documento de Nokogiri queremos analizar: XML o HTML, por ejemplo:

some_scraper.rb

Nokogiri:XML y Nokogiri:HTML puede tomar objetos IO u objetos String. Lo que sucede arriba es sencillo. Esto abre y recupera la página designada usando open-uri y luego carga su estructura, su XML o HTML en un nuevo documento Nokogiri. XML no es algo con lo que los principiantes tengan que lidiar muy a menudo.

Por lo tanto, recomendaría que nos centremos en el análisis de HTML por ahora. ¿Por qué open-uri? Este módulo de la Biblioteca estándar de Ruby nos permite tomar el sitio sin mucho alboroto. Debido a que objetos IO son faciles, podemos hacer uso de open-uri.

API

Pongamos esto en práctica con un mini ejemplo:

at_css

some_podcast_scraper.rb

Lo que hicimos aquí representa todos los pasos que generalmente están relacionados con el scrapping web, solo a un nivel micro. Decidimos qué URL necesitamos y qué sitio necesitamos buscar, y las cargamos en un nuevo documento de Nokogiri. Luego abrimos esa página y nos dirigimos a una sección específica.

Aquí solo quería saber el título del último episodio. Usar el método at_css y un selector CSS para h2.post-title era todo lo que necesitaba para enfocar el punto de extracción. Sin embargo, con este método, solo haremos scrapping este elemento singular. Esto nos da el selector completo, que la mayoría de las veces no es exactamente lo que necesitamos. Por lo tanto, extraemos solo la porción de texto interno de este nodo a través del método text. Para comparar, puede verificar el resultado tanto para el encabezado como para el texto a continuación.

Salida

Aunque este ejemplo tiene aplicaciones muy limitadas, posee todos los ingredientes, todos los pasos que debe comprender. Creo que es genial lo simple que es esto. Debido a que podría no ser obvio a partir de este ejemplo, me gustaría señalar qué tan poderosa puede ser esta herramienta. Veamos qué más podemos hacer con un script de Nokogiri.

¡Atención!

Si eres principiante y no estás seguro de cómo orientar el HTML necesario para esto, le recomiendo que busques en línea cómo inspeccionar los contenidos de los sitios web en su navegador. Básicamente, todos los navegadores principales hacen que este proceso sea realmente fácil en estos días.

En Chrome, solo tiene que hacer clic derecho en un elemento del sitio web y elegir la opción de inspección. Esto abrirá una pequeña ventana en la parte inferior de su navegador que muestra algo así como una radiografía del DOM del sitio. Tiene muchas más opciones, y recomiendo pasar tiempo en Google para educarse. ¡Es un tiempo dedicado sabiamente!

css

El método css nos brindará no solo un elemento de elección sino cualquier elemento que coincida con los criterios de búsqueda en la página. ¡Muy limpio y directo!

some_scraper.rb

Salida

La única pequeña diferencia en este ejemplo es que iteraré en los encabezados sin formato primero. También extraje su texto interno con el método text. Nokogiri se detiene automáticamente al final de la página y no intenta seguir la paginación en ningún lugar automáticamente.

Digamos que queremos tener un poco más de información, por ejemplo, la fecha y el subtítulo de cada episodio. Simplemente podemos expandir el ejemplo anterior. De todos modos, es una buena idea seguir este paso por paso. Haz que funcione una pieza pequeña y agrega más complejidad en el camino.

some_scraper.rb

Salida

En este punto, ya tenemos algunos datos para jugar. Podemos estructurarlo o destruirlo de la manera que queramos. Lo anterior simplemente debe mostrar lo que tenemos de manera legible. Por supuesto, podemos profundizar en cada uno de ellos mediante el uso de expresiones regulares con el método text.

Analizaremos esto con más detalle cuando llegue el momento de resolver el problema real del podcast. No será una clase en la expresión regular, pero verás algo más en acción, pero no te preocupes, no tanto como para hacer explotar tu cerebro.

Atributos

Lo que podría ser útil en esta etapa es extraer el href para los episodios individuales también. No podría ser más simple.

some_scraper.rb

Los aspectos más importantes a los que hay que prestar atención aquí son [:href] y podcast_url. Si etiqueta en [:] simplemente puede extraer un atributo del selector de destino. He abstraido un poco más, pero se puede ver más claramente cómo funciona a continuación.

Para obtener una URL completa y útil, guardé el dominio raíz en una variable y construí la URL completa para cada episodio.

Echemos un vistazo rápido a la salida:

Salida

Genial, ¿no? Puede hacer lo mismo para extraer la [:class] de un selector.

Si ese nodo tiene más de una clase, obtendrá una lista de todas ellas.

Navegación del nodo

  • parent
  • children
  • previous_sibling
  • next_sibling

Estamos acostumbrados a tratar con estructuras de árbol en CSS o incluso jQuery. Sería un dolor si Nokogiri no ofreciera una práctica API para moverse dentro de esos árboles.

some_scraper.rb

Salida

Como puede ver por sí mismo, esta es una de las cosas más poderosas, especialmente cuando ve lo que .parent pudo recopilar de una vez. En lugar de definir un grupo de nodos a mano, puede recopilarlos al por mayor.

Incluso puede encadenarlos para más cruces involucrados. Puede tomar esto tan complicado como quiera, por supuesto, pero le advierto que mantenga las cosas simples. Puede volverse un poco difícil y difícil de entender rápidamente. Recuerda, "¡Hazlo simple, estúpido!"

some_scraper.rb

Salida

Pensamientos finales

Nokogiri no es una gran biblioteca, pero tiene mucho que ofrecer. Te recomiendo que juegues con lo que has aprendido hasta ahora y amplíes tu conocimiento a través de su documentación cuando chocas contra una pared. ¡Pero no te metas en problemas!

Esta pequeña introducción debería ayudarlo a comprender qué puede hacer y cómo funciona. Espero que lo exploren un poco más por su cuenta y se diviertan con él. Como descubrirá por su cuenta, es una herramienta rica que sigue dando.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.