Wgit adalah perayap web HTML, ditulis dalam Ruby, yang memungkinkan Anda mengekstrak data yang Anda inginkan dari web secara terprogram.
Wgit pada dasarnya dirancang untuk merayapi situs web HTML statis untuk mengindeks dan mencari kontennya - menyediakan dasar bagi mesin pencari apa pun; tapi Wgit cocok untuk banyak domain aplikasi termasuk:
Wgit menyediakan API dan DSL tingkat tinggi dan mudah digunakan yang dapat Anda gunakan dalam aplikasi dan skrip Anda sendiri.
Lihat mesin pencari demo ini - dibuat menggunakan Wgit, Sinatra, dan MongoDB - yang diterapkan ke fly.io. Coba cari sesuatu yang berhubungan dengan Ruby seperti "Matz" atau "Rails".
Mari kita jelajahi situs web kutipan dengan mengekstraksi kutipan dan penulisnya menggunakan 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 )
Output yang mana:
[
{
"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"
},
...
]
Besar! Namun bagaimana jika kita ingin meng-crawl dan menyimpan konten tersebut dalam database, agar dapat dicari? Wgit memudahkan pengindeksan dan pencarian HTML menggunakan MongoDB (secara default):
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'
Panggilan search
(di baris terakhir) akan mengembalikan dan menampilkan hasilnya:
Quotes to Scrape
“I am free of all prejudice. I hate everyone equally. ”
http://quotes.toscrape.com/tag/humor/page/2/
...
Dengan menggunakan klien database, kita dapat melihat bahwa dua halaman web telah diindeks, beserta kutipan dan penulisnya yang diekstrak:
DSL memudahkan penulisan skrip untuk bereksperimen. DSL Wgit hanyalah pembungkus kelas-kelas yang mendasarinya. Sebagai perbandingan, berikut adalah contoh kutipan yang ditulis ulang menggunakan Wgit API dan bukan 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 )
Ada banyak crawler HTML lain di luar sana, jadi mengapa menggunakan Wgit?
xpath
yang diperlukan untuk mengikuti URL selanjutnya yang akan dirayapi. Wgit secara default, merayapi seluruh situs dengan mengekstraksi tautan internal yang menunjuk ke host yang sama - tidak diperlukan 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
situs. Ada juga parser robots.txt
praktis yang dapat Anda gunakan dalam kode Anda sendiri. Jadi mengapa Anda tidak menggunakan Wgit, saya dengar Anda bertanya?
libcurl
untuk HTTP dll.), bukan multi-utas; jadi setiap URL dirayapi secara berurutan. Anda dapat menyerahkan setiap dokumen yang dirayapi ke thread pekerja untuk diproses - namun jika Anda memerlukan perayapan secara bersamaan maka Anda harus mempertimbangkan hal lain. Hanya MRI Ruby yang diuji dan didukung, namun Wgit dapat bekerja dengan implementasi Ruby lainnya.
Saat ini, rangkaian versi MRI Ruby yang didukung adalah:
ruby '~> 3.0'
alias antara Ruby 3.0 dan lebih tinggi tetapi tidak termasuk Ruby 4.0. Wgit mungkin akan berfungsi dengan baik dengan versi yang lebih lama tetapi sebaiknya ditingkatkan jika memungkinkan.
$ bundle add wgit
$ gem install wgit
$ wgit
Memanggil executable yang diinstal akan memulai sesi REPL.
Memasang permata Wgit menambahkan wgit
yang dapat dieksekusi ke $PATH
Anda. Eksekusi meluncurkan sesi REPL interaktif dengan permata Wgit yang sudah dimuat; membuatnya sangat mudah untuk mengindeks dan mencari dari baris perintah tanpa memerlukan skrip.
Eksekusi wgit
melakukan hal-hal berikut (secara berurutan):
require wgit
.env
(jika ada di direktori lokal atau home, mana yang ditemukan lebih dulu)eval
'pada file .wgit.rb
(jika ada di direktori lokal atau home, mana yang ditemukan lebih dulu)pry
jika terinstal, atau irb
jika tidak) File .wgit.rb
dapat digunakan untuk menyemai data perlengkapan atau menentukan fungsi pembantu untuk sesi tersebut. Misalnya, Anda dapat menentukan fungsi yang mengindeks situs web Anda untuk pencarian cepat dan mudah setiap kali Anda memulai wgit
.
Permata ini tersedia sebagai sumber terbuka berdasarkan ketentuan Lisensi MIT. Lihat LICENSE.txt untuk detail lebih lanjut.
Laporan bug dan permintaan fitur diterima di GitHub. Ajukan saja masalah, periksa apakah itu belum ada.
Peta jalan saat ini pada dasarnya tercantum di halaman wiki Peta Jalan. Mungkin permintaan fitur Anda sudah ada?
Sebelum Anda mempertimbangkan untuk memberikan kontribusi, lihat CONTRIBUTING.md.
Setelah memeriksa repo, jalankan perintah berikut:
gem install bundler toys
bundle install --jobs=3
toys setup
Dan Anda siap berangkat!
Wgit menggunakan permata mainan (bukan Rake) untuk pemanggilan tugas. Selalu jalankan toys
sebagai bundle exec toys
. Untuk daftar lengkap tugas alias alat yang tersedia, jalankan bundle exec toys --tools
. Anda dapat mencari alat menggunakan bundle exec toys -s tool_name
. Alat yang paling umum digunakan tercantum di bawah ini...
Jalankan bundle exec toys db
untuk melihat daftar alat terkait database, memungkinkan Anda menjalankan instans DB Mongo secara lokal menggunakan Docker. Jalankan bundle exec toys test
untuk menjalankan tes.
Untuk menghasilkan dokumentasi kode secara lokal, jalankan bundle exec toys yardoc
. Untuk menelusuri dokumen di browser, jalankan bundle exec toys yardoc --serve
. Anda juga dapat menggunakan alat baris perintah yri
misalnya yri Wgit::Crawler#crawl_site
dll.
Untuk menginstal permata ini ke mesin lokal Anda, jalankan bundle exec toys install
dan ikuti perintahnya.
Anda dapat menjalankan bundle exec toys console
untuk shell interaktif menggunakan ./bin/wgit
yang dapat dieksekusi. Tugas bundle exec toys setup
akan membuat file .env
dan .wgit.rb
yang dimuat oleh file yang dapat dieksekusi. Anda dapat menggunakan konten Intisari ini untuk mengubah file yang dapat dieksekusi menjadi konsol pengembangan. Ini mendefinisikan beberapa fungsi yang berguna, perlengkapan dan koneksi ke database dll. Jangan lupa untuk mengatur WGIT_CONNECTION_STRING
di file .env
.