Wgit es un rastreador web HTML, escrito en Ruby, que le permite extraer mediante programación los datos que desea de la web.
Wgit fue diseñado principalmente para rastrear sitios web HTML estáticos para indexar y buscar su contenido, proporcionando la base de cualquier motor de búsqueda; pero Wgit es adecuado para muchos dominios de aplicaciones, incluidos:
Wgit proporciona una API y DSL de alto nivel y fácil de usar que puede utilizar en sus propias aplicaciones y scripts.
Consulte este motor de búsqueda de demostración, creado con Wgit, Sinatra y MongoDB, implementado en fly.io. Intente buscar algo relacionado con Ruby, como "Matz" o "Rails".
Rastreemos un sitio web de citas extrayendo sus citas y autores utilizando Wgit DSL:
require 'wgit'
require 'json'
include Wgit :: DSL
start 'http://quotes.toscrape.com/tag/humor/'
follow "//li[@class='next']/a/@href"
extract :quotes , "//div[@class='quote']/span[@class='text']" , singleton : false
extract :authors , "//div[@class='quote']/span/small" , singleton : false
quotes = [ ]
crawl_site do | doc |
doc . quotes . zip ( doc . authors ) . each do | arr |
quotes << {
quote : arr . first ,
author : arr . last
}
end
end
puts JSON . generate ( quotes )
Qué salidas:
[
{
"quote": "“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”",
"author": "Jane Austen"
},
{
"quote": "“A day without sunshine is like, you know, night.”",
"author": "Steve Martin"
},
...
]
¡Excelente! Pero, ¿qué pasa si queremos rastrear y almacenar el contenido en una base de datos para poder buscarlo? Wgit facilita la indexación y búsqueda de HTML usando MongoDB (de forma predeterminada):
require 'wgit'
include Wgit :: DSL
Wgit . logger . level = Logger :: WARN
ENV [ 'WGIT_CONNECTION_STRING' ] = 'mongodb://user:password@localhost/crawler'
start 'http://quotes.toscrape.com/tag/humor/'
follow "//li[@class='next']/a/@href"
extract :quotes , "//div[@class='quote']/span[@class='text']" , singleton : false
extract :authors , "//div[@class='quote']/span/small" , singleton : false
index_site
search 'prejudice'
La llamada search
(en la última línea) devolverá y generará los resultados:
Quotes to Scrape
“I am free of all prejudice. I hate everyone equally. ”
http://quotes.toscrape.com/tag/humor/page/2/
...
Utilizando un cliente de base de datos, podemos ver que las dos páginas web han sido indexadas, junto con sus citas y autores extraídos:
El DSL facilita la escritura de guiones para experimentar. DSL de Wgit es simplemente un contenedor de las clases subyacentes. A modo de comparación, aquí está el ejemplo de cita reescrito utilizando la API de Wgit en lugar de DSL:
require 'wgit'
require 'json'
crawler = Wgit :: Crawler . new
url = Wgit :: Url . new ( 'http://quotes.toscrape.com/tag/humor/' )
quotes = [ ]
Wgit :: Document . define_extractor ( :quotes , "//div[@class='quote']/span[@class='text']" , singleton : false )
Wgit :: Document . define_extractor ( :authors , "//div[@class='quote']/span/small" , singleton : false )
crawler . crawl_site ( url , follow : "//li[@class='next']/a/@href" ) do | doc |
doc . quotes . zip ( doc . authors ) . each do | arr |
quotes << {
quote : arr . first ,
author : arr . last
}
end
end
puts JSON . generate ( quotes )
Existen muchos otros rastreadores de HTML, entonces, ¿por qué utilizar Wgit?
xpath
necesaria para seguir las siguientes URL a rastrear. Wgit, de forma predeterminada, rastrea todo el sitio extrayendo sus enlaces internos que apuntan al mismo host; no se necesita xpath
. require 'wgit'
ENV [ 'WGIT_CONNECTION_STRING' ] = 'mongodb://user:password@localhost/crawler'
wiki = Wgit :: Url . new ( 'https://github.com/michaeltelford/wgit/wiki' )
# Only index the most recent of each wiki article, ignoring the rest of Github.
opts = {
allow_paths : 'michaeltelford/wgit/wiki/*' ,
disallow_paths : 'michaeltelford/wgit/wiki/*/_history'
}
indexer = Wgit :: Indexer . new
indexer . index_site ( wiki , ** opts )
robots.txt
de un sitio. También hay un práctico analizador robots.txt
que puedes usar en tu propio código. Entonces, ¿por qué no utilizarías Wgit? Te oigo preguntar.
libcurl
para HTTP, etc.), no es multiproceso; por lo que cada URL se rastrea secuencialmente. Puede entregar cada documento rastreado a un hilo de trabajo para su procesamiento, pero si necesita un rastreo simultáneo, entonces debería considerar otra cosa. Solo se prueba y admite MRI Ruby, pero Wgit puede funcionar con otras implementaciones de Ruby.
Actualmente, la gama admitida de versiones de MRI Ruby es:
ruby '~> 3.0'
también conocido como entre Ruby 3.0 y hasta Ruby 4.0, pero sin incluirlo. Wgit probablemente funcionará bien con versiones anteriores, pero es mejor actualizarlas si es posible.
$ bundle add wgit
$ gem install wgit
$ wgit
Al llamar al ejecutable instalado se iniciará una sesión REPL.
La instalación de la gema Wgit agrega un ejecutable wgit
a su $PATH
. El ejecutable inicia una sesión REPL interactiva con la gema Wgit ya cargada; lo que hace que sea muy fácil indexar y buscar desde la línea de comandos sin necesidad de scripts.
El ejecutable wgit
hace lo siguiente (en orden):
require wgit
.env
(si existe uno en el directorio local o de inicio, lo que se encuentre primero)eval
'un archivo .wgit.rb
(si existe uno en el directorio local o de inicio, lo que se encuentre primero)pry
si está instalado, o irb
si no) El archivo .wgit.rb
se puede utilizar para generar datos de dispositivos o definir funciones auxiliares para la sesión. Por ejemplo, podría definir una función que indexe su sitio web para realizar búsquedas rápidas y sencillas cada vez que inicie wgit
.
La gema está disponible como código abierto según los términos de la licencia MIT. Consulte LICENCIA.txt para obtener más detalles.
Los informes de errores y las solicitudes de funciones son bienvenidos en GitHub. Simplemente plantee un problema y verifique que no exista ya.
La hoja de ruta actual aparece rudimentariamente en la página wiki de la hoja de ruta. ¿Quizás su solicitud de función ya esté allí?
Antes de considerar hacer una contribución, consulte CONTRIBUTING.md.
Después de revisar el repositorio, ejecute los siguientes comandos:
gem install bundler toys
bundle install --jobs=3
toys setup
¡Y listo!
Wgit usa la gema de juguetes (en lugar de Rake) para invocar tareas. Ejecute siempre toys
como bundle exec toys
. Para obtener una lista completa de las tareas disponibles, también conocidas como herramientas, ejecute bundle exec toys --tools
. Puede buscar una herramienta utilizando bundle exec toys -s tool_name
. Las herramientas más utilizadas se enumeran a continuación...
Ejecute bundle exec toys db
para ver una lista de herramientas relacionadas con la base de datos, lo que le permitirá ejecutar una instancia de Mongo DB localmente usando Docker. Ejecute bundle exec toys test
para ejecutar las pruebas.
Para generar documentación de código localmente, ejecute bundle exec toys yardoc
. Para explorar los documentos en un navegador, ejecute bundle exec toys yardoc --serve
. También puede utilizar la herramienta de línea de comandos yri
, por ejemplo, yri Wgit::Crawler#crawl_site
etc.
Para instalar esta joya en su máquina local, ejecute bundle exec toys install
y siga las instrucciones.
Puede ejecutar bundle exec toys console
para un shell interactivo utilizando el ejecutable ./bin/wgit
. La tarea bundle exec toys setup
habrá creado un archivo .env
y .wgit.rb
que el ejecutable carga. Puede utilizar el contenido de esta esencia para convertir el ejecutable en una consola de desarrollo. Define algunas funciones útiles, accesorios y se conecta a la base de datos, etc. No olvide configurar WGIT_CONNECTION_STRING
en el archivo .env
.