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

Construyendo su primer Web scraper , parte 2

by
Length:LongLanguages:

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

En este tutorial, aprenderá cómo puede utilizar Mechanize para hacer clic en vínculos, completar formularios y cargar archivos. También aprenderá cómo dividir Mechanize objetos de página y cómo automatizar una búsqueda de Google y guardar sus resultados.

Temas

  • Pagina Única vs. Paginación
  • Mechanize
  • Agente
  • Página
  • Métodos de Nokogiri
  • Enlaces
  • Click
  • Formularios

Pagina Única vs. Paginación

Hasta ahora hemos pasado algún tiempo averiguando cómo podemos raspar la pantalla de una sola página usando Nokogiri. Esta fue una buena base para avanzar un paso y aprender a extraer contenido de varias páginas.

Después de todo, el problema que estamos tratando de resolver implica obtener el contenido de más de 140 episodios, que es más contenido que puede encajar razonablemente en una sola página web. Tenemos que trabajar con la paginación y la necesidad de averiguar cómo seguir el contenido por el agujero de conejo.

Aquí es donde Nokogiri se detiene y otra joya útil llamada Mechanize entra en juego.

Mechanize

Mechanize es otra herramienta poderosa que tiene un montón de cosas que ofrecer. Esencialmente te permite automatizar las interacciones con los sitios web de los que necesitas extraer contenido. En ese sentido, me recuerda un poco de algunas funcionalidades que usted podría saber de las pruebas con Capybara.

No me malinterpretes, jugar con Nokogiri en una sola página es impresionante en sí mismo, pero para trabajos de extracción de datos más picantes, necesitamos un poco más de potencia. Esencialmente podemos rastrear las páginas que necesitamos e interactuar con sus elementos, imitando y automatizando el comportamiento humano. ¡Cosas bastante poderosas!

Esta joya le permite seguir vínculos, rellenar campos de formulario y presentar que los datos, incluso tratar con las cookies está en la mesa. Esto significa que también puede imitar el inicio de sesión de los usuarios en sesiones privadas y obtener contenido de un sitio solo al que tiene acceso.

Usted llena el inicio de sesión con sus credenciales y decirle a Mechanize cómo seguir adelante. Como puedes hacer clic en vínculos y enviar formularios, hay muy poco que no puedas hacer con esta herramienta. Tiene una estrecha relación con Nokogiri y también depende de ello. Aaron Patterson es de nuevo uno de los autores de esta preciosa joya.

Instanciar un agente de Mechanize

Antes de que podamos empezar a mecanizar las cosas, necesitamos instanciar un agente de Mechanize.

some_scraper.rb

Este agente agent se usará para buscar una página, similar a lo que hicimos con Nokogiri.

some_scraper.rb

Lo que sucede aquí es que el agente de Mechanize obtuvo la página de podcast y sus cookies.

Extracción del contenido de la página

Ahora tenemos una página lista para la extracción. Antes de hacerlo, recomiendo que echemos un vistazo bajo el capó usando el método de inspección inspect .

some_scraper.rb

La salida es bastante sustantiva. Echa un vistazo y verás por ti mismo lo que consiste en un objeto Mechanize::Page. Aquí puede ver todos los atributos de esa página.Para mí, este es un objeto muy práctico para rebanar los datos que desea extraer. Aquí puede ver todos los atributos de esa página.

Para mí, este es un objeto muy práctico para rebanar los datos que desea extraer.

Salida

Si desea echar un vistazo a la página HTML en sí, puede marcar en el cuerpo body o métodos de contenido content .

some_scraper.rb

Salida

Dado que este podcast tiene sólo un pequeño número de elementos diferentes en la página, aquí está el Mechanize::Page que se devuelve de github.com. Tiene una mayor variedad de contenido para echar un vistazo. Creo que esto es importante para tener una idea.

Salida

De nuevo al podcast, también puedes ver cosas como codificaciones, el código de respuesta HTTP, el URI o los encabezados de respuesta.

some_scraper.rb

Salida

Hay muchas más cosas si quieres profundizar. Lo dejaré en eso.

Métodos de Nokogiri

  • at
  • search

Mechanize utiliza Nokogiri para raspar los datos de las páginas. Usted puede aplicar lo que aprendió sobre Nokogiri en el primer artículo y utilizarlo en las páginas de Mechanize también. Eso significa que generalmente usa Mechanize para navegar páginas y métodos de Nokogiri para sus necesidades de scraping.

Por ejemplo, si desea buscar un solo objeto, puede utilizar at, mientras que la búsqueda search devuelve todos los objetos que coincidan con un selector en una página en particular. Para reformular esto, estos métodos funcionarán tanto en objetos de documento Nokogiri como en objetos de página Mechanize.

some_scraper.rb

Salida

Links

  • links
  • link_with
  • links_with

También podemos navegar por todo el sitio a nuestro gusto. Probablemente la parte más importante de Mechanize es su capacidad para permitirle jugar con enlaces. De lo contrario, podría bastante palo con Nokogiri por su cuenta. Echemos un vistazo a lo que nos devuelven si le pedimos una página para sus enlaces.

some_scraper.rb

Salida

Santo Moly, vamos a romper esto. Como no hemos dicho a Mechanize que busque en otra parte, tenemos una serie de enlaces desde esa primera página. Mechanize pasa por esa página en orden descendente y le devuelve esta lista de enlaces de arriba a abajo. He creado una pequeña imagen con punteros verdes a los varios acoplamientos que puedes ver en la salida.

Por cierto, esto ya está mostrando el resultado final del rediseño para mi podcast. Creo que esta versión es un poco mejor para fines de demostración. También se echa un vistazo a cómo se ve el resultado final y por qué necesitaba scrape mi antiguo sitio de Sinatra.

