مساعدة:استخراج البيانات من التوللابز
يتم تخزين بيانات الموسوعة في قاعدة البيانات باستخدام لغة SQL. فلهذا لإستخراج البيانات من قاعدة البيانات تحتاج لمعرفة هذه اللغة كما عليك امتلاك حساب في التولابز وربطه بقاعدة البيانات.
- لأمتلاك حساب في التولابز انظر هنا
- لربط حسابك بقاعدة البيانات انظر هنا
- لمعرفة جداول قاعدة البيانات انظر هنا (بالإنجليزي) أو هنا (بالعربي)
بالإمكان تشغيل كود الـSQL بشكل مباشر أو تشغيله عبر بوت بلغة أخرى كلغة بايثون.
نماذج Mysql
عدلكود 1:قائمة 500 مقالة يحتوي اسمها كلمة "كتاب"
SELECT page_title FROM page WHERE page_namespace = 0 AND page_is_redirect = 0
AND page_title LIKE "%_كتاب_%" LIMIT 500;
كود 2: تحويلات لديها وصلات لغات
SELECT /*SLOW OK */ page_title FROM page JOIN langlinks ON page_id = ll_from
WHERE page_namespace = 0 AND page_is_redirect = 1
GROUP BY page_title ORDER BY count(ll_from) DESC;
كود 3:تعديلات مستخدم ما في تاريخ ما
SELECT /*SLOW OK */
DATE(CONCAT(YEAR(rev_timestamp),"-",MONTH(rev_timestamp),"-",DAY(rev_timestamp))) AS DAY,
COUNT(rev_timestamp) AS revisions
FROM revision
WHERE rev_user_text = 'Reza1615'
GROUP BY DAY;
كود 4:مقالات أنشئها مستخدم ما حسب التاريخ
select /*SLOW OK */ page_title, DATE(CONCAT(YEAR(rev_timestamp),"-",MONTH(rev_timestamp),
"-",DAY(rev_timestamp))) AS DAY from revision join page on rev_page=page_id
where page_namespace=0 and rev_user_text='Reza1615' and rev_parent_id=0
and page.page_is_redirect = 0 GROUP BY DAY; order by rev_timestamp;
كود 5: استخراج تصانيف اسمها يطابق اسم المقالات
SELECT DISTINCT /*SLOW OK */ page_title FROM categorylinks JOIN page
where cl_to = page_title and page_is_redirect = 0;
كود 6: استخراج التصانيف المعادلة غير الموجودة
ضع الكود التالي في ملف سمه مثلاً test.sql
ثم نفذ الأمر sql enwiki_p < test.sql >result.txt
SELECT /* SLOW_OK */ cl_to
FROM categorylinks
WHERE
cl_from IN
(SELECT DISTINCT ll_from
FROM langlinks
WHERE ll_lang = "ar" )
AND
cl_to NOT IN
(SELECT DISTINCT page_title
FROM langlinks LEFT JOIN page
ON page_id = ll_from
WHERE ll_lang = "ar"
AND page_namespace = 14)
GROUP BY cl_to;
كود 7: استخراج الملفات الموجودة في ويكي العربية والكومنز
SELECT /*SLOW OK */ CONCAT('* [[:commons:Image:', db1.img_name, ']] = [[:ar:Image:',
db2.img_name, ']] (hash: ', db1.img_sha1, ')') AS collision
FROM commonswiki_p.image db1
JOIN arwiki_p.image db2 ON db1.img_sha1 = db2.img_sha1 WHERE db1.img_sha1 <> '';
كود 8: تصانيف بلا وصلات لغات وبلا قالب:تحويل تصنيف
SELECT DISTINCT page_title FROM page WHERE page_id NOT IN (SELECT tl_from FROM templatelinks
WHERE tl_title = 'تحويل_تصنيف' AND tl_namespace = 10) and page_id NOT IN
(SELECT DISTINCT page_id
FROM langlinks LEFT JOIN page
ON page_id = ll_from
WHERE (ll_lang = "en" or ll_lang = "ar" or ll_lang = "fr" or ll_lang = "tr"
or ll_lang = "de" or ll_lang = "it" or ll_lang = "ur" or ll_lang = "tk"
or ll_lang = "az" or ll_lang = "sq" or ll_lang = "uz" or ll_lang = "uk"
or ll_lang = "zh")
AND page_namespace = 14) and page_namespace = 14;
كود 10: مقالات بلا وصلات لغات
SELECT page_title FROM page LEFT JOIN pagelinks ON pl_from = page_id WHERE page_namespace=0
AND page_is_redirect = 0 AND pl_namespace IS NULL GROUP BY page_id;
كود 11: مقالات لديها وصلات لغات لنطاق آخر
SELECT /*SLOW OK */ page_title,page_namespace ,ll_title FROM page JOIN langlinks
ON page_id = ll_from WHERE page_namespace = 0 AND page_is_redirect = 0
and ll_lang='en' and ((ll_title LIKE "%Template:%") or (ll_title LIKE "%Category:%") or
(ll_title LIKE "%Wikipedia:%") or (ll_title LIKE "%Portal:%") or
(ll_title LIKE "%User:%") or (ll_title LIKE "%talk:%") or (ll_title LIKE "%Talk:%"))
GROUP BY page_id;
تشغيل مباشر
عدل- انسخ الإستعلام (query) المطلوب في test.sql
- اكتب في التولابزsql arwiki_p < test.sql >result.txt
- سيتم حفظ النتيجة في result.txt
ربط SQL ببايثون
عدل<syntaxhighlight lang="python" line start="1">
- !/usr/bin/python
- -*- coding: utf-8 -*-
import catlib ,pagegenerators import wikipedia,urllib,gzip,codecs,re import MySQLdb as mysqldb import config pagetop=u'\n{| class="wikitable sortable"\n' pagetop+=u'!الرقم!!المستخدم!!عدد المساهمات\n|-\n' pagedown=u'\n|}' adress=u"user:Elph/test54" message=u"روبوت: تحديث" rowi,text,rowar,count=' ',' ',' ',0
- ---------------------------------------------- sql part--------------
site = wikipedia.getSite("ar") query = "SELECT user_name,user_editcount FROM user ORDER BY user_editcount DESC LIMIT 100;" wikipedia.output(u'Executing query:\n%s' % query) conn = mysqldb.connect("arwiki.labsdb", db = site.dbName(),
user = config.db_username, passwd = config.db_password)
cursor = conn.cursor() query = query.encode(site.encoding()) cursor.execute(query) results = cursor.fetchall()
- ---------------------------------------------- end of sql part---------
count=0 for row in results:
count+=1 rowi=unicode(str(row[0]),'UTF-8') rowi2=unicode(str(row[1]),'UTF-8') rowar+=u'\n|'+str(count)+u'||'+rowi+u'||'+rowi2+u'\n|-\n' text=rowar.strip()
text=pagetop+text+pagedown page = wikipedia.Page(site,adress) page.put(text,message)