Scott Tiger Tech Blog

Blog technologiczny firmy Scott Tiger S.A.

Dane Wikipedii i ich przetwarzanie

Autor: Piotr Karpiuk o środa 15. Marzec 2017

API

Każda wersja językowa dowolnego projektu Wikimedia Foundation (w szczególności: polska Wikipedia) oferuje API. O ile nie chcemy modyfikować zawartości serwisu, nie musimy się martwić o zakładanie konta i tokeny — wystarczy odpowiednio skonstruować URL zapytania aby otrzymać interesujący JSON.

Poniżej prezentuję swoistą „księgę czarów” — listę ciekawszych wywołań API. Co sprytniejszy Czytelnik może sobie manipulować URLami aby dopasować je do swoich potrzeb, a po prawej stronie każdego wpisu jest link do dokumentacji użytego zaklęcia, gdzie można poznać inne parametry zapytania.

Artykuł hasłowy na różne sposoby
Wikikod artykułu hasłowego „Warszawa” doc
HTML artykułu hasłowego „Warszawa”
Bez arkuszy stylów, bocznego paska, kontrolki wyszukiwania itp.
doc
HTML artykułu hasłowego „Warszawa”
j.w., ale zachowana struktura dokumentu i dodane pewne informacje semantyczne; może być przydatne przy parsowaniu infoboksów
doc
HTML artykułu „Warszawa”, wersja mobilna doc
Wersja PDF artykułu hasłowego „Warszawa” doc
JSON artykułu hasłowego „Piotr Abelard”
oprócz klucza text z kodem HTML artykułu jest też categories, langlinks, title, pageid, links, templates, images, externallinks, sections itp.
doc
Ekstrakcja fragmentu artykułu
Najlepiej pasujący obrazek do hasła „Bydgoszcz” doc
Podsumowanie artykułu hasłowego „Warszawa”
jednowierszowy TXT, akapit TXT i HTML, zdjęcie, współrzędne GPS, data ostatniej modyfikacji
doc
Jednozdaniowe podsumowanie artykułu hasłowego „Warszawa” doc
Ograniczony do 175 znaków ekstrakt z artykułu hasłowego „Warszawa” doc
Powiązania
Linki z artykułu hasłowego „Albert Einstein” do innych haseł doc
Wszystkie przekierowania (aliasy) do hasła „Maria Skłodowska-Curie” doc
Tłumaczenia hasła „Warszawa” na inne języki doc
5 artykułów powiązanych (ang. related) z artykułem hasłowym „Warszawa” doc
100 haseł semantycznie podobnych (ang. similar) do hasła „Polska”
Inna technika, wykorzystuje ElasticSearch
doc
Podkategorie kategorii „Fizyka” doc
Hasła kategorii „Fizyka”
Aby wyciągnąć kolejnymi zapytaniami wszystkie wyniki, trzeba obsłużyć klucz continue w wynikowym JSONie
doc
Które strony mają linki do artykułu hasłowego „Warszawa” doc
Które artykuły hasłowe zawierają link do „blog.tiger.com.pl” doc
Do jakich obiektów z WikiData odwołuje się artykuł hasłowy „Warszawa” doc
Które artykuły hasłowe wykorzystują encję Q444 (Lech Wałęsa) portalu WikiData doc
Wyszukiwanie haseł
Wyszukiwanie artykułu hasłowego: „Einstein”
W tytule (domyślnie), w treści, rozmyte w tytule
doc
Wyszukiwanie prefiksowe artykułu hasłowego: „Alb” doc
Lista szybkich podpowiedzi dla łańcucha „Warsz”
generowana np. po wprowadzeniu kolejnej litery w polu wyszukiwania hasła
doc
Współrzędne GPS doc
Współrzędne GPS dla hasła „Warszawa” doc
Hasła obiektów w promieniu 10km od punktu o współrzędnych 52.2760,20.9679 doc
Statystyki doc
1000 najpopularniejszych haseł na plwiki w dniu 2017-07-11
Można rozróżnić wejścia mobilne/desktopowe
doc
Dla artykułu „Warszawa”: liczba odwiedzin z podziałem na miesiące w okresie od 2008-01-01 do 2016-12-31 doc
Liczba odwiedzin dla całej plwiki w dniu 2017-07-12 w godz. 06-10
Można z podziałem na miesiące, dni lub godziny
doc
Liczba urządzeń odwiedzających plwiki w dniu 2017-07-12 w godz. 06-10 doc
Statystyki odwiedzin artykułu hasłowego „Warszawa” codziennie przez ostatnich 60 dni doc
100 Najpopularniejszych hasłeł w poprzednim dniu doc
Liczba odwiedzin polskiej Wikipedii codziennie przez ostatnich 60 dni
Można też użyć metryki liczby unikalnych użytkowników
doc
Metadane
Zbiorcze podsumowanie metadanych wszystkich wersji językowych wszystkich projektów Wikimedia Foundation doc
Opis wszystkich przestrzeni nazw polskiej Wikipedii doc
Opis parametrów modułów i submodułów doc
Lista wszystkich możliwych nazw właściwości artykułów hasłowych doc
Inne
Ostatnie zmiany na plwiki doc
Lista pierwszych 500 kategorii
Aby wyciągnąć kolejnymi zapytaniami wszystkie kategorie, trzeba obsłużyć klucz continue w wynikowym JSONie
doc
Lista pierwszych 500 haseł zaczynających się prefiksem „Polska „ doc
j.w., ale dla każdego hasła dodatkowo wymienione są ewentualne prowadzące do niego przekierowania doc
Lista pierwszych 500 kategorii
Dla każdej informacja o liczbie podkategorii i artykułów hasłowych
doc
Lista wszystkich haseł ujednoznaczniających doc
Lista wszystkich haseł zabezpieczonych przed edycją doc
Lista 15 losowo wygenerowanych haseł doc
Lista 15 najnowszych zweryfikowanych haseł doc
Lista 15 niezweryfikowanych haseł doc

