2011. május 23.

Wikipedia API – sok szöveg, gyorsan, tisztán

Már volt szó korábban az API-k használatáról a New York Times és a Guardian adatai kapcsán. Az API (alkalmazásprogramozási interfész) egy olyan szabványosított felület, amin keresztül hozzá lehet férni egy másik program funkcióihoz – anélkül, hogy részletesen ismernünk kéne azok működését. Minket ez elsősorban a webes alkalmazások miatt érdekel : sok oldal lehetővé teszi, hogy megkerülve a webes felületet férjünk hozzá az adatokhoz, vagy akár interakcióba lépjünk velük (közismert példa a facebook-os alkalmazás).
A Wikipedia is szabadon hozzáférhető a web megkerülésével, és ez valójában mindenkinek jó: a fejlesztők pontosan olyan adatokat kapnak, amilyet kívánnak, a Wikipedia szervereinek pedig nem kell azon erőlködniük, hogy emberi fogyasztásra alkalmassá tegyék az adathalmazt (ezzel csökken a terhelés). 


A Wikipedia MediaWiki szoftveren fut, így az ő API-ját lehet használni (dokumentáció itt és itt ) Ez egy elég okos rendszer, mi csak a legegyszerűbb dolgot fogjuk megcsinálni: kiolvasunk egy oldalt, nyers szöveg formátumban (emlékezzünk, hogy a Wikipedia alapból formázott HTML-t ad).

Ez egy egyszerű HTTP híváson keresztül történik:

Az összes Wikipedián (így a magyaron is) az API-motor a fenti címen található (mutatis mutandis). A bűvös szó itt az action=raw paraméter, ami HTML helyett “nyers” szöveget szolgáltat. Csakhogy, a kapott nyers szöveg nem igazán nyers:


'''Elephants''' are large land [[mammal]]s in two [[Genus|genera]] of the [[family (biology)|family]]


Így ezt is tisztítani kell, azonban ez formátum sokkal egyszerűbb, mint egy HTML. Lássuk, hogyan valósítjuk meg python-ban a tisztítást:




A program HTML formátumban adja vissza a megtisztított szöveget (így jobban áttekinthetők a linkek, címek, stb). Ez természetesen a megfelelő részek egyszerű átírásával/törlésével pillanatok alatt átalakítható. A jelenlegi változat parancsorból, paraméterként olvassa be a kívánt oldalt, vagyis elindítani így tudjuk (linux parancssorból):

python wikiOlvas.py Humanities > eredmeny.html

Az url_olvas() funkció kizárólag a HTML kérést bonyolítja, míg a wiki_olvas_main() végzi a tisztítást. A fő program funkcióba szervezésének az oka csupán annyi, hogy így a kódot modulként is használhatjuk ( from wikiOlvas import * ).


A program tehát csak annyit csinál, hogy eltávolít a HTML kérésből beérkező adatokból minden “nem szöveg”-nek értékelt adatot (képeket, hivatkozásokat, stb.) Ezek jellemzően kapcsos vagy szögletes zárójelek közé vannak zárva. Az ilyen munkához a legjobb ötlet – szerintem – a reguláris kifejezések (regular expression) használata. Ezek legfőbb erőssége abban rejlik, hogy a “mit-cserélj-mire” jellegű kifejezések nagyon tág keretek között írhatók le (ezt használom például a linkek feldolgozásánál, ahol úgy kell kivenni egy részt a szövegfolyamból, hogy annak egy része mégis megmaradjon). Egyébként, reguláris kifejezések írása külön művészet, aminek az alapjaival mindenképpen érdemes megismerkedni, ha szövegekkel dolgozunk.

Kis programunk tehát megtisztítja az API-tól lekért “nyers” szöveget (és azt sem tökéletesen, mert a Wikipedia belső formázási szabályai is elég bonyolultak). Ennél az API persze sokkal többre képes: lekérhetünk egyszerre több oldalt is, számos formátumban (mondjuk, XML-ben), vagy akár API-n át bele is írhatunk a Wikipédiába. A mi programunk egyik érdekes, és elég könnyen megvalósítható fejlesztése lehet a linkeket összegyűjtő, majd azokon (rekurzívan) tovább haladó változat. Így gyűjthetünk sok-sok szöveget, számolhatunk hivatkozásokat, vagy akár rajzolhatunk hálókat az egymáshoz kapcsolódó témákról – amit csak nem szégyenlünk.

Az API csak örül, hisz éppen erre való.


Nincsenek megjegyzések: