Wgit は Ruby で書かれた HTML Web クローラーで、Web から必要なデータをプログラムによって抽出できます。
Wgit は主に、静的な HTML Web サイトをクロールしてコンテンツのインデックスを作成し、検索するように設計されており、あらゆる検索エンジンの基礎を提供します。ただし、Wgit は次のような多くのアプリケーション ドメインに適しています。
Wgit は、独自のアプリケーションやスクリプトで使用できる、高レベルで使いやすい API と DSL を提供します。
Wgit、Sinatra、MongoDB を使用して構築され、fly.io にデプロイされたこのデモ検索エンジンをご覧ください。 「Matz」や「Rails」など、Ruby 関連のものを検索してみてください。
Wgit DSL を使用して引用 Web サイトをクロールして、引用と著者を抽出してみましょう。
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 を使用すると、MongoDB (デフォルト) を使用して HTML のインデックス作成と検索を簡単に行うことができます。
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/
...
データベース クライアントを使用すると、2 つの Web ページが、抽出された引用文と作成者とともにインデックス付けされていることがわかります。
DSL を使用すると、実験用のスクリプトを簡単に作成できます。 Wgit の DSL は、基礎となるクラスの単なるラッパーです。比較のために、DSL の代わりにWgit API を使用して書き直された引用例を次に示します。
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
提供する必要があります。 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
使用するなど) 高速ではありますが、マルチスレッドではありません。したがって、各 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 gem をインストールすると、 wgit
実行可能ファイルが$PATH
に追加されます。実行可能ファイルは、すでにロードされている Wgit gem を使用して対話型 REPL セッションを起動します。これにより、スクリプトを必要とせずに、コマンド ラインからインデックス付けと検索を非常に簡単に行うことができます。
wgit
実行可能ファイルは、次のことを (順番に) 実行します。
require wgit
.env
ファイルをロードします (ローカル ディレクトリまたはホーム ディレクトリのどちらか先に見つかった方にファイルが存在する場合)eval
'sa .wgit.rb
ファイル (ローカル ディレクトリまたはホーム ディレクトリのどちらか先に見つかった方に存在する場合)pry
使用し、インストールされていない場合はirb
使用します) .wgit.rb
ファイルは、フィクスチャ データをシードしたり、セッションのヘルパー関数を定義したりするために使用できます。たとえば、 wgit
起動するたびにすばやく簡単に検索できるように、Web サイトのインデックスを作成する関数を定義できます。
この gem は、MIT ライセンスの条件に基づいてオープン ソースとして利用できます。詳細については、LICENSE.txt を参照してください。
バグレポートや機能リクエストは GitHub で歓迎されます。問題を提起し、それがまだ存在しないことを確認してください。
現在のロードマップは、ロードマップ wiki ページに基本的にリストされています。機能リクエストがすでに存在している可能性がありますか?
貢献を検討する前に、CONTRIBUTING.md を確認してください。
リポジトリをチェックアウトした後、次のコマンドを実行します。
gem install bundler toys
bundle install --jobs=3
toys setup
準備完了です!
Wgit は、タスクの呼び出しに (Rake の代わりに) Toys gem を使用します。常にtoys
bundle exec toys
として実行します。使用可能なタスク (別名ツール) の完全なリストを表示するには、 bundle exec toys --tools
を実行します。 bundle exec toys -s tool_name
を使用してツールを検索できます。最も一般的に使用されるツールを以下に示します。
bundle exec toys db
実行すると、データベース関連ツールのリストが表示され、Docker を使用してローカルで Mongo DB インスタンスを実行できるようになります。テストを実行するには、 bundle exec toys test
を実行します。
コード ドキュメントをローカルで生成するには、 bundle exec toys yardoc
を実行します。ブラウザでドキュメントを参照するには、 bundle exec toys yardoc --serve
を実行します。 yri
コマンドライン ツール (例: yri Wgit::Crawler#crawl_site
など) を使用することもできます。
この gem をローカル マシンにインストールするには、 bundle exec toys install
実行し、プロンプトに従います。
./bin/wgit
実行可能ファイルを使用して、対話型シェルのbundle exec toys console
実行できます。 bundle exec toys setup
タスクでは、実行可能ファイルによってロードされる.env
および.wgit.rb
ファイルが作成されます。この要点の内容を使用して、実行可能ファイルを開発コンソールに変えることができます。これは、いくつかの便利な関数、フィクスチャを定義し、データベースなどに接続.env
ます。.env ファイルでWGIT_CONNECTION_STRING
設定することを忘れないでください。