Wgit ist ein in Ruby geschriebener HTML-Webcrawler, mit dem Sie die gewünschten Daten programmgesteuert aus dem Web extrahieren können.
Wgit wurde in erster Linie dafür entwickelt, statische HTML-Websites zu crawlen, um deren Inhalte zu indizieren und zu durchsuchen – und bildet damit die Grundlage für jede Suchmaschine. aber Wgit eignet sich für viele Anwendungsbereiche, darunter:
Wgit bietet eine hochwertige, benutzerfreundliche API und DSL, die Sie in Ihren eigenen Anwendungen und Skripten verwenden können.
Schauen Sie sich diese Demo-Suchmaschine an – erstellt mit Wgit, Sinatra und MongoDB – bereitgestellt für fly.io. Versuchen Sie, nach etwas zu suchen, das mit Ruby zu tun hat, z. B. „Matz“ oder „Rails“.
Lassen Sie uns eine Zitate-Website crawlen und ihre Zitate und Autoren mithilfe von Wgit DSL extrahieren:
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 )
Welche Ausgaben:
[
{
"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"
},
...
]
Großartig! Was aber, wenn wir den Inhalt crawlen und in einer Datenbank speichern möchten, damit er durchsucht werden kann? Wgit erleichtert das Indizieren und Durchsuchen von HTML mit MongoDB (standardmäßig):
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'
Der search
(in der letzten Zeile) gibt die Ergebnisse zurück und gibt sie aus:
Quotes to Scrape
“I am free of all prejudice. I hate everyone equally. ”
http://quotes.toscrape.com/tag/humor/page/2/
...
Mithilfe eines Datenbank-Clients können wir sehen, dass die beiden Webseiten zusammen mit ihren extrahierten Zitaten und Autoren indiziert wurden:
Mit DSL ist es einfach, Skripte zum Experimentieren zu schreiben. Wgits DSL ist einfach ein Wrapper um die zugrunde liegenden Klassen. Zum Vergleich hier das Zitatbeispiel, das mit der Wgit-API anstelle der DSL neu geschrieben wurde:
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 )
Es gibt viele andere HTML-Crawler, warum also Wgit verwenden?
xpath
angeben, der erforderlich ist, um den nächsten zu crawlenden URLs zu folgen . Wgit crawlt standardmäßig die gesamte Website, indem es die internen Links extrahiert, die auf denselben Host verweisen – kein xpath
erforderlich. 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
-Regeln einer Site. Es gibt auch einen praktischen robots.txt
Parser, den Sie in Ihrem eigenen Code verwenden können. Warum sollten Sie also nicht Wgit verwenden, höre ich Sie fragen?
libcurl
für HTTP usw.), aber nicht multithreaded; Daher wird jede URL nacheinander gecrawlt. Sie könnten jedes gecrawlte Dokument zur Verarbeitung an einen Arbeitsthread übergeben. Wenn Sie jedoch gleichzeitiges Crawlen benötigen, sollten Sie etwas anderes in Betracht ziehen. Nur MRI Ruby wird getestet und unterstützt, Wgit funktioniert jedoch möglicherweise mit anderen Ruby-Implementierungen.
Derzeit ist der unterstützte Bereich der MRI Ruby-Versionen:
ruby '~> 3.0'
auch bekannt als zwischen Ruby 3.0 und bis zu Ruby 4.0, jedoch nicht einschließlich. Wgit wird wahrscheinlich gut mit älteren Versionen funktionieren, aber wenn möglich, ist es am besten, ein Upgrade durchzuführen.
$ bundle add wgit
$ gem install wgit
$ wgit
Durch Aufrufen der installierten ausführbaren Datei wird eine REPL-Sitzung gestartet.
Durch die Installation des Wgit-Gems wird Ihrem $PATH
eine ausführbare wgit
Datei hinzugefügt. Die ausführbare Datei startet eine interaktive REPL-Sitzung mit bereits geladenem Wgit-Gem. Dadurch ist die Indizierung und Suche über die Befehlszeile ganz einfach, ohne dass Skripts erforderlich sind.
Die ausführbare wgit
-Datei führt die folgenden Dinge aus (in der angegebenen Reihenfolge):
require wgit
.env
Datei (falls eine im lokalen Verzeichnis oder im Home-Verzeichnis vorhanden ist, je nachdem, was zuerst gefunden wird).eval
ist eine .wgit.rb
Datei (falls eine im lokalen Verzeichnis oder im Home-Verzeichnis vorhanden ist, je nachdem, was zuerst gefunden wird)pry
, wenn es installiert ist, oder irb
, wenn nicht) Die Datei .wgit.rb
kann zum Seeding von Gerätedaten oder zum Definieren von Hilfsfunktionen für die Sitzung verwendet werden. Sie könnten beispielsweise eine Funktion definieren, die Ihre Website für eine schnelle und einfache Suche bei jedem Start wgit
indiziert.
Das Juwel ist als Open Source unter den Bedingungen der MIT-Lizenz verfügbar. Weitere Informationen finden Sie in LICENSE.txt.
Fehlerberichte und Funktionsanfragen sind auf GitHub willkommen. Sprechen Sie einfach ein Problem an und prüfen Sie, ob es nicht bereits existiert.
Die aktuelle Straßenkarte ist rudimentär auf der Wiki-Seite „Straßenkarte“ aufgeführt. Vielleicht ist Ihr Feature-Wunsch schon dabei?
Bevor Sie erwägen, einen Beitrag zu leisten, schauen Sie sich CONTRIBUTING.md an.
Führen Sie nach dem Auschecken des Repos die folgenden Befehle aus:
gem install bundler toys
bundle install --jobs=3
toys setup
Und schon kann es losgehen!
Wgit verwendet den Spielzeug-Gem (anstelle von Rake) für den Aufgabenaufruf. Führen Sie toys
immer als bundle exec toys
aus. Für eine vollständige Liste der verfügbaren Aufgaben, auch Tools genannt, führen Sie bundle exec toys --tools
aus. Sie können mit bundle exec toys -s tool_name
nach einem Tool suchen. Die am häufigsten verwendeten Tools sind unten aufgeführt...
Führen Sie bundle exec toys db
aus, um eine Liste der datenbankbezogenen Tools anzuzeigen, mit denen Sie eine Mongo DB-Instanz lokal mit Docker ausführen können. Führen Sie bundle exec toys test
aus, um die Tests auszuführen.
Um die Codedokumentation lokal zu generieren, führen Sie bundle exec toys yardoc
aus. Um die Dokumente in einem Browser zu durchsuchen, führen Sie bundle exec toys yardoc --serve
aus. Sie können auch das yri
Befehlszeilentool verwenden, z. B. yri Wgit::Crawler#crawl_site
usw.
Um dieses Juwel auf Ihrem lokalen Computer zu installieren, führen Sie bundle exec toys install
aus und folgen Sie der Eingabeaufforderung.
Sie können bundle exec toys console
für eine interaktive Shell mit der ausführbaren Datei ./bin/wgit
ausführen. Die bundle exec toys setup
hat eine .env
und eine .wgit.rb
Datei erstellt, die von der ausführbaren Datei geladen werden. Sie können den Inhalt dieses Kerninhalts verwenden, um die ausführbare Datei in eine Entwicklungskonsole umzuwandeln. Es definiert einige nützliche Funktionen, Vorrichtungen und stellt eine Verbindung zur Datenbank usw. her. Vergessen Sie nicht, den WGIT_CONNECTION_STRING
in der .env
Datei festzulegen.