Wgit — это веб-сканер HTML, написанный на Ruby, который позволяет программно извлекать нужные данные из Интернета.
Wgit был в первую очередь разработан для сканирования статических HTML-сайтов с целью индексации и поиска их контента, что составляет основу любой поисковой системы; но Wgit подходит для многих областей приложений, включая:
Wgit предоставляет высокоуровневый, простой в использовании API и DSL, которые вы можете использовать в своих собственных приложениях и сценариях.
Ознакомьтесь с этой демонстрационной поисковой системой, созданной с использованием Wgit, Sinatra и MongoDB и развернутой на fly.io. Попробуйте поискать что-нибудь связанное с Ruby, например «Matz» или «Rails».
Давайте просканируем веб-сайт котировок, выделив цитаты и авторов с помощью 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 )
Какие выходы:
[
{
"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"
},
...
]
Большой! Но что, если мы хотим просканировать и сохранить контент в базе данных, чтобы по нему можно было осуществлять поиск? Wgit упрощает индексацию и поиск в HTML с помощью MongoDB (по умолчанию):
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'
search
вызов (в последней строке) вернет результат и выведет результаты:
Quotes to Scrape
“I am free of all prejudice. I hate everyone equally. ”
http://quotes.toscrape.com/tag/humor/page/2/
...
Используя клиент базы данных, мы видим, что две веб-страницы были проиндексированы вместе с извлеченными из них цитатами и авторами :
DSL позволяет легко писать сценарии для экспериментов. DSL Wgit — это просто оболочка базовых классов. Для сравнения, вот пример цитаты, переписанный с использованием Wgit API вместо 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 )
Существует множество других сканеров HTML, так зачем использовать Wgit?
xpath
, необходимый для перехода к следующим URL-адресам для сканирования. По умолчанию Wgit сканирует весь сайт, извлекая его внутренние ссылки, указывающие на один и тот же хост — 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
сайта. Также имеется удобный анализатор robots.txt
, который вы можете использовать в своем коде. Так почему бы вам не использовать Wgit, я слышал, вы спрашиваете?
libcurl
для HTTP и т. д.), не является многопоточным; поэтому каждый URL-адрес сканируется последовательно. Вы можете передать каждый просканированный документ рабочему потоку для обработки, но если вам нужно одновременное сканирование, вам следует подумать о чем-то другом. Тестируется и поддерживается только MRI Ruby, но Wgit может работать и с другими реализациями Ruby.
В настоящее время поддерживаемый диапазон версий MRI Ruby:
ruby '~> 3.0'
, то есть между Ruby 3.0 и выше, но не включая Ruby 4.0. Wgit, вероятно, будет нормально работать со старыми версиями, но лучше всего обновить их, если это возможно.
$ bundle add wgit
$ gem install wgit
$ wgit
Вызов установленного исполняемого файла запустит сеанс REPL.
Установка драгоценного камня Wgit добавляет исполняемый файл wgit
в ваш $PATH
. Исполняемый файл запускает интерактивный сеанс REPL с уже загруженным гелем Wgit; что упрощает индексирование и поиск из командной строки без необходимости использования сценариев.
Исполняемый файл wgit
выполняет следующие действия (по порядку):
require wgit
.env
(если он существует в локальном или домашнем каталоге, в зависимости от того, какой из них найден первым)eval
'sa файл .wgit.rb
(если он существует в локальном или домашнем каталоге, в зависимости от того, какой из них найден первым)pry
, если она установлена, или irb
, если нет) Файл .wgit.rb
можно использовать для заполнения данных о приборах или определения вспомогательных функций для сеанса. Например, вы можете определить функцию, которая будет индексировать ваш веб-сайт для быстрого и удобного поиска каждый раз, когда вы запускаете wgit
.
Гем доступен с открытым исходным кодом в соответствии с условиями лицензии MIT. Дополнительную информацию см. в файле LICENSE.txt.
Отчеты об ошибках и пожелания по функциям приветствуются на GitHub. Просто поднимите проблему, проверив, что ее еще не существует.
Текущая дорожная карта в общих чертах указана на вики-странице «Дорожная карта». Может быть, ваш запрос на функцию уже есть?
Прежде чем вы решите внести свой вклад, посетите CONTRIBUTING.md.
После проверки репозитория выполните следующие команды:
gem install bundler toys
bundle install --jobs=3
toys setup
И вы готовы идти!
Wgit использует гем Toys (вместо Rake) для вызова задач. Всегда запускайте toys
как bundle exec toys
. Чтобы получить полный список доступных задач, то есть инструментов, запустите bundle exec toys --tools
. Вы можете найти инструмент, используя bundle exec toys -s tool_name
. Ниже перечислены наиболее часто используемые инструменты...
Запустите bundle exec toys db
, чтобы просмотреть список инструментов, связанных с базой данных, которые позволят вам запустить экземпляр Mongo DB локально с помощью Docker. Запустите bundle exec toys test
чтобы выполнить тесты.
Чтобы локально сгенерировать документацию по коду, запустите bundle exec toys yardoc
. Чтобы просмотреть документы в браузере, запустите bundle exec toys yardoc --serve
. Вы также можете использовать инструмент командной строки yri
, например yri Wgit::Crawler#crawl_site
и т. д.
Чтобы установить этот драгоценный камень на свой локальный компьютер, запустите bundle exec toys install
и следуйте инструкциям.
Вы можете запустить bundle exec toys console
для интерактивной оболочки, используя исполняемый файл ./bin/wgit
. Задача bundle exec toys setup
создаст файлы .env
и .wgit.rb
, которые загружаются исполняемым файлом. Вы можете использовать содержимое этой статьи, чтобы превратить исполняемый файл в консоль разработки. Он определяет некоторые полезные функции, настройки, подключается к базе данных и т. д. Не забудьте установить WGIT_CONNECTION_STRING
в файле .env
.