Життя у світі Вікі/Роботи

Матеріал з Вікіпідручника

Почнемо з короткого опису API, а потім перейдемо до Pywikipediabot як найбільш доступного, гнучкого та розвинутого. Можете додати інші бібліотеки для роботи з API, та приклади власних роботів з поясненнями.

MediaWiki API[ред.]

API дозволяє отримувати доступ до даних вікіпедії через протокол http.

Наприклад отримати код сторінки PAGENAME можна звичайним GET запитом:

 http://uk.wikipedia.org/w/index.php?title=PAGENAME&action=raw

Якщо сторінка PAGENAME не існує нас повідомлять кодом 404.

Історія редагувань сторінки може отримуватись за таким запитом:

 http://uk.wikipedia.org/w/api.php?action=query&prop=revisions&titles=FAT32&rvprop=timestamp%7Cuser%7Csize&format=jsonfm&rvlimit=100

Дані, які рушій передає по запиту можуть мати різний формат, наприклад XML, YAML, чи JSON. Він задається параметром "format". Якщо до назви формату додати закінчення "fm", то отримаємо той же формат, але придатний для відображення у браузері (з переносами через <br />, та закодованими в HTML символами "<"), тобто зручний для дослідження людиною. Боти звісно краще зрозуміють чисті дані, без "fm".


Повна документація по API знаходиться тут.

pywikipediabot[ред.]

Завантаження[ред.]

Вам потрібен інтерпретатор мови Python (http://www.python.org/download/) та бот (https://www.mediawiki.org/wiki/Manual:Pywikibot/Installation/uk)

Скачуємо код бота:

wget -c http://tools.wmflabs.org/pywikibot/core_stable.tar.gz

І розпаковуємо:

tar -xvf core_stable.tar.gz

Налаштування[ред.]

Перейдіть в каталог в якому знаходяться файли бота і виконайте команду

python pwb.py login

Вам зададуть кілька питань про розділ вікіпедії в якому ви хочете працювати та ваш логін в ньому. Тепер все готово до роботи.


Прості заміни[ред.]

Тепер, коли ми знаємо на якій вікі і з якого аккаунту працюватимемо, можемо дати боту завдання замінювати певний текст встаттях. Наприклад, забрати всі зайві теги <nowiki/>, так як вони не створюють ніяких видимих змін в тексті статті. Для цього вказуємо боту команду replace, головний простір назв (-ns:0), список статтей для заміни (наприклад, тут — заданий рядком пошуку -search="") і що замінити на що:

python pwb.py replace -ns:0 -search="insource:/\<nowiki\/\>/" "<nowiki/>" ""

Після запуску бот попросить пароль від свого аккаунта (якщо він не вказаний у файлі налаштувань) і опис редагувань (якщо він не вказаний безпосередньо в команді параметром -summary:""), рядок-коментар, який буде додано до запису про редагування. Напишемо там наприклад "прибираємо зайві теги <nowiki/>".

Генерація тексту сторінок з .csv[ред.]

Якщо у вас є структуровані дані в табличному форматі (екселі), то підставляючи їх в шаблонний текст можна сформувати текст стабів. Нижче розглянемо на прикладі природно-заповідного фонду, як це працює.

# -*- coding: utf-8 -*-
 
# створення статей стабів ПЗФ
# 

import csv 

# Функція для зчитування csv-файла
def encoded_csv_reader_to_unicode(
	encoded_csv_data,
	coding='utf-8',
	dialect=csv.excel,
	**kwargs
):
	csv_reader = csv.reader(
		encoded_csv_data,
		dialect=dialect,
		**kwargs
	)
	for row in csv_reader:
		yield [unicode(cell, coding) for cell in row]

def main():
	reader = encoded_csv_reader_to_unicode(open('yourtable.csv', 'rb'), delimiter=';') # yourtable.csv — назва вашої таблиці
	is_header = True
	field_names = []
	for fields in reader:
		if is_header:
			field_names = fields
			is_header = False
		else:
			fields = fields + [''] * (len(field_names) - len(fields))	
			print article_text(dict(zip(field_names, fields))).encode('utf-8')

# наступна функція перевіряє параметр {{{де саме розміщ.}}}, і якщо в ньому є дані, створює змінну {{{кома перед розміщ}}} з комою та пробілом
def article_text(variables):
	variables[u'кома перед розміщ'] = ', ' if variables[u'де саме розміщ.'] else ''
	text = u"""start
'''{{{Назва статті}}}'''
{{Природоохоронна територія
 | назва               = {{{Власне назва об'єкта ПЗФ}}}
 | категорія МСОП      = 
 | зображення          = {{{Зображення на Сховищі}}}
 | зображення_підпис   = {{{Підпис до зображення}}}
 | ширина_зображення   = 300px
 | мапа                = 
 | підпис              = 
 | ширина_мапи         = 
 | локатор_x           = 
 | локатор_y           = 
 | розташування        = [[Україна]],<br/>[[Закарпатська область]],<br/> [[{{{Район}}} район]]
 | найближче_місто     = 
 |lat_degrees          = {{{Коорд1}}} | lat_minutes  = {{{Коорд2}}} | lat_seconds  = {{{Коорд3}}} | lat_direction  = N
 |long_degrees         = {{{Коорд4}}} | long_minutes = {{{Коорд5}}} | long_seconds = {{{Коорд6}}} | long_direction = E
 | площа               = {{{Площа}}}
 | водні об'єкти       = 
 | заснований          = {{{Рік}}}
 | число_відвідувачів  = 
 | рік_відвідувачів    = 
 | керуюча_організація = {{{Керуюча орг.}}}
 | Карта розташування  = Україна Закарпатська область
}}

'''{{{Власне назва об'єкта ПЗФ}}}'''&nbsp;— [[{{{тип}}}]] {{{значення}}}. Об'єкт розташований на території [[{{{Район}}} район|{{{Району}}} району]] [[Закарпатська область|Закарпатської області]]{{{кома перед розміщ}}}{{{де саме розміщ.}}}.

Площа&nbsp;— {{{Площа}}} га, статус отриманий у {{{Рік}}} році.

== Джерела ==
* {{Список ОПЗФ України2}}

{{Природно-заповідний фонд {{{Району}}} району}}
{{Ukraine-geo-stub}}
[[Категорія:{{{Тип у множині}}} Закарпатської області]]
[[Категорія:Природоохоронні об'єкти, засновані {{{Рік}}}]]
end

"""
	for k, v in variables.items():
		text = text.replace(u'{{{%s}}}' % k, v)
	return text

if __name__ == '__main__':
	main()

Дані беруться з .csv таблиці на зразок:

A B C D E F G H I G K L M N O P Q R S
1 Назва статті Власне назва об'єкта ПЗФ Зображення на Сховищі Підпис до зображення Район Району Коорд1 Коорд2 Коорд3 Коорд4 Коорд5 Коорд6 Площа Рік Керуюча орг. тип Тип у множині значення де саме розміщ.
2 Новоіванівський (ботанічна пам'ятка природи) Новоіванівський Вид на Новоіванівський ботаничний заказнік.jpg Арцизький Арцизького 45 55 35 29 04 40 02 1993 ДП «Ізмаїльське лісове господарство» Ботанічна пам'ятка природи Ботанічні пам'ятки природи місцевого значення с. Новоїванівка, Новоіванівське лісництво
3 Суворівський (ботанічна пам'ятка природи) Суворівський Охоронна табличка при закритій елітній школі для єврейської общини.jpg Покровський Покровського 1 1993 Приватна ЗОШ «Еліта» І-ІІІ ступеню Ботанічна пам'ятка природи Ботанічні пам'ятки природи місцевого значення вул. Героїв Сталінграду, 92а
4 ...

Для перетворення нашої таблиці необхідно виконати в терміналі (командному рядку) наступну команду:

python yourscript.py > pages.txt

Масове створення сторінок[ред.]

Якщо в нас є файл pages.txt що містить дані наступного формату:

start
'''Назва статті 1'''
Текст
статті один
end

start
'''Назва статті 2'''
Текст
статті два
end
... 

То команда

python pwb.py pagefromfile -start:start -end:end -file:pages.txt -notitle

Дозволяє автоматично завантажити текст з цього файлу у відповідні сторінки.

Обхід сторінок методом пошуку в ширину[ред.]

Нехай ми новенькі в вікіпедії, в нашому списку спостереження майже нема сторінок, але нам цікаво подивитись що люди редагують на певну тему. Наприклад танго. І ми хочемо скласти список сторінок на які посилається сторінка "Танго", і сторінок на які посилаються сторінки на які посилається "Танго". Для цього нам доведеться написати власний код:

import pywikibot

def visit(page, level, visited=set()):
    if page in visited: 
        return
    print(page.title())
    if level <= 0:
        return

    if not isinstance(page, pywikibot.page.Page):
        page = pywikibot.Page(pywikibot.Site(), page)

    for p in page.linkedPages():
        visit(p, level-1)

visit('Танго', 2)