غنای اطلاعات ویکیپدیا بر هیچکس پوشیده نیست. از دریای اطلاعات این وبسایت میتوان برای تحقیقهای تجاری و غیرتجاری و تقریبا در هر زمینهای بهره برد. شرکتها، محققان، دانشمندان داده و حتی افراد صرفا کنجکاو، همهوهمه درزمرهی افرادی قرار میگیرند که سعی میکنند دادههای ویکیپدیا را استخراج و تحلیل کنند.
ویکیپدیا بهمثابهی گنجینهای است که از مجموعهای از صدهامیلیون صفحهی وب و میلیونها مقالهی وزین چندزبانه تشکیل شده است. این امر ویکیپدیا را به بهشت خزندگان وب (Web Crawler) تبدیل کرده است. با جستوجویی ساده در گیتهاب، متوجه میشوید بیش از سیصد خزندهی وب و پروژههای مشابه برای استخراج داده از ویکیپدیا وجود دارد.
وبکراولینگ، تنها راه موجود برای استخراج و تحلیل دادههای ویکیپدیا نیست. برای مثال، ویکیمدیا اجازهی استخراج دادهها در فرمتهای متنوعی را میدهد. همچنین، API ویکیمدیا نهتنها برای دریافت اطلاعات، بلکه برای ایجاد باتها و تعامل با مقالات بهطور برنامهنویسیشده استفاده میشود.
در آموزش زیر، روی ابزار Mixnode تمرکز میکنیم که استخراج و تحلیل دادهها از ویکیپدیا با استفاده از کوئریهای SQL را فراهم میآورد. برای استفاده از این ابزار باید با SQL آشنا باشید.
Mixnode چگونه کار میکند؟
Mixnode اجازه میدهد با وب مانند پایگاه داده برخورد کنید. با استفاده از Mixnode میتوانید کوئری بنویسید و آن را روی وب اجرا کنید. با اجرای کوئری مدنظر Mixnode بهطور خودکار صفحات لازم برای پاسخ به کوئری را پیدا میکند.
مثالهای زیر نحوهی کارکرد Mixnode و استخراج و تحلیل دادهها را شفافتر میکند.
مثال ۱: بهدستآوردن آدرس تمامی صفحات ویکیپدیا
select url from pages where url_domain = 'wikipedia.org'
- متغیر
url
نمایانگر آدرس صفحه است
pages
جدولی است که هر ردیف آن مطابق با صفحهی منحصربهفرد در وب است
- با
url_domain = 'wikipedia.org'
مطمئن میشویم که فقط صفحات ویکیپدیا و سابدامینهای آن (مانند en.wikipedia.org
) مدنظر قرار میگیرند. اگر بخواهید فقط در ویکیپدیای فارسی جستوجو کنید، کافی است عبارت fa.wikipedia.org
را جایگزین کنید.
- مثال ۲: بهدستآوردن آدرس و عنوان تمامی مقالات ویکیپدیا
select url, css_text_first(content, 'h1#firstHeading')
as title from pages where url_domain = 'wikipedia.org' and url like '%/wiki/%'
-
css_text_first(content, 'h1#firstHeading')
عنوان مقالهی ویکیپدیا را خروجی میدهد. با نگاهی به سورس HTML مقالات ویکیپدیا، پی میبریم h1#firstHeading
مسیر CSS برای عنوان مقاله است. css_text_first
نیز تابعی است که اجازهی استخراج اولین مورد از انتخابگر CSS را میدهد. content در اینجا سورس کامل HTML صفحه است.
- ازآنجاییکه قصد داریم عناوین مقالات را بهدست آوریم و میدانیم در آدرس مقالات ویکیپدیا از /wiki/ استفاده میشود، از
url like '%/wiki/%'
استفاده میکنیم تا مطمئن شویم نتایجمان فقط به مقالات مربوط میشود.
- مثال ۳: بهدستآوردن عناوین تمامی مقالات شامل زیررشتهی Elon Musk
select url, css_text_first(content, 'h1#firstHeading') as title from pages where url_domain =
'wikipedia.org' and url like '%/wiki/%' and contains(content, 'Elon Musk')
contains()
تابعی است که اجازهی بررسی وجود یک زیررشته در یک رشته را میدهد. با استفاده از contains(content, 'elon musk')
مطمئن میشویم که در نتایجمان عبارت Elon Musk موجود است.
- مثال ۴: مرتبسازی مقالات ویکیپدیا براساس تعداد ارجاعات
select url, css_text_first(content,
'h1#firstHeading') as title, cardinality(css_text(content,
'ol.references li')) as reference_count from pages where url_domain =
'wikipedia.org' and url like '%/wiki/%' order by reference_count desc
- بررسی کد منبع یک مقالهی ویکیپدیا نشان میدهد تمامی ارجاعات و منابع با انتخابگر
ol.references
قابلدسترسی است. css_text(content, 'ol.references li')
متن تمامی منابع مقاله را به ما میدهد و ازآنجاییکه فقط به تعداد نیاز داریم، پس از تابع cardinality()
استفاده میکنیم که اندازهی یک آرایه را برمیگرداند. desc در خط آخر مقالات را بهصورت نزولی برایمان مرتب میکند. برای مرتبسازی بهصورت صعودی از asc استفاده کنید.
- مثال ۵: مرتبسازی مقالات ویکیپدیا براساس طول مقاله
select url, css_text_first(content,
'h1#firstHeading') as title, cardinality(words(css_text_first(content,
'#content'))) as article_length from pages where url_domain =
'wikipedia.org' and url like '%/wiki/%' order by article_length desc
words()
آرایهای شامل تمامی کلمات یک متن را برمیگرداند. استفاده از cardinality(words(css_text_first(content, '#content'))) as article_length
، تعداد کلمات یک مقاله را به ما میدهد.
- مثال ۶: اندازهی میانگین یک مقالهی ویکیپدیا
select
avg(cardinality
(words(css_text_first(content, '#content')))) as average_article_length
from pages where url_domain = 'wikipedia.org' and url like '%/wiki/%'
- تابع
avg()
میانگین دادههای ورودیاش را برمیگرداند که در اینجا، تعداد کلمات تمامی مقالات ویکیپدیاست.
- مثال ۷: مرتبسازی مقالات ویکیپدیا براساس بحثهای آن
select url,
remove_left(css_text_first(content, 'h1#firstHeading'), 'Talk:') as
title, cardinality(words(css_text_first(content, '#content'))) as
discussion_length from pages where url_domain = 'wikipedia.org'
and url like '%/wiki/Talk:%' order by discussion_length desc
- مباحث دربارهی یک مطلب در آدرسی مشابه /wiki/Talk: قرار دارند؛ بههمیندلیل از این عبارت استفاده میکنیم.
- مثال ۸: پیداکردن تمامی مقالات ویکیپدیا که لینکی به zoomit.ir دارند
select url, css_text_first(content,
'h1#firstHeading') as title from pages where url_domain =
'wikipedia.org' and url like '%/wiki/%' and contains_any(content,
array['href="https://www.zoomit.ir', 'href="http://www.zoomit.ir',
'href="https://zoomit.ir', 'href="http://zoomit.ir'])