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 جوهرة الألعاب (بدلاً من 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
.