Wgit est un robot d'exploration Web HTML, écrit en Ruby, qui vous permet d'extraire par programme les données souhaitées du Web.
Wgit a été principalement conçu pour explorer des sites Web HTML statiques afin d'indexer et de rechercher leur contenu - fournissant ainsi la base de tout moteur de recherche ; mais Wgit convient à de nombreux domaines d'application, notamment :
Wgit fournit une API et un DSL de haut niveau et faciles à utiliser que vous pouvez utiliser dans vos propres applications et scripts.
Découvrez ce moteur de recherche de démonstration - construit à l'aide de Wgit, Sinatra et MongoDB - déployé sur fly.io. Essayez de rechercher quelque chose qui est lié à Ruby comme "Matz" ou "Rails".
Explorons un site Web de citations en extrayant ses citations et ses auteurs à l'aide du 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 )
Quelles sorties :
[
{
"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"
},
...
]
Super! Mais que se passe-t-il si nous voulons explorer et stocker le contenu dans une base de données, afin de pouvoir y faire des recherches ? Wgit facilite l'indexation et la recherche HTML à l'aide de MongoDB (par défaut) :
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'
L'appel search
(sur la dernière ligne) renverra et affichera les résultats :
Quotes to Scrape
“I am free of all prejudice. I hate everyone equally. ”
http://quotes.toscrape.com/tag/humor/page/2/
...
En utilisant un client de base de données, nous pouvons voir que les deux pages web ont été indexées, ainsi que leurs citations et auteurs extraits :
Le DSL facilite l'écriture de scripts à expérimenter. Le DSL de Wgit est simplement un wrapper autour des classes sous-jacentes. A titre de comparaison, voici l'exemple de citation réécrit en utilisant l'API Wgit au lieu du 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 )
Il existe de nombreux autres robots d'exploration HTML, alors pourquoi utiliser Wgit ?
xpath
nécessaire pour suivre les prochaines URL à explorer. Wgit par défaut explore l'intégralité du site en extrayant ses liens internes pointant vers le même hôte - aucun xpath
n'est nécessaire. 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
d'un site. Il existe également un analyseur robots.txt
pratique que vous pouvez utiliser dans votre propre code. Alors pourquoi ne pas utiliser Wgit, je vous entends demander ?
libcurl
pour HTTP, etc.), n'est pas multithread ; Ainsi, chaque URL est explorée séquentiellement. Vous pouvez confier chaque document analysé à un thread de travail pour traitement - mais si vous avez besoin d'une analyse simultanée, vous devriez envisager autre chose. Seul MRI Ruby est testé et pris en charge, mais Wgit peut fonctionner avec d'autres implémentations de Ruby.
Actuellement, la gamme de versions MRI Ruby prise en charge est :
ruby '~> 3.0'
c'est-à-dire entre Ruby 3.0 et versions ultérieures, mais sans compter Ruby 4.0. Wgit fonctionnera probablement correctement avec les anciennes versions, mais il est préférable de le mettre à niveau si possible.
$ bundle add wgit
$ gem install wgit
$ wgit
L'appel de l'exécutable installé démarrera une session REPL.
L'installation de la gemme Wgit ajoute un exécutable wgit
à votre $PATH
. L'exécutable lance une session REPL interactive avec la gem Wgit déjà chargée ; ce qui rend très facile l'indexation et la recherche à partir de la ligne de commande sans avoir besoin de scripts.
L'exécutable wgit
fait les choses suivantes (dans l'ordre) :
require wgit
.env
(s'il en existe un dans le répertoire local ou personnel, selon celui trouvé en premier)eval
est un fichier .wgit.rb
(s'il en existe un dans le répertoire local ou personnel, selon celui qui est trouvé en premier)pry
s'il est installé, ou irb
sinon) Le fichier .wgit.rb
peut être utilisé pour amorcer des données de luminaire ou définir des fonctions d'assistance pour la session. Par exemple, vous pouvez définir une fonction qui indexe votre site Web pour une recherche rapide et facile à chaque fois que vous démarrez wgit
.
La gemme est disponible en open source selon les termes de la licence MIT. Voir LICENSE.txt pour plus de détails.
Les rapports de bugs et les demandes de fonctionnalités sont les bienvenus sur GitHub. Soulevez simplement un problème, en vérifiant qu'il n'existe pas déjà.
La feuille de route actuelle est répertoriée de manière rudimentaire dans la page wiki Feuille de route. Peut-être que votre demande de fonctionnalité est déjà là ?
Avant d'envisager de contribuer, consultez CONTRIBUTING.md.
Après avoir extrait le dépôt, exécutez les commandes suivantes :
gem install bundler toys
bundle install --jobs=3
toys setup
Et vous êtes prêt à partir !
Wgit utilise la gemme jouets (au lieu de Rake) pour l'invocation de tâches. Exécutez toujours toys
en tant que bundle exec toys
. Pour une liste complète des tâches disponibles, également appelées outils, exécutez bundle exec toys --tools
. Vous pouvez rechercher un outil en utilisant bundle exec toys -s tool_name
. Les outils les plus couramment utilisés sont répertoriés ci-dessous...
Exécutez bundle exec toys db
pour voir une liste d'outils liés à la base de données, vous permettant d'exécuter une instance Mongo DB localement à l'aide de Docker. Exécutez bundle exec toys test
pour exécuter les tests.
Pour générer la documentation du code localement, exécutez bundle exec toys yardoc
. Pour parcourir les documents dans un navigateur, exécutez bundle exec toys yardoc --serve
. Vous pouvez également utiliser l'outil de ligne de commande yri
, par exemple yri Wgit::Crawler#crawl_site
etc.
Pour installer ce joyau sur votre ordinateur local, exécutez bundle exec toys install
et suivez l'invite.
Vous pouvez exécuter bundle exec toys console
pour un shell interactif à l'aide de l'exécutable ./bin/wgit
. La tâche bundle exec toys setup
aura créé un fichier .env
et .wgit.rb
qui sera chargé par l'exécutable. Vous pouvez utiliser le contenu de cet article pour transformer l'exécutable en console de développement. Il définit quelques fonctions utiles, accessoires et se connecte à la base de données, etc. N'oubliez pas de définir le WGIT_CONNECTION_STRING
dans le fichier .env
.