Kilka wskazówek o użyciu API:

  • Zapytania można oczywiście wykonywać zwykłym Ajaxem (z przeglądarki) albo curl’em (w skryptach wierszy poleceń), ale zapewne wygodniej będzie użyć do tego gotowej biblioteki w jednym z ulubionych języków programowania,
  • Nie należy wykonywać zbyt wielu zapytań naraz (tzn. nie więcej niż 200 na sekundę, i sekwencyjnie),
  • Zaleca się w nagłówku HTTP User-Agent umieścić adres email za pomocą którego administratorzy Wikipedii mogą się skontaktować z użytkownikiem API,
  • Zapytania mogą być zarówno typu GET (ograniczenie długości URL do ok. 8100 znaków), jak i POST.
  • Często stosowane dodatkowe parametry:
    • format=[json|jsonfm|xml|xmlfm|...]: sufiks „fm” oznacza ładne formatowanie z wcięciami; Uwaga: planuje się w przyszłości pozostawienie jedynie formatu JSON!
    • formatversion=2: zalecana wersja postaci JSON
    • utf= (bez przypisywania wartości): powoduje że w wyniku zamiast kodowania \uXXXX w miarę możliwości pojawią się znaki Unicode
    • redirects (bez przypisywania wartości): powoduje przejście po przekierowaniach do właściwych artykułów
  • Wiele typów zapytań zwraca domyślnie 10 wyników, ale pozwala ustalić wyższy limit; jeśli interesuje cię maksymalna wartość i nie chcesz wiedzieć ile wynosi, ustaw parametr Xlimit na „max”. Nawet wówczas może się zdarzyć że wyników jest więcej niż można zwrócić za jednym razem (np. dla zapytania action=query&list=allpages iterującego po wszystkich artykułach hasłowych). W takim przypadku trzeba zwracać uwagę na zawarty w odpowiedzi uchwyt pozwalający na dalszą iterację (patrz Continuing queries w dokumentacji).
  • W miarę możliwości zaleca się zadawanie pytań o więcej niż jedno hasło naraz, np. w parametrze titles wystarczy rozdzielić tytuły poszczególnych stron znakiem pionowej pałki.
  • Bardzo pożądaną cechą zapytań API jest możliwość użycia tzw. generatorów, które są odpowiednikami złączeń (ang. join) tabel w zapytaniach do relacyjnych baz danych.
    Przykład: chcemy wyszukać pierwszych 10 haseł Wikipedii o prefiksie „Ba”, a następnie dla każdego znalezionego artykułu hasłowego ustalić zbiór kategorii artykułu i jego linków prowadzących do innych artykułów. Bez generatora musielibyśmy wykonać 11 zapytań, z generatorem wystarczy jedno:
    https://pl.wikipedia.org/w/api.php?action=query&generator=allpages&gaplimit=10&gapfrom=Ba&prop=links%7Ccategories&utf8=

Przydatne linki:

Wikipedia offline

Na stronie dumps.wikimedia.org/plwiki/latest dostępny jest zrzut bazy danych polskiej Wikipedii. Wystarczy w URLu zmienić „plwiki” na „enwiki” by dostać się do danych Wikipedii angielskiej (i analogicznie do dowolnej innej wersji językowej). Wersja angielska jest zrzucana raz w miesiącu, mniejsze wersje językowe (np. polska) dwa razy w miesiącu.

Dane są dostępne w dwóch wersjach: XML (tekst i metadane wszystkich wersji wszystkich stron) i SQL (zrzut zawartości większości tabel wykonany poleceniem mysqldump).

XML

pages-articles.xml.bz2
Najnowsze wersje wszystkich artykułów hasłowych i szablonów, ale z wyłączeniem stron użytkowników i dyskusji. W większości przypadków właśnie tego pliku potrzebujesz
pages-meta-current.xml.bz2
j.w., ale razem ze stronami użytkowników i dyskusji
pages-meta-history.xml.bz2
j.w., ale wszystkie wersje każdej strony – ten plik może być naprawdę wielki i dla angielskiej wikipedii idzie w terabajty
stub-*.xml.gz
zawierają informacje nagłówkowe dla poszczególnych artykułów hasłowych i ich wersji, z pominięciem treści artykułów. Są tam takie rzeczy jak skrót SHA-1 każdej wersji każdego artykułu, cele przekierowań, i inne tego typu, nie zawarte w wymienionych wcześniej plikach.

Obrazki i pozostałe pliki binarne od 2013 nie są dostępne do pobrania hurtem z serwerów Wikipedii, a jedynie z serwerów lustrzanych (choć wydaje się to średnio prawdziwe i niezbyt aktualne).

SQL

Pliki *sql.gz ładujemy do bazy poleceniem mysql:

zcat file.sql.gz | mysql -u user -p passwd -D dbname

(co może trwać godzinami).

Opis niektórych plików *.sql.gz:

Linki pomiędzy stronami: pagelinks, categorylinks, imagelinks, templatelinks
Linki do innych projektów: externallinks, iwlinks (tzw. interwiki links), langlinks
Metadane plików mediów: image
Informacje o stronach: page, page_props, page_restrictions
Przekierowania wraz z hasłami docelowymi: redirect

Godzinowe statystyki odwiedzin

Począwszy od 1 maja 2015 roku pod adresem dumps.wikimedia.org/other/pageviews co godzinę zrzucany jest plik tekstowy (spakowany ok. 50 MB, po rozpakowaniu rzędu 180 MB) ze statystykami odwiedzin wszystkich wersji językowych wszystkich projektów Wikimedia (a więc w szczególności Wikipedii) z ostatniej godziny. Np. plik pageviews-20170712-080000 ma postać:

pl Donald_Tusk 11 0
pl Drugi_rząd_Donalda_Tuska 3 0
pl Małgorzata_Tusk 1 0
pl Pierwszy_rząd_Donalda_Tuska 8 0
pl Plik:Donald_Tusk_3.jpg 1 0
pl Plik:Tusk_L_Kaczynski_2007.jpg 1 0

Jak widać, hasło „Donald_Tusk” na polskiej Wikipedii było dnia 2017-07-12 między godziną 8:00 a 9:00 odwiedzane 11 razy.

Przydatne linki:

Przetwarzanie danych Wikipedii

Wikikod artykułów wikipedii można parsować za pomocą wielu narzędzi w różnych językach programowania.

Bolesnym tematem jest parsowanie infoboksów zawierających w miarę ustrukturyzowane informacje dla danego artykułu hasłowego. Niestety nie ma prostego rozwiązania problemu, polecam stosowny wątek na StackOverflow.

Przydatne linki:

Share and Enjoy:
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Śledzik
  • Blip
  • Blogger.com
  • Gadu-Gadu Live
  • LinkedIn
  • MySpace
  • Wykop

Zostaw komentarz

XHTML: Możesz użyć następujących tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>