Captura de pantalla

Podcast Links

Como siempre, también podemos extraer sólo el texto de eso.

some_scraper.rb

Salida

Obtener todos estos enlaces a granel puede ser muy útil o simplemente tedioso. Por suerte para nosotros, tenemos algunas herramientas en su lugar para afinar lo que necesitamos.

some_scraper.rb

Salida

¡Auge! ¡Ahora estamos llegando a algún sitio! Podemos hacer zoom en enlaces específicos como ese. Podemos segmentar vínculos que coincidan con ciertos criterios -como su texto, por ejemplo- con una API más agradable como links_with o link_with. Además, si tenemos múltiples vínculos de Focus, podríamos acercar un número determinado de la página usando corchetes [].

some_scraper.rb

Si usted no está después del texto del enlace, pero el enlace en sí, sólo tiene que especificar un href particular para encontrar ese enlace. Mechanize no se interpondrá en su camino. En lugar de texto text, se alimentan los métodos con href

some_scraper.rb

Si sólo desea encontrar el primer enlace con el texto deseado, también puede hacer uso de esta sintaxis. Muy práctico y un poco más legible.

some_scraper.rb

¿Qué tal seguir a ese tipo y ver lo que se esconde detrás de este enlace de Focus? ¡Vamos a hacer clic click en él!

Click

some_scraper.rb

Esto nos daría otra larga lista de enlaces como antes. Vea lo fácil que era combinar .click.links. Mechanize hace clic en el enlace y sigue la página al nuevo destino. Puesto que también solicitamos una lista de enlaces, obtendremos todos los enlaces que Mechanize pueda encontrar en esa nueva página.

Digamos que tengo dos enlaces de texto del mismo entrevistado-uno que enlaza con etiquetas y uno con un episodio reciente- y quiero obtener los enlaces de cada una de estas páginas.

some_scraper.rb

Esto le daría una lista de enlaces para ambas páginas. Usted itera sobre cada acoplamiento para el entrevistado, y Mechanize sigue el acoplamiento chascado y recoge los acoplamientos que encuentra en la nueva página para usted. A continuación puede encontrar algunos ejemplos donde puede comparar combinaciones para empezar.

some_scraper.rb

Formularios

  • submit
  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

¡Echemos un vistazo a los formularios!

some_scraper.rb

Salida

Debido a que usamos el método de formularios forms, obtenemos una matriz devuelta, incluso cuando sólo tenemos un formulario devuelto a nosotros. Ahora que sabemos que la forma tiene el nombre "f", podemos usar la forma de versión singular form para afinar en que uno.

some_scraper.rb

Usando el form('f'), señalamos la forma particular con la que queremos trabajar. Como resultado, no obtendremos una matriz devuelta.

Salida

También podemos identificar el nombre del campo de entrada de texto (q).

Podemos apuntarla por ese nombre y establecer su valor como atributos Ruby. Todo lo que necesitamos hacer es proporcionarle un nuevo valor. Puede ver en el ejemplo de salida anterior que está vacía por defecto.

some_scraper.rb

Salida

Como se puede observar anteriormente, el valor del campo de texto ha cambiado a Nueva búsqueda de Google New Google Search Ahora solo necesitamos enviar el formulario submit y recopilar los resultados de la página que Google devuelve. No podría ser más fácil. ¡Busquemos algo más esta vez!

some_scraper.rb

Aquí identifiqué el encabezado de los resultados de búsqueda usando un selector de CSS h3.r, mapeado su texto text, y bastante impreso los resultados. ¿No fue tan difícil, verdad? Ese es un ejemplo fácil, claro, pero ¡piensa en las infinitas posibilidades que tienes a tu disposición con esto!

Salida

Mechanize tiene diferentes campos de entrada disponibles para jugar. ¡Incluso puede subir archivos!

  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

También puede identificar los botones de radio y las casillas de verificación por su nombre y comprobarlos con—lo has adivinado—check.

some_scraper.rb

Las etiquetas de opción ofrecen a los usuarios seleccionar un elemento de una lista desplegable. Nuevamente, los seleccionamos por nombre y seleccionamos el número de opción que deseamos.

some_scraper.rb

Las subidas de archivos funcionan de forma similar a la introducción de texto en los formularios al establecerlo como atributos de Ruby. Identifica el campo de carga y luego especifica la ruta del archivo (nombre del archivo) que deseas transferir. Suena más complicado de lo que es. ¡Echemos un vistazo!

some_scraper.rb

Pensamientos finales

Ves, ¡no hay magia después de todo! Ahora está bien equipado para divertirse por su cuenta. Sin duda hay un poco más para aprender acerca de Nokogiri y Mechanize, pero en lugar de pasar demasiado tiempo en aspectos innecesarios, jugar con él y buscar en más documentación cuando se encuentra con problemas más allá del alcance de un artículo para principiantes.

Espero que usted pueda ver cómo maravillosamente simple esta gema es y cuánto energía ofrece. Como todos sabemos de la cultura popular por ahora, esto también tiene responsabilidades. Úselo dentro de los marcos legales y cuando no tenga acceso a una API. Usted probablemente no tendrá un uso frecuente para estas herramientas, pero el muchacho no vienen en práctico cuando usted tiene algunas necesidades que raspan verdaderas delante de usted.

Como se prometió, en el próximo artículo cubriremos un ejemplo del mundo real donde rasparé datos de mi sitio de podcast. Lo extraeré de un antiguo sitio de Sinatra y lo transferiré a mi nuevo sitio de Middleman que usa archivos .markdown para cada episodio. Extraeremos las fechas, los números de los episodios, los nombres de los entrevistados, los encabezados, los subtítulos, etc. ¡Te veo allí!

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.