Wgit é um web crawler HTML, escrito em Ruby, que permite extrair programaticamente os dados desejados da web.
O Wgit foi projetado principalmente para rastrear sites HTML estáticos para indexar e pesquisar seu conteúdo - fornecendo a base de qualquer mecanismo de pesquisa; mas o Wgit é adequado para muitos domínios de aplicação, incluindo:
Wgit fornece uma API e DSL de alto nível e fáceis de usar que você pode usar em seus próprios aplicativos e scripts.
Confira este mecanismo de pesquisa de demonstração - construído usando Wgit, Sinatra e MongoDB - implantado no fly.io. Tente procurar por algo relacionado ao Ruby, como "Matz" ou "Rails".
Vamos rastrear um site de citações extraindo suas citações e autores usando o 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 )
Quais saídas:
[
{
"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"
},
...
]
Ótimo! Mas e se quisermos rastrear e armazenar o conteúdo em um banco de dados, para que possa ser pesquisado? O Wgit facilita a indexação e pesquisa de HTML usando MongoDB (por padrão):
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'
A chamada search
(na última linha) retornará e produzirá os resultados:
Quotes to Scrape
“I am free of all prejudice. I hate everyone equally. ”
http://quotes.toscrape.com/tag/humor/page/2/
...
Usando um cliente de banco de dados, podemos ver que as duas páginas da web foram indexadas, juntamente com suas citações e autores extraídos:
A DSL facilita a escrita de scripts para experimentação. A DSL do Wgit é simplesmente um wrapper em torno das classes subjacentes. Para efeito de comparação, aqui está o exemplo de citação reescrito usando a API Wgit em vez do 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 )
Existem muitos outros rastreadores HTML por aí, então por que usar o Wgit?
xpath
necessário para seguir os próximos URLs a serem rastreados. Por padrão, o Wgit rastreia todo o site extraindo seus links internos apontando para o mesmo host - sem necessidade de 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 um site. Há também um analisador robots.txt
útil que você pode usar em seu próprio código. Então, por que você não usaria o Wgit, ouvi você perguntar?
libcurl
para HTTP etc.), não é multithread; então cada URL é rastreado sequencialmente. Você pode entregar cada documento rastreado a um thread de trabalho para processamento - mas se precisar de rastreamento simultâneo, considere outra coisa. Apenas MRI Ruby é testado e suportado, mas o Wgit pode funcionar com outras implementações Ruby.
Atualmente, a gama suportada de versões MRI Ruby é:
ruby '~> 3.0'
também conhecido como entre Ruby 3.0 e até, mas não incluindo Ruby 4.0. O Wgit provavelmente funcionará bem com versões mais antigas, mas é melhor atualizar, se possível.
$ bundle add wgit
$ gem install wgit
$ wgit
Chamar o executável instalado iniciará uma sessão REPL.
A instalação da gem Wgit adiciona um executável wgit
ao seu $PATH
. O executável inicia uma sessão REPL interativa com a gem Wgit já carregada; tornando muito fácil indexar e pesquisar na linha de comando sem a necessidade de scripts.
O executável wgit
faz o seguinte (em ordem):
require wgit
.env
(se existir no diretório local ou inicial, o que for encontrado primeiro)eval
'um arquivo .wgit.rb
(se existir no diretório local ou inicial, o que for encontrado primeiro)pry
se estiver instalado ou irb
se não estiver) O arquivo .wgit.rb
pode ser usado para propagar dados de fixture ou definir funções auxiliares para a sessão. Por exemplo, você pode definir uma função que indexe seu site para uma pesquisa rápida e fácil sempre que iniciar wgit
.
A gema está disponível como código aberto sob os termos da licença MIT. Consulte LICENSE.txt para obter mais detalhes.
Relatórios de bugs e solicitações de recursos são bem-vindos no GitHub. Basta levantar um problema, verificando se ele ainda não existe.
O roteiro atual está rudimentarmente listado na página wiki do Roteiro. Talvez sua solicitação de recurso já esteja lá?
Antes de pensar em fazer uma contribuição, confira CONTRIBUTING.md.
Depois de verificar o repositório, execute os seguintes comandos:
gem install bundler toys
bundle install --jobs=3
toys setup
E você está pronto para ir!
O Wgit usa a gema Toys (em vez de Rake) para invocação de tarefas. Sempre execute toys
como bundle exec toys
. Para obter uma lista completa de tarefas disponíveis, também conhecidas como ferramentas, execute bundle exec toys --tools
. Você pode procurar uma ferramenta usando bundle exec toys -s tool_name
. As ferramentas mais comumente usadas estão listadas abaixo...
Execute bundle exec toys db
para ver uma lista de ferramentas relacionadas ao banco de dados, permitindo que você execute uma instância do Mongo DB localmente usando o Docker. Execute bundle exec toys test
para executar os testes.
Para gerar a documentação do código localmente, execute bundle exec toys yardoc
. Para navegar pelos documentos em um navegador, execute bundle exec toys yardoc --serve
. Você também pode usar a ferramenta de linha de comando yri
, por exemplo yri Wgit::Crawler#crawl_site
etc.
Para instalar esta jóia em sua máquina local, execute bundle exec toys install
e siga o prompt.
Você pode executar bundle exec toys console
para um shell interativo usando o executável ./bin/wgit
. A tarefa bundle exec toys setup
terá criado um arquivo .env
e .wgit.rb
que é carregado pelo executável. Você pode usar o conteúdo desta essência para transformar o executável em um console de desenvolvimento. Ele define algumas funções úteis, acessórios e se conecta ao banco de dados, etc. Não se esqueça de definir WGIT_CONNECTION_STRING
no arquivo .env
.