مساعدة:استخراج البيانات من التوللابز

يتم تخزين بيانات الموسوعة في قاعدة البيانات باستخدام لغة 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;

تشغيل مباشر

عدل
  1. انسخ الإستعلام (query) المطلوب في test.sql
  2. اكتب في التولابز
    sql arwiki_p < test.sql >result.txt
  3. سيتم حفظ النتيجة في result.txt

ربط SQL ببايثون

عدل

<syntaxhighlight lang="python" line start="1">

  1. !/usr/bin/python
  2. -*- 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

  1. ---------------------------------------------- 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()

  1. ---------------------------------------------- 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)