Tagy ve špičatých závorkách představují proměnné, za které jsou dosazovány různé hodnoty. Například tag <minuty> může být nahrazen číselnou hodnotou v rozmezí 0–59. Tato hodnota udává, kolikátou minutu v hodině se bude příkaz spouštět. Další možností je místo číselné hodnoty použít znak hvězdičky, který v tomto případě znamená spouštění příkazu každou minutu v hodině. U ostatních tagů je situace podobná, jenom rozmezí čísel je jiné. Pouze tag
musí obsahovat cestu k spustitelnému souboru nebo PHP interpreteru [26]. 3.2.5
MySQL
Aby bylo možné data aplikace ukládat, je pro to třeba nejprve zvolit vhodný nástroj. Ideálním řešením se jeví využití databázového systému MySQL [17]. Jak už bylo popsáno na začátku této kapitoly, MySQL bylo zvoleno, protože je dostupné na mnoha serverech hostingových společností zdarma. Zároveň se jedná o nástroj, který umožňuje běh nejen jednoduchých, ale i profesionálních aplikací [17]. K vizualizaci struktury databáze a znázornění propojení mezi jednotlivými tabulkami bude potřeba využívat nějaký program, který tuto činnost maximálně
Metodika řešení
28
zjednoduší. K tomuto účelu lze použít modelovací program MySQL Workbench [27]. Tento program umožňuje vizuálně navrhovat, modelovat, generovat a spravovat databáze pro databázový systém MySQL. Kromě těchto činností zvládá vytváření, spouštění a optimalizaci SQL dotazů. Výsledné diagramy je možné exportovat do mnoha různých formátů nebo z nich automaticky vygenerovat SQL CREATE skripty [27]. Z tohoto důvodu se program jeví jako ideální kandidát pro modelování celé struktury databáze.
Analýza a návrh aplikace
29
4 Analýza a návrh aplikace Před započetím fáze analýzy a návrhu aplikace je potřeba nejprve projít fází specifikace problému [14]. Jelikož byl cíl práce už specifikován, bude se fáze specifikace problému zabývat jeho podrobnějším rozborem.
4.1 Specifikace problému Cílem práce je vytvořit aplikaci, která bude svým uživatelům poskytovat podporu pro rozhodování o nákupu nebo o době vhodného prodeje na sálových aukcích aukčních společností. Podporou pro rozhodování je myšleno nabídnutí relevantních historických aukčních výsledků pro zadaný dotaz. Toho bude dosaženo automatizovanou extrakcí dat z webových stránek s aukčními výsledky. K tomuto účelu bude aplikace využívat extrakčního robota, který se, po základním nastavení pro webovou stránku dané aukční společnosti, o extrakci už sám postará. Proces přidání nového webu pro extrakci bude probíhat následovně. Nejprve administrátor do aplikace zadá úvodní URL adresu stránky, na které se nacházejí odkazy na jednotlivé aukční výsledky. Poté bude probíhat tvorba extrakční šablony, na základě které bude moci robot obsah stránky správně interpretovat. K tomuto účelu bude možné využít algoritmus automatické extrakce datových záznamů [5][10][12][13], díky čemuž se proces tvorby šablony výrazně zjednoduší. Po označení jednoho bloku s aukčním výsledkem si už robot sám dohledá všechny ostatní. Díky tomu bude definice šablon dost obecná na to, aby extrakce fungovala co nejlépe a zaručila určitou schopnost správné extrakce i po menší změně struktury webových stránek. Robot bude muset také umět automatizovaně extrahovat měny a časové údaje, případně je převést do standardního formátu. Aby byl robot schopný extrahovat všechny aukční výsledky, bude muset automatizovaně procházet odkazy nacházející se na webových stránkách. Z toho plyne, že si bude muset pamatovat navštívené odkazy a bude muset být schopen rozlišovat mezi odkazy, které vedou na stránky s aukcemi a které na ně nevedou. Pro automatickou funkčnost celé extrakce bude nutné vytvořit alespoň jednoduchý plánovač, který bude činnost robota řídit. Extrakční robot musí být funkční nezávisle na zbytku aplikace, aby byla zajištěna možnost provozu extrakčního robota na jiném serveru, než bude zbytek aplikace. Z tohoto důvodu bude celá aplikace rozdělena na dvě části. První částí bude dříve popsaný extrakční robot. Druhá část aplikace bude prezentovat extrahovaná data uživateli. Tato část bude představovat vyhledávač, kde po zadání údajů o hledané položce budou nalezeny co nejrelevantnější informace o historických aukčních výsledcích z různých webů aukčních společností. Díky těmto informacím bude aplikace uživateli poskytovat podporu pro rozhodování o správném nákupu nebo o vhodné době prodeje na sálové aukci.
Analýza a návrh aplikace
30
4.2 Analýza a návrh extrakčního robota Jak bylo popsáno ve fázi specifikace problému, aplikace bude rozdělena na dvě části. První částí je extrakční robot, který se bude starat o extrakci dat z webových stránek různých aukčních společností. Pro analýzu této části je potřeba identifikovat, jak jednotlivé entity interagují se systémem. K tomuto účelu je nejvhodnější použít diagram případů užití [14]. Tento diagram obsahuje dva aktéry, kde první představuje administrátora aplikace a druhý představuje časové spouštění souboru pomocí linuxového softwarového démona Crona [25]. Po přihlášení do administrátorského rozhraní aplikace může administrátor zobrazovat logovací soubor robota, naplánované akce a vytvářet extrakční šablony pro webové stránky. Cron provádí pouze časové spouštění plánovače, což má za následek vygenerování nové akce nebo sekvence akcí a následné provedení poslední akce s nejvyšší prioritou.
Obr. 6
Diagram případu užití extrakčního robota
Jelikož je základní funkčností extrakčního robota extrakce dat z webových stránek, bude v následujících odstavcích podrobněji rozebrán proces extrakce. První fází extrakce je tvorba extrakční šablony, na základě které bude možné extrakci provést. 4.2.1
Proces tvorby extrakční šablony
Extrakční šablonu lze vytvářet různými způsoby. Jelikož nastavení extrakčního robota nemá vyžadovat informatické znalosti, musí tvorba šablony probíhat in-
Analýza a návrh aplikace
31
teraktivně. První možností je využití kurzoru myši pro označování jednotlivých prvků stránky. Tento postup je zbytečně složitý a zdlouhavý, protože nutí administrátora aplikace k postupnému označování jednotlivých prvků stránky. Tento přístup má další nevýhodu. Pokud nějaký prvek stránky nebude označen, nebude také extrahován. Z tohoto důvodu se jeví jako mnohem lepší využít algoritmus extrakce datových záznamů [5][10][12][13]. Na základě této techniky bude stačit, pokud uživatel označí jeden blok stránky a jednotlivé prvky v něm. O zbytek už se postará extrakční robot, který dohledá všechny ostatní bloky stránky, přičemž nebude záležet, jaké má webová stránka uspořádání, případně kolik bloků celkem je. 4.2.2
Proces extrakce
Po vytvoření extrakční šablony může začít proces extrakce. Tento proces funguje následujícím způsobem. Extrakční robot začíná na stránce, kterou zadal administrátor jako výchozí URL adresu pro daný web. Na této stránce se nachází seznam odkazů na stránky s aukčními výsledky. Robot musí být schopen rozpoznat, který odkaz vede na stránku s aukčními výsledky a který naopak ne (na Obr. 7 zelené a červené čáry). K tomu může být použit Bayesův klasifikátor [4][8], který provede analýzu slov v odkazu a na základě podmíněné pravděpodobnosti určí míru relevance odkazu. Poté už stačí, aby robot z množiny odkazů směřujících na aukční výsledky vybral jeden ještě nezpracovaný a načetl webovou stránku nacházející se za ním.
Obr. 7
Proces extrakce
Na základě dříve vytvořené extrakční šablony už robot sám pozná, zda se na stránce nachází nějaké aukční výsledky. Pokud se na stránce aukční výsledky
Analýza a návrh aplikace
32
nebudou nacházet, předpokládá se, že se robot nachází na tzv. přehledu aukce. Tento přehled většinou představuje rozcestník pro návštěvníka webu a slouží k zjednodušení navigace mezi jednotlivými částmi aukce (zlato, středověk, novověk, …). Robot proto analyzuje všechny odkazy na webové stránce a pokusí se najít odkaz na první stranu aukce. Poté načte stránku nacházející se za tímto odkazem a za pomoci extrakční šablony ji extrahuje. Proces dále pokračuje procházením jednotlivých stránek s aukčními výsledky. Cílem je, aby extrakční robot postupně prošel všechny stránky a následně je extrahoval. Proces končí, když robot navštíví všechny odkazy, tudíž už nezbývá žádný, který by na stránku s aukčním výsledkem vedl. Posledním krokem je uložení všech výsledků do databáze. Během extrakce samozřejmě musí docházet k automatickému rozpoznávání měn, časových údajů a k jejich převodu do standardního formátu. 4.2.3
Proces standardizace měn a časových údajů
Aby byl robot schopen provádět korektní extrakci dat z různých webových stránek, které používají různé formáty pro měny a časové údaje, musí obsahovat funkce pro automatické rozpoznávání a standardizace těchto dat. Robot nebude schopen rozpoznávat, na jakém místě webové stránky se nachází měna nebo časový údaj ke standardizaci. K tomuto účelu bude robot používat extrakční šablonu. Každé pole extrakční šablony bude mít nastaveno, zda se má kromě extrakce provádět i standardizace dat. Z tohoto důvodu se bude např. pole extrahující datum aukce snažit toto datum extrahovat a následně i standardizovat do formátu, který umožní jeho uložení do databáze. To stejné bude platit o polích s vyvolávací a konečnou cenou předmětu. Zde se robot bude snažit provést extrakci a standardizaci měn. Standardizace bude v obou případech zjednodušena pomocí regulárních výrazů [28]. Regulární výrazy představují druh textového vzoru, který lze využít pro vyhledání a filtrování dat. Vzory jsou definovány pomocí obecné notace, díky čemuž je zaručena jejich budoucí znovupoužitelnost. Existuje několik různých formátů zápisu regulárních výrazů, všechny ale vychází ze syntaxe jazyka Perl. V PHP se pro zápis regulárních výrazů používá formát PCRE (Perl-Compatible Regular Expressions), což je knihovna regulárních výrazů napsaná v jazyce C a kompatibilní s jazykem Perl. Regulární výrazy nemusí být použity pouze pro hledání a filtrování dat, lze je použít i pro dynamické nahrazování textů. Jedná se o opětovné použití částí textu, které odpovídají danému vzoru v regulárním výrazu [28]. Tímto způsobem lze standardizaci měn a časových údajů zjednodušit. 4.2.4
Automatizace extrakčního robota
Extrakční robot musí obsahovat alespoň jednoduchý plánovač, který zajistí automatizované provádění akcí. O periodické spouštění plánovače se postará linuxový démon Cron [25]. Na základě provedení PHP skriptu dojde ke spuštění plánovače, který se už postará o provedení příslušné akce. Pokud nebude žádná akce dostupná, plánovač vygeneruje novou akci nebo více nových akcí a spustí
Analýza a návrh aplikace
33
jednu z akcí. Z tohoto vyplývá, že každé spuštění PHP skriptu se bude rovnat provedení jedné akce extrakčního robota. Akce představují činnosti, které bude moci webový robot provádět. Ty budou dvojího typu. Pokud databáze plánovače nebude obsahovat žádnou akci, vygeneruje plánovač akci získání všech platných odkazů na jednotlivé aukční výsledky na jedné webové stránce. Po provedení této akce se v databázi plánovače vytvoří množina akcí, které budou představovat extrakce jednotlivých aukčních výsledků. Po provedení akce extrakce dojde k extrakci dat jedné webové stránky s aukčními výsledky. Součástí extrakce bude i uložení extrahovaných dat do databáze, která bude moci být na jiném serveru než extrakční robot. 4.2.5
Diagram tříd extrakčního robota
Po prozkoumání jednotlivých procesů, ke kterým bude v extrakčním robotovi docházet, lze přejít k tvorbě diagramu tříd robota. Tento diagram obsahuje jednotlivé třídy, rozhraní a vztahy mezi nimi. Vše je zatím bez atributů a metod jednotlivých tříd. Takto zjednodušený diagram tříd je přehlednější. Diagram tříd extrakčního robota je znázorněn na Obr. 8. Základním prvkem diagramu je třída Robot, která představuje extrakčního robota provádějícího extrakci. Tato třída využívá pro různé účely další bloky tříd, které jsou v diagramu označeny jako zelené obdélníky. Mezi tyto bloky tříd patří Debugger, Exceptions, Database, Extractor a Scheduler. První blok Debugger je blok tříd sloužících k výpisu a logování informací o stavu a chybách, ke kterým došlo během činnosti robota. Dalším blokem je Exceptions. Tento blok představuje výjimky, které jsou vyhazovány, pokud dojde při běhu extrakčního robota k chybě. Extrakci robot provádí pomocí třídy Extractor. Tato třída se stará o stahování webových stránek a jejich další zpracování. Ke zpracování stránky používá třída Extractor třídu Template, což je extrakční šablona. Na základě použití extrakční šablony na webovou stránku dojde k extrakci dat a jejich uložení do třídy PageData. Poté může dojít extrakci odkazů z webové stránky. K účelu uložení extrahovaných odkazů se používá pomocná třída Link. Po extrakci dat z webové stránky může dojít k jejich uložení do databáze. K tomuto účelu aplikace používá blok tříd Database. V tomto bloku se nachází dvě možnosti, jak se připojit ke vzdálené databázi. K uložení do databáze na stejném serveru, kde probíhá extrakce, se používá třída DB. Pokud databáze neumožňuje připojení pomocí předchozí třídy, lze využít třídu RemoteDB. Aby mohl extrakční robot provádět svou činnost automatizovaně, provádí jeho řízení třída Scheduler. Tato třída představuje plánovač, která se stará o vytváření a zpracovávání akcí, které následně robot vykonává.
Analýza a návrh aplikace
Obr. 8
34
Diagram tříd extrakčního robota
Diagram také obsahuje čtyři další třídy, které se nenacházejí v žádném bloku. Těmito třídami jsou HTML, User, Factory a BayesFilter. Třída HTML slouží ke generování HTML kódu stránek. Třída User se stará o správu uživatelů extrakč-
Analýza a návrh aplikace
35
ního robota a přihlašování do administrace. Dále třída Factory se používá pro jednoduché vytváření instancí objektů tříd a jejich zpřístupňování dalším třídám. Nakonec třída BayesFilter implementuje Bayesův filtr pro analýzu webových odkazů. 4.2.6
Schéma databáze extrakčního robota
Schéma databáze extrakčního robota je znázorněno na Obr. 9 a má celkově sedm tabulek. Pro přihlášení uživatelů do administrace extrakčního robota slouží tabulka user. Přístup do administrace nebude umožněn všem uživatelům, pro přihlášení musí daný uživatel patřit do skupiny administrátorů. Tabulka uživatelů má stejný tvar jako tabulka user vyhledávače. To je z důvodu kompatibility, aby bylo možné používat obě části databáze v jedné na jednom databázovém serveru.
Obr. 9
Schéma databáze extrakčního robota
Databáze dále obsahuje tabulky bayesfilterdata a bayesfilter. Tyto tabulky slouží k ukládání Bayesových filtrů [4][8] a označených dat, které se dále používají pro klasifikaci do různých tříd. Pro označování dat na pozitivní a negativní příklady se používá atribut tag tabulky bayesfilterdata. Důležitou částí databáze jsou tři tabulky, které se starají o ukládání extrakčních šablon. Těmito tabulkami je auction_list, template a base_path. Jak bylo zmíněno v předchozích kapitolách, šablona se skládá z cest objektového modelu dokumentu. Prakticky slouží tabulka template k ukládání relativních XPath cest a tabulka base_path slouží k ukládání absolutních XPath cest od kořenového elementu dokumentu. Aktualizací dat v tabulce base_path lze umož-
Analýza a návrh aplikace
36
nit funkčnost extrakce i při změně struktury webových stránek. Poslední z trojice tabulek auction_list slouží k uchovávání počátečních URL adres, na kterých se má extrakce provádět. Poslední tabulkou v databázi extrakčního robota je scheduler_action. Tato tabulka slouží k ukládání akcí, které vygeneroval plánovač extrakčního robota. U každé akce se ukládá typ akce, priorita a příznak provedení akce. Příznakem provedení je zaručeno, že se žádná akce neprovede vícekrát a nedojde k vícenásobné extrakci. Tvar jednotlivých akcí a způsob jejich použití bude vysvětlen později. Nyní bude rozebrána druhá část aplikace, a to vyhledávač.
4.3 Analýza a návrh vyhledávače Stejně jako extrakční robot, musí mít i vyhledávač svůj diagram případů užití. Tento diagram bude obsahovat aktéry a činnosti, které budou moci v aplikaci provádět.
Obr. 10
Diagram případů užití vyhledávače
Vyhledávač bude mít tři typy aktérů (neregistrovaného uživatele, registrovaného uživatele a administrátora). Nejméně činností bude moci provádět neregistro-
Analýza a návrh aplikace
37
vaný uživatel. Jemu bude umožněno pouze vyhledávat s omezením na maximálně deset možných výsledků. Pokud se neregistrovaný uživatel v aplikaci zaregistruje, vznikne aktér registrovaný uživatel. Registrace nového uživatele bude podmíněna systémem registračních pozvánek, což umožní kontrolu nad tím, kdo bude moci používat pokročilé funkce aplikace. Aktér registrovaný uživatel bude moci vyhledávat bez omezení a zároveň bude mít dostupné pokročilé vyhledávání. Registrovaný uživatel bude dále moci prohlížet jednotlivé aukce a aukční výsledky nebo provádět nastavení svého účtu. Také si bude moci nalezené aukční položky přidávat mezi své oblíbené. Vše bude samozřejmě podmíněno přihlášením do aplikace. Pokud by se náhodou uživateli stalo, že zapomene heslo, bude si ho moci resetovat. V tomto případě bude uživateli odesláno nové náhodně vygenerované heslo na e-mail. Tímto způsobem bude odbourána nutnost akce administrátora aplikace při ztrátě hesla uživatele. Nejvyšší práva bude mít administrátor aplikace. Tento aktér bude moci provádět stejné činnosti jako registrovaný uživatel. Zároveň bude moci spravovat jednotlivé uživatele, zobrazovat historii vyhledávání, zobrazovat systémové logy a generovat pozvánky pro registraci do aplikace. 4.3.1
Proces registrace
Životní cyklus registrovaného uživatele začíná registrací do aplikace. Jelikož aplikace nebude podporovat běžnou registraci, jedinou možností, jak se z neregistrovaného uživatele stane uživatel registrovaný, je registrace prostřednictvím systému registračních pozvánek. Tímto omezením bude zaručeno, že pokročilé funkce budou dostupné pouze administrátorem vybraným uživatelům. Pokud se administrátor přihlásí do aplikace, bude mít v administrátorské části možnost správy registračních pozvánek. Touto pozvánkou je myšlena speciální URL adresa s unikátně vygenerovaným klíčem. Pokud neregistrovaný uživatel použije tuto URL adresu, bude mít možnost vytvořit nový uživatelský účet. Tento proces bude možné v průběhu ukončit bez ztráty platnosti pozvánky. Pouze pokud neregistrovaný uživatel správně vyplní všechna požadovaná pole, dojde k zneplatnění pozvánky, vytvoření uživatelského účtu a přihlášení do aplikace. 4.3.2
Proces vyhledávání
Pokud se uživatel přihlásí do aplikace, bude mít dostupnou možnost vyhledávání v aukčních výsledcích. Vyhledávání bude obsahovat dvě pole. První pro vyhledávání v názvu a druhé v období aukčních položek. Tento způsob byl vybrán, protože uživatelům umožňuje jednodušeji tvořit vyhledávací dotazy, které umožní filtrování zobrazených výsledků. Při použití jednoho vyhledávacího pole by muselo být využito nějaké rozlišení mezi hledáním v názvu a v období aukční položky, které by uživatelé museli znát a používat. Z tohoto důvodu je vyhledávání pomocí dvou vyhledávacích polí pro uživatele mnohem intuitivnější.
Analýza a návrh aplikace
38
Vyhledávání musí uživateli také nabídnout možnost využití pokročilých funkcí. Základem je filtrování podle jednotlivých aukcí, řazení od nejnižší nebo nejvyšší dosažené konečné ceny, řazení od nejstarších nebo nejnovějších výsledků, volba zobrazování položek bez obrázků a volba zobrazování neprodaných položek. Další možností, jak uživatelské hledání zjednodušit, je využití booleovského modelu hledání [29]. Booleovský model používá pro upřesnění hledávání logické spojky AND, OR a NOT. Logická spojka AND umožňuje tvořit tzv. úzké dotazy. Tyto dotazy umožňují zúžit množinu výsledků vyhledávání. Pro rozšíření množiny výsledků se využívá logické spojky OR. Tato spojka tvoří tzv. široké dotazy. Možností, jak odebrat určitá slova nebo fráze z výsledků vyhledávání, je využití logické spojky operátoru NOT. Tato spojka umožňuje definovat slova, která se nesmí ve výsledcích vyhledávání objevit [29]. Kromě logických spojek booleovského modelu dále vyhledávače využívají vlastní operátory, které umožňují ještě více zpřesnit vyhledávání. Příkladem vlastního operátoru je uzavření fráze do uvozovek, kdy vyhledávací dotaz musí obsahovat přesně zadanou frázi [30]. 4.3.3
Proces přidávání mezi oblíbené položky
Aplikace bude uživatelům umožňovat nalezené výsledky přidat mezi své oblíbené položky. Všechny položky, které si uživatel vložil mezi své oblíbené, bude moci později najít v seznamu oblíbených položek. Tímto způsobem si uživatelé budou moci ukládat položky, které je zajímají, a budou je moci kdykoliv najít na jednom místě bez toho, aniž by je museli stále dokola hledat. Přidávání a odebírání z oblíbených položek bude uživatelům umožněno v jakékoliv části presentující aukční položky uživateli (vyhledávání, prohlížení). Aby proces manipulace s oblíbenými položkami uživatele při práci nerušil, bude použita technologie AJAX [24], která umožňuje přenos mezi částí na klientském počítači a webovým serverem tzv. na pozadí. Tímto termínem je myšleno, že dojde k aktualizaci části stránky bez toho, aby byla celá stránka obnovena. U každé položky na stránce bude umístěna ikonka, která bude uživateli ihned signalizovat, zda je daná položka mezi uživatelovými oblíbenými položkami. Po kliknutí na tuto ikonku dojde k odeslání HTTP požadavku na webový server prostřednictvím JavaScriptu. Na serveru dojde k následnému zpracování požadavku a v závislosti, zda je položka v uživatelových oblíbených položkách nebo ne, dojde k odebrání nebo přidání do databáze. Následně dojde k odeslání výsledku celé operace zpět na počítač klienta. Zde je výsledek zpracován a dojde ke změně HTML kódu stránky tak, aby vzhled stránky odpovídal aktuálnímu stavu. Pro uživatele je proto změna pomocí technologie AJAX přirozenější a aplikace se chová jako by se jednalo o desktopovou aplikaci. 4.3.4
Diagram tříd vyhledávače
Jelikož je vyhledávač postaven na Nette Frameworku, který využívá MVC architektury, musí diagram tříd toto reflektovat. Z tohoto důvodu je celý diagram na
Analýza a návrh aplikace
39
Obr. 11 rozdělen na jednotlivé části. Tyto části jsou Model, Controller (zde Presenter) a Components, které představují znovupoužitelné komponenty aplikace. Část View v diagramu není přítomna, protože je v Nette reprezentovaná pomocí Latte šablon. V podstatě lze říci, že ke každému presenteru je připojena jedna nebo více Latte šablon, které ovlivňují způsob vykreslení výsledné HTML stránky. V diagramu je možné si všimnout osamocené třídy RouterFactory. Tato třída se stará o obousměrné routování mezi URL adresami a akcemi presenterů. Umožňuje tak automaticky nastavit způsob generování URL adres pouze na základě změny v třídě routeru [21]. V diagramu jsou využity dvě barvy pro označení původu tříd. Třídy označené šedou barvou jsou součástí Nette Frameworku. Tyto třídy by v diagramu být nemusely, ale pro pochopení kontextu byly do diagramu přidány. Z těchto tříd jsou dále odvozeny všechny ostatní modré třídy. Modré třídy byly vytvořeny pro účel fungování této aplikace. Struktura tříd Nette obsahuje pár důležitých tříd, které je potřeba pro pochopení funkce diagramu vysvětlit. Předkem všech tříd, od kterých je možné vytvářet instance, je Nette\Object. Dále jsou v diagramu znázorněny třídy předků presenteru (Presenter), komponent (Control) a rozhraní pro autentizaci do aplikace (IAuthenticator) [21]. Část model obsahuje převážně třídy Repository, tyto třídy slouží ke komunikaci s databází. Další třída, která se v modelu nachází, je Authenticator. Ta se stará o přihlašování uživatelů do aplikace. Poslední třídou v této části je SearchSettings. Tato třída slouží jako přepravka pro přenos informací o aktuálním nastavení vyhledávání uživatele. V části presenter jsou pouze třídy, které slouží k prezentování dat z modelu uživatelům aplikace. Všechny třídy jsou potomkem základní třídy BasePresenter a už název každé třídy napovídá o jejím účelu. První stránku aplikace, na kterou se každý uživatel dostane, reprezentuje třída HomepagePresenter. Následně se uživatel může zaregistrovat (RegisterPresenter) a přihlásit pomocí (SignPresenter) a je přesměrován na PremiumPresenter. Zde už má uživatel možnost vyhledávání nebo může kdykoliv přejít na jednu z dalších stránek. Mezi tyto stránky patří nastavení účtu uživatele (SettingPresenter), zobrazení oblíbených položek (FavoritePresenter), nápověda (HelpPresenter) a prohlížení aukčních položek (ListingPresenter). Administrátoři aplikace mají navíc možnost používat administrátorské rozhraní aplikace (AdminPresenter). Aby se při vývoji aplikace zabránilo opakování částí kódu, obsahuje Nette komponenty. Komponenta je logická část kódu s vlastními šablonami, která může být díky tomu různě přizpůsobená. Aplikace obsahuje tři komponenty – SearchForm, SearchResult a VisualPaginator. Komponenty SearchForm a SerchResult reprezentují vyhledávací formulář a výsledný seznam nalezených položek. Obě komponenty jsou přizpůsobitelné, aby je bylo možné použít v různých částech aplikace. Poslední komponentou je VisualPaginator, což je oficiální komponenta z webu Nette. Tato komponenta se stará o stránkování prohlížených aukčních položek [21].
Analýza a návrh aplikace
Obr. 11
Diagram tříd vyhledávače
4.3.5
Schéma databáze vyhledávače
40
Celé schéma databáze vyhledávače je znázorněno na Obr. 12 a skládá se z celkového počtu jedenácti tabulek. Nejdůležitější jsou tabulky auction, item, picture, picture_url. Všechny tyto tabulky se používají pro ukládání dat z extrahovaných webových stránek. Tabulka auction obsahuje jednotlivé aukce, tabulka item obsahuje extrahované aukční položky a tabulky picture
Analýza a návrh aplikace
41
a picture_url slouží k ukládání odkazů na aukční obrázky. Poslední dvě jmenované tabulky mohou působit nezvykle, protože by se problém, který řeší, dal vyřešit jednou tabulkou. To by bylo možné pouze v případě, kdy by nedocházelo k postupnému odstraňování obrázků z webových serverů. V takovém případě by bylo řešení pomocí jedné tabulky dostatečné. Databáze je však připravena na to, že je jeden obrázek uložen na několika různých místech. Pokud dojde k odstranění jednoho obrázku, nastaví se hodnota valid u picture_url na false a aplikace hned může použít obrázek z jiného serveru. Databáze bude také umožňovat ukládání položek do kategorií. K tomuto účelu slouží tabulky category a item_has_category. Druhou částí databáze je práce s uživateli. Zde je nejdůležitější tabulka user, která ukládá informace o jednotlivých uživatelích aplikace. Informace o historii vyhledávání se ukládá do tabulky search_history. Nalezené položky si uživatel může přidat mezi své oblíbené položky, aby je v budoucnu nemusel znovu hledat. K tomuto účelu slouží tabulka favorite. Poslední dvě tabulky v diagramu jsou token a token_type. Tyto tabulky slouží k ukládání bezpečnostních tokenů, které se využívají převážně pro registraci do aplikace nebo jako ověřovací při resetování hesla.
Analýza a návrh aplikace
Obr. 12
Schéma databáze vyhledávače
42
Implementace extrakčního robota
43
5 Implementace extrakčního robota V kapitole implementace bude podrobněji rozebrána implementace obou částí aplikace. Tato část se bude zabývat implementací extrakčního robota.
5.1
Popis tříd
V této části budou detailněji popsány třídy, které se nacházejí v diagramu tříd extrakčního robota. 5.1.1
Třída Robot
Nejdůležitější třída v diagramu tříd je Robot. Při každém spuštění extrakčního robota je potřeba vytvořit instanci této třídy. Konstruktor třídy přebírá objekty Debugger a Extractor, kterým je delegována činnost ukládání logů a extrakce webových stránek. Hlavní funkcí třídy Robot je provádění automatické extrakce dat a webových odkazů z webových stránek. K tomuto účelu je využívána metoda execute. Tato metoda přebírá objekt Action a následně volá jednu z metod executeExtract nebo executeAddLinks v závislosti na tom, zda se mají extrahovat data nebo odkazy z webové stránky.
Obr. 13
Třída Robot
Kromě provádění akcí slouží třída Robot k vytváření a testování nových šablon pro extrakci. K tomuto účelu slouží metody saveTemplate a testTemplate. 5.1.2
Třída Extractor
Jak bylo popsáno dříve, třídu Extractor využívá třída Robot k extrakci dat a odkazů z webových stránek. Třída Extractor umí stahovat webové stránky, manipulovat s jejich obsahem a extrahovat z nich data v různých formátech. Pro stažení webové stránky se využívá metoda loadWeb. Během načítání dochází
Implementace extrakčního robota
44
k automatické detekci a opravě kódování na základě HTTP hlaviček. Pokud se webovou stránku podařilo stáhnout, je načtena do třídy jako objektový model dokumentu (DOM). Nyní je možné se stránkou manipulovat. Extractor umí na stránce přidávat a odebírat skripty nebo opravovat odkazy na obrázky a styly z relativních na absolutní. Toho je využito při interaktivní tvorbě šablony, kdy je stránku potřeba vložit do rámu, aby mohl uživatel provádět označování prvků kurzorem myši.
Obr. 14
Třída Extractor
Nejdůležitější činností, kterou třída Extractor provádí, je extrakce dat z webových stránek. K tomuto účelu je metoda extractItem, která přebírá XPath adresu prvku [11] a typ, který se má extrahovat. Označení typu slouží k výběru typu extrakce určitých dat. Třída umí extrahovat data jako čistý text, případně extrahovat a standardizovat z textu určitý údaj jako cenu (extractPrice), měnu (extractCurrency) nebo datum (extractDate). 5.1.3
Třída Scheduler
Třída Scheduler představuje jednoduchý plánovač, který řídí činnost celého extrakčního robota. Tato třída obsahuje pouze dvě metody. První z nich je getAction a slouží k získání jedné existující akce z databáze. Pokud v databázi žádná taková akce není, Scheduler se postará o vytvoření jedné nebo více akcí na základě aktuálně vytvořených extrakčních šablon.
Implementace extrakčního robota
Obr. 15
45
Třída Scheduler
Druhá metoda třídy Scheduler slouží k označování akcí za úspěšně splněné. U této metody je možné zadat, zda má být akce z databáze smazána nebo jenom označena za splněnou. To je nutné z toho důvodu, že některé akce je nutné provádět pravidelně (extrakce odkazů na nové aukce) a jiné pouze jednou (extrakce webové stránky). První typ akce se musí z databáze mazat, druhý se pouze označí za splněný. 5.1.4
Třída Action
Třída Action je generována pomocí třídy Scheduler. Action tedy slouží pouze jako přepravka pro databázovou reprezentaci akce. Každá akce obsahuje unikátní identifikátor, typ akce (extrakce aukce nebo kontrola nových aukcí) a několik dalších atributů, které označují URL adresu stránky a ID šablony, která se má pro extrakci použít.
Obr. 16
Třída Action
5.1.5
Třída Template
Třída Template slouží jako přepravka pro databázovou reprezentaci šablony. Skládá se z množiny XPath dotazů, které odkazují na jednotlivé části aukce. XPath dotazy uložené v této třídě jsou dvojího typu. Metoda getBasePaths vrací pole absolutních XPath odkazů. Tyto jsou použity pro určení pozic jednotlivých bloků s daty pro extrakci. Na rozdíl od toho metoda getRelativePaths vrací množinu relativních XPath dotazů. Ty identifikují jednotlivé prvky v bloku.
Implementace extrakčního robota
Obr. 17
Třída Template
5.1.6
Třída PageData
46
Pro uchovávání extrahovaných dat z webových stránek se používá třída PageData. Stejně jako předchozí třída slouží pouze jako přepravka. Rozdíl proti předchozím třídám je v možnosti postupného plnění instance třídy. Ta je plněna podle toho, jak extrakční robot postupně prochází jednotlivé stránky. Až jsou data připravena na uložení, je zavolána metoda insert. Tato metoda má velkou výhodu, protože jako parametr se zadává rozhraní IDatabase, kam se mají data uložit. Je tedy možné jednoduše nastavit, zda se data mají ukládat na lokální nebo na vzdálenou databázi. Další výhodou je budoucí rozšiřitelnost vytvořením mnoha různých tříd, které mohou data ukládat mnoha různými způsoby.
Obr. 18
Třída PageData
5.1.7
Třída BayesFilter
Extrakční robot musí být schopen procházet jednotlivé webové stránky aukce bez toho, aby se ztratil. Z tohoto důvodu používá třídu BayesFilter, která umožňuje klasifikovat jakýkoliv webový odkaz do dvou skupin na základě toho, zda se jedná nebo nejedná o odkaz na aukci. Třída BayesFilter v podstatě implementuje dříve popsaný Bayesův klasifikátor [4][8] a kromě učení umožňuje i následnou klasifikaci.
Implementace extrakčního robota
47
Pro učení slouží metoda getTrainedWords, která přebírá jako parametry dvě pole řetězců, která patří a nepatří do klasifikované třídy. Následně je pomocí metody getWords získán seznam všech unikátních slov, která se v řetězcích nalézají. K rozdělení řetězců do slov se používá metoda multiexplode, která využívá seznam oddělovačů. Následně dojde k výpočtu podmíněné pravděpodobnosti pro každé takto získané slovo, které nepatří na seznam výjimek. Na tento seznam byla manuálně vložena slova, na kterých nezáleží výsledná klasifikace. Příkladem je slovo „www“.
Obr. 19
Třída BayesFilter
Po natrénování třídy umožňuje BayesFilter klasifikovat řetězce znaků. Ke klasifikaci se používá metoda getClassScore. Tato metoda nejprve rozdělí klasifikovaný řetězec na základě seznamu oddělovačů. Poté dojde k zjištění pravděpodobnosti pro každé slovo a nakonec je vypočítána podmíněná pravděpodobnost pro celý řetězec. Na základě této pravděpodobnosti se poté může extrakční robot rozhodnout, zda bude odkaz následovat nebo ne. 5.1.8
Třída Link
Pro ukládání extrahovaných odkazů slouží třída Link. Tato třída představuje pouze přepravku pro jeden extrahovaný odkaz.
Obr. 20
Třída Link
5.1.9
Třída Factory
Aby bylo co nejvíce zjednodušeno vytváření složitých objektů, využívá se třída Factory. Výhodou použití této třídy je, že ostatním třídám umožňuje jednoduše
Implementace extrakčního robota
48
získávat složité objekty, které pro vytváření potřebují načítat data z databáze. Třída obsahuje několik metod, které umožňují získávat objekty šablon, získávat objekty akce, získávat data pro učení Bayesova klasifikátoru a získat natrénovaný Bayesův klasifikátor.
Obr. 21
Třída Factory
5.1.10
Třída DB
Třída DB slouží pro komunikaci s databází. Jelikož také implementuje rozhraní IDatabase, není do budoucna problém vytvořit třídu pro jakýkoliv způsob ukládání dat. Výhody třídy DB plynou z využití PDO (PHP Data Objects) [31]. PDO představuje abstraktní vrstvu, která umožňuje pracovat s různými databázemi pomocí jednotného rozhraní. Zároveň přestavuje nový způsob zápisu SQL dotazů, kde jsou data vázána později pomocí metody bind. Tímto je zajištěna obrana před útoky na webové stránky pomocí vkládání nebezpečných znaků (SQL injection).
Obr. 22
Třída DB
Třída DB zároveň podporuje transakce. Ty se mohou hodit v případě, kdy se do databáze má vložit pouze celá aukce. Pokud by se vložení nepodařilo, nedojde k nekonzistentnímu stavu databáze. Stav databáze je pomocí metody rollBackTransaction vrácen do stavu před započetím transakce.
Implementace extrakčního robota
5.1.11
49
Třída HTML
Třída HTML slouží ke zjednodušení generování často používaných bloků HTML kódu. Mezi tyto bloky patří hlavička, obrázky, odkazy, tabulky, tlačítka a stavové zprávy aplikace.
Obr. 23
Třída HTML
5.1.12
Třída User
User představuje jednoduchou třídu pro přihlašování administrátorů ke správě nastavení extrakčního robota. Tato metoda je velmi jednoduchá, proto není třeba další popis.
Obr. 24
Třída User
5.2 Popis funkce extrakčního robota Po přihlášení je administrátor přesměrován na stránku s úvodní obrazovkou. Zde se zobrazují nejdůležitější informace o výsledku provedených akcí, o chybách a o naplánovaných akcích. Pro zjištění výsledku provedených akcí se používá zobrazování obsahu textového souboru logu. Forma textové místo databázové reprezentace pro log soubor byla zvolena záměrně, protože jsou sem zapisovány i informace o chybách, které by při chybě připojení k databázi nešly zapsat. Informace o naplánovaných akcích je načítána z databáze a umožňuje okamžitě zjistit, jakou posloupnost akcí bude extrakční robot vykonávat. Každá akce může být typu extract nebo addLinks. Akce typu extract slouží pro extrakci dat z dané URL adresy. Akce typu addLinks slouží pro získávání odkazů na nové aukce, které jsou pak uloženy do databáze jako akce extract. Úvodní stránka
Implementace extrakčního robota
50
také obsahuje seznam aktivních extrakčních šablon, který je možné rozšířit přidáním nové šablony.
Obr. 25
Extrakční robot – úvodní obrazovka
5.2.1
Tvorba extrakční šablony
Administrátor aplikace se může z úvodní stránky dostat na tvorbu extrakční šablony. K tomu slouží horizontální menu v horní části stránky. Toto menu už kromě jména přihlášeného administrátora a tlačítka pro odhlášení z aplikace nic jiného neobsahuje, protože extrakční robot provádí veškerou další činnost automatizovaně. Po kliknutí na tlačítko pro přidání extrakční šablony je administrátor přesměrován na stránku, kde bude proveden procesem tvorby extrakční šablony pro zvolený web. Cílovou webovou stránku administrátor zvolí pomocí pole s titulkem „Seznam aukcí“. Do tohoto pole administrátor vloží URL adresu stránky se seznamem odkazů na aukční výsledky. Po vložení URL adresy a potvrzení dojde k automatické extrakci všech URL odkazů, které se na dané stránce nachází (viz Obr. 26). Každý odkaz je zobrazen jako řádek tabulky, ve kterém jsou, kromě URL adresy aukčního výsledku, i ovládací prvky se symboly plus a mínus. Ovládací prvky slouží k učení algoritmu Bayesova filtru [4][8]. Kliknutí na tlačítko se symbolem plus znamená přidání celého textu odkazu a URL adresy odkazu mezi pozitivní trénovací příklady. Takové příklady bude extrakční robot považovat za odkazy na aukce a bude se je snažit extrahovat.
Implementace extrakčního robota
51
Administrátor má možnost využít kliknutí na tlačítko se symbolem mínus. Toto tlačítko, jak název napovídá, přidá odkaz mezi negativní příklady. Mezi tlačítky se také nachází číselná hodnota, která určuje vypočítanou podmíněnou pravděpodobnost pro daný odkaz. Na základě této hodnoty je poté každý odkaz označen barvou. Červená barva je použita pro odkazy, které se nebudou extrahovat. Zelená barva je naopak použita pro odkazy, které se extrahovat budou. A nakonec šedé jsou odkazy, u kterých Bayesův filtr nedokáže určit, do jaké skupiny patří.
Obr. 26
Extrakční robot – naučený Bayesův filtr
Po implementační stránce je proces učení Bayesova filtru řešen pomocí technologie AJAX. Je tedy možné komunikovat se serverem a měnit obsah stránky bez nutnosti celkového obnovení stránky. Naučené odkazy jsou poté na serveru ukládány do databáze. Při každé změně samozřejmě dojde k přepočítání podmíněných pravděpodobností pro všechny odkazy a následně dojde k aktualizaci hodnot score. Proces učení Bayesova filtru je díky tomu velmi intuitivní a administrátor může mít pocit, že pracuje s desktopovou aplikací. Když je administrátor spokojen s procesem učení a následnou schopností rozpoznávání odkazů, může přejít k vlastní tvorbě extrakční šablony. K té se dostane po kliknutí na jednu z malých zelených šipek u zeleně podbarvených odkazů. Po kliknutí na jednu z těchto šipek dojde k načtení cílové webové stránky a vložení jejího obsahu do rámu. Proces mezi kliknutím a zobrazením stránky je složitější, protože odkazy běžně nevedou na stránku, kde se extrakce má provést.
Implementace extrakčního robota
52
Většinou se zde nachází i stránka, která slouží pro návštěvníky aukčních výsledků jako rozcestník, který jim umožňuje rychle se přepínat mezi různými částmi výsledků (zlato, středověk, novověk, …). Robot proto musí nejprve nalézt odkaz na první stranu aukce. Algoritmus hledání odkazu první strany aukce funguje následovně. Extrakční robot nejprve extrahuje všechny odkazy, které se na stránce nacházejí. Poté jsou z této množiny vybrány pouze odkazy, které rozpozná naučený Bayesův filtr. Ve výsledné množině odkazů dochází k hledání odkazu, který obsahuje nejmenší číslo. Právě ten většinou odkazuje na první stranu aukce.
Obr. 27
Extrakční robot – tvorba šablony
Po nalezení odkazu dojde k načtení obsahu webové stránky a jeho následnému zpracování pro vložení do rámu stránky (viz Obr. 27). Celý proces od kliknutí na zelenou šipku až po zobrazení stránky je po implementační stránce mnohem složitější. Po kliknutí na tlačítko se zelenou šipkou dojde k odeslání ajaxového požadavku na server. Server vyhledá první stranu aukce a následně stáhne obsah této stránky. Poté musí odstranit všechny skripty, zrušit funkčnost odkazů a tlačítek, opravit odkazy na kaskádové styly a obrázky. Díky tomu je stránka zobrazena ve stejné podobě, ve které se zobrazí administrátorovi po zadání URL adresy do
Implementace extrakčního robota
53
webového prohlížeče. Důležitým krokem je vložení skriptu do těla stránky, který administrátorovi umožňuje vybírat jednotlivé bloky stránky pouze za pomoci kurzoru myši. Proces tvorby extrakční šablony je proto jednoduchý. Nejprve je administrátorovi zobrazena stránka, na které bude vytvářet extrakční šablonu. Administrátor následně může, pomocí kurzoru myši, označovat jednotlivé bloky stránky s tím, že jsou okamžitě generovány XPath dotazy, které blok jednoznačně identifikují. Přepínání mezi výběrem jednotlivých bloků stránky se provádí pomocí tlačítek s popiskem další. V praxi administrátor nejprve označí název aukce a přejde na další krok. Následně vybere text, ve kterém se nachází datum aukce. Poté následuje krok, který významně ulehčuje tvorbu celé šablony. Administrátor vybere jakýkoliv blok, ve kterém se nacházejí data jedné aukční položky. Jakmile vybírá jednotlivé prvky, které se v tomto bloku nacházejí, může si všimnout, že XPath dotazy jsou generovány relativně k absolutní cestě celého bloku. Díky tomuto výběru je možné provést následující akci. Administrátor stiskne tlačítko s popiskem „Vyhledat“ a okamžitě jsou nalezeny absolutní cesty ke všem ostatním blokům. Celý proces využívá algoritmus extrakce datových záznamů [10][12][13]. Ostatní bloky jsou dohledány díky podobnosti jejich vnitřní struktury XPath dotazů s označeným blokem. Nakonec, po kliknutí na tlačítko uložit, dojde k uložení celé šablony do databáze. Poté dojde automaticky k testu extrakční šablony. Extrakční robot se pokusí extrahovat první stránku zvolené aukce a výsledek administrátorovi zobrazí (viz Obr. 28).
Obr. 28
Extrakční robot – testování šablony
Jak je možné vidět na předchozím obrázku, extrakční robot provádí i automatickou extrakci odkazů na obrázky, i když administrátor nemusel při tvorbě extrakční šablony žádný obrázek vybírat. Je to tím, že obrázky jsou ex-
Implementace extrakčního robota
54
trahovány automaticky. Extrakční robot automaticky extrahuje všechny obrázky, které se nacházejí v bloku aukční položky. 5.2.2
Automatická extrakce
Po vytvoření alespoň jediné extrakční šablony už může robot začít sám pracovat. Celý proces automatické extrakce funguje následovně. Činnost robota je spuštěna provedením skriptu cron.php. Tento skript je spouštěn pomocí softwarového démona Crona. Jakmile dojde k aktivaci skriptu, vytvoří se objekt třídy Scheduler, který se stará o plánování práce robota. Pokud bude v databázi nalezena jedna nebo více neprovedených akcí, provede se ta akce, která má nejvyšší prioritu a je nejstarší. Po provedení akce dojde k jejímu označení za provedenou nebo dojde ke smazání. Záleží na tom, zda se stejná akce bude někdy v budoucnu provádět znovu. Po vytvoření extrakční šablony je však tabulka akcí prázdná, proto si musí plánovač nějakou vytvořit. Vytváření nových akcí funguje jednoduše. Pokud není v databázi žádná akce, plánovač vytvoří pro každou extrakční šablonu jednu akci typu AddLinks. Jak už název této akce může napovědět, po jejím provedení dojde k extrakci všech odkazů z webové stránky, které vedou na aukce. Z těchto odkazů jsou vytvořeny akce typu Extract, pouze pro ty odkazy, které se ještě v databázi nenacházejí. Během extrakčního procesu kromě vlastní extrakce dochází i k automatické extrakci a standardizaci cen, měn a data aukce. Jak už bylo zmíněno dříve, extrakční robot nedokáže poznat, kde se tyto údaje na stránce nachází. Určování pozic jednotlivých údajů na webové stránce provádí administrátor při tvorbě extrakční šablony. Pomocí kurzoru myši administrátor označuje jednotlivé bloky stránky a podle typu pole je následně použit správný algoritmus pro extrakci a standardizaci. To znamená, že pro pole datum aukce bude použit algoritmus extrakce a standardizace data. Pro pole s počáteční nebo konečnou cenou budou použity algoritmy dva. První algoritmus se bude z bloku snažit extrahovat a standardizovat cenu a druhý algoritmus měnu. Všechny algoritmy pro standardizace údajů fungují na principu regulárních výrazů. Nejjednodušší je algoritmus pro standardizaci ceny. Algoritmus využívá znalosti o aukčních příhozech, kdy se vždy draží v celých korunách (eurech, dolarech, …). Drobnější částky se zde nepoužívají. Díky tomu nemusí algoritmus umět rozpoznávat desetinná čísla. Algoritmus pak pracuje na následujícím principu. Nejprve jsou z řetězce odstraněny všechny bílé znaky. Poté dojde k odstranění znaku uvozovky, který je typický pro některé zápisy měn. Nakonec se použije regulární výraz pro extrakci první nepřerušené posloupnosti číslic nezačínající nulou. Pokud by takový řetězec nebyl nalezen, vrací funkce nulu. To může být užitečné pro určení položek aukce, které nebyly vydraženy. Složitějším algoritmem je standardizace měn. Tento algoritmus využívá tabulky světových měn podle standardu ISO 4217 [32] a jednopísmenných symbolů pro označení známých měn [33]. Princip fungování je podobný jako u předchozího algoritmu. Rozdíl je pouze v použití regulárního výrazu, který hledá, zda se před nebo za cenou nachází jeden ze symbolů měn. Pokud dojde
Implementace extrakčního robota
55
k nalezení takového symbolu, dojde k přerušení hledání dalších a k vrácení měny na výstup algoritmu. Nejsložitější z algoritmů slouží k extrakci a standardizaci dat z textového řetězce. Ten využívá PHP funkci strtotime, která umožňuje převést datum z textového řetězce ve známém formátu do zvoleného formátu. Nebylo by jednoduché a univerzálně použitelné snažit se zjistit formát data v řetězci. Proto je lepší vytvořit si formát vlastní, který může být převeden do formátu typu MySQL DATE (YYYY-MM-DD) [34]. Jelikož funkce strtotime podporuje pouze anglické názvy měsíců, musí být nejprve převedeny české názvy měsíců na anglické. Poté dochází k hledání jednotlivých elementů data za pomoci regulárních výrazů. Nejjednodušší formát má rok, protože stačí hledat čtyřčíselnou kombinaci začínající číslem dva. Formát dne v měsíci obsahuje čísla 1 až 31. Nejhorší je to s hledáním měsíce, protože může být zapsán jak číselně, tak slovně. Pro číselné hledání se používají čísla 1 až 12 a pro slovní hledání se používá seznam názvů anglických měsíců. Jakmile jsou nalezeny všechny části data, je už jednoduché vytvořit vlastní formát data a ten převést. Během extrakce jsou postupně extrahovány všechny odkazy ze stránky. Z těchto odkazů jsou pomocí Bayesova filtru vybrány pouze ty odkazy, které vedou na aukce. Robot poté postupně prochází všechny takto získané odkazy. Proces končí, když už nezbývá žádný neextrahovaný odkaz. Poté dojde k uložení všech extrahovaných výsledků do databáze pomocí třídy DB případně jiné třídy, která implementuje rozhraní IDatabase.
Implementace vyhledávače
56
6 Implementace vyhledávače Implementace vyhledávacího nástroje byla provedena v Nette Frameworku [21]. Jelikož tento framework používá pro vývoj MVC architekturu, jsou i jednotlivé třídy vyhledávače rozděleny do několika skupin. Jedná se o model, presenter a komponenty. Zjednodušeně lze popsat funkci jednotlivých skupin tříd následujícím způsobem. Třídy modelu představují datový a funkční základ aplikace. Třídy presenteru slouží k zpracování akcí uživatelů a vykreslení šablon. Nakonec třídy komponent slouží k definování logických komponent, které je možné opakovaně používat v celé aplikaci.
6.1 Popis tříd Jelikož byl celkový diagram tříd představen už dříve, budou v této části podrobněji rozebrány nejdůležitější třídy vyhledávače. 6.1.1
Třída Repository
Jednou z nejdůležitějších tříd, která je součástí modelu, je třída Repository. Tato třída představuje základní repositář, který je předkem všech ostatních repositářů v aplikaci. Poskytuje tedy ostatním třídám přístup k objektu Connection, který představuje připojení k databázi. Asi nejdůležitější metoda třídy Repository je getTable. Tato metoda umožní všem potomkům přistupovat k databázové tabulce na základě části názvu před textem Repository. Z toho plyne, že tato metoda ve třídě UserRepository umožní pracovat s tabulkou User nebo ve třídě ItemRepository umožní pracovat s tabulkou Item.
Obr. 29
Třída Repository
6.1.2
Třída UserRepository
Třída UserRepository slouží pro práci s uživatelskými účty vyhledávače. Umožňuje například vyhledávat uživatele, získávat seznamy všech uživatelů, vytvářet nové uživatelské účty prostřednictvím metody createUser, měnit a resetovat hesla nebo měnit a přidávat e-mail k jednotlivým uživatelským účtům. Resetování hesla lze provést pomocí metody resetPassword a slouží pro změnu hesla
Implementace vyhledávače
57
uživatele na nové, které bylo vygenerováno prostřednictvím metody generatePassword. Toto heslo je následně odesláno prostřednictvím e-mailu uživateli, který si o reset hesla požádal.
Obr. 30
Třída UserRepository
6.1.3
Třída Authenticator
Jednou z tříd, která používá třídu UserRepository, je třída Authenticator. Tato třída slouží k přihlašování uživatelů do aplikace. Pro přihlášení se zde používá metoda authenticate, která jako parametr přebírá přihlašovací údaje uživatele. Pokud uživatel tyto údaje vloží správně, dojde k vrácení naplněného objektu Identity, který obsahuje veškeré informace o uživateli. Třída Authenticator obsahuje další dvě metody. Metoda calculateHashOld slouží pro výpočet hashe hesla. Metoda getIdentity slouží k získání nové identity uživatele na základě jeho identifikátoru. To se může hodit, když uživatel změní některý údaj ve svém profilu a je potřeba získat aktuální verzi objektu Identity.
Obr. 31
Třída Authenticator
6.1.4
Třída TokenRepository
Vyhledávací část aplikace neumožňuje uživatelům volnou registraci a registrace je možná pouze prostřednictvím odkazu s pozvánkou. Pro správu tokenů (klíčů) v pozvánkách slouží třída TokenRepository. Tato třída umožňuje vygenerovat nový token pomocí metody generateToken, zkontrolovat platnost tokenu pomocí metody tokenExists nebo odstranit z databáze token, který byl použit pomocí metody removeToken.
Implementace vyhledávače
Obr. 32
Třída TokenRepository
6.1.5
Třída SearchSettings
58
Jelikož aplikace umožňuje v aukčních výsledcích vyhledávat, je potřeba použít nějaký elegantní způsob, jakým budou předávána uživatelská nastavení pro vyhledávání. Tímto způsobem je použití třídy SearchSettings, která představuje neměnitelnou přepravku na data. Nastavení hledání uživatele je do této třídy předáno jako klíčové pole v definovaném tvaru. V konstruktoru třídy dojde ke kontrole správnosti tvaru vkládaného pole. Pokud by pole ve správném tvaru nebylo, došlo by k vyhození výjimky. Po naplnění uchovává třída SearchSettings mnoho různých informací o aktuálním hledání uživatele (např. hledaná položka, období, maximální počet výsledků, způsob třídění výsledků a další).
Implementace vyhledávače
Obr. 33
Třída SearchSettings
6.1.6
Třída ItemRepository
59
Jednou z nejdůležitějších tříd v celém vyhledávači je třída ItemRepository. Tato třída umožňuje jednoduše vyhledávat v extrahovaných aukčních položkách. K tomuto účelu slouží metoda search, která jako parametr přebírá objekt SearchSettings. Tato metoda dále používá další metody, které dohromady sestaví finální SQL dotaz. Jednou ze zajímavých metod je getExclude, která vytvoří část SQL dotazu pro vyloučení hledání určitých slov. Jedná se o ta slova, před kterými se nachází znak minus. Třída ItemRepository dále umožňuje práci s uživatelovými oblíbenými položkami. Jedná se o jejich přidávání a odebírání prostřednictvím metod addToFavorite a removeToFavorite. Takto přidané položky pak může uživatel nalézt na seznamu svých oblíbených položek, který je vytvořen pomocí metody getFavoritedItems.
Implementace vyhledávače
Obr. 34
Třída ItemRepository
6.1.7
Třída SearchHistoryRepository
60
Třída SearchHistoryRepository slouží k ukládání jednotlivých hledání uživatelů prostřednictvím aplikace. K tomuto účelu slouží metoda save, která přebírá objekt SearchSettings a identifikátor uživatele, který hledání provedl. K takto získaným údajům má přístup pouze administrátor aplikace a může je využít k následným analýzám.
Obr. 35
Třída SearchHistoryRepository
6.1.8
Třída SearchFormControl
První z komponent vyhledávače je třída SearchFormControl. Slouží k vytvoření vyhledávacího formuláře ve verzi pro neregistrované nebo registrované uživatele. Ke zvolení, jaký typ formuláře má třída vytvořit, slouží parametr premium. Pokud je parametr premium roven pravdě, vytvoří se formulář pro registrované uživatele, jinak se vytvoří formulář pro neregistrované uživatele. Výhodou komponent je jejich možná znovu použitelnost v rámci celé aplikace a nastavení vzhledu stránky prostřednictvím vlastní šablony. Třída komponenty SearchFormControl má dvě různé šablony. Každá slouží pro jiný typ formuláře. Důležitá je metoda render, kterou musí mít každá třída komponenty. Tato metoda se stará o připojení a vykreslení šablony komponenty.
Implementace vyhledávače
Obr. 36
Třída SearchFormControl
6.1.9
Třída SearchResultControl
61
Stejně jako předchozí třída představuje třída SearchResultControl komponentu. Tato komponenta slouží k výpisu všech položek, které jsou vloženy do konstruktoru třídy jako pole items. Komponenta umí na základě parametru premium vykreslit dva typy výpisů. Stejně jako v předchozí třídě slouží pro neregistrované a registrované uživatele. Dále třída obsahuje metody začínající textem handle, které slouží pro zpracování signálů komponenty. V tomto případě se používají pro přidávání a odebírání oblíbených položek uživatele.
Obr. 37
Třída SearchResultControl
6.1.10
Třída VisualPaginatorControl
Aby bylo možné výsledné výstupy jednoduše stránkovat, používá aplikace třídu komponenty VisualPaginatorControl. Autorem této komponenty je David Grudl [35]. Třída slouží k vykreslení číselné navigace u dlouhých seznamů. Uživatelé poté mohou pomocí kliknutí na určité číslo okamžitě přejít na danou stránku. Výhodou této třídy je, že automaticky vygeneruje správný počet odkazů v závislosti na celkovém počtu stránek. Zároveň si poradí i s velkým množstvím stránek, kdy dojde ke skrytí určitých odkazů, v závislosti na aktuální stránce.
Implementace vyhledávače
Obr. 38
Třída VisualPaginatorControl
6.1.11
Třída HomepagePresenter
62
Pro vykreslování jednotlivých stránek se používají třídy patřící do skupiny presenterů. Tyto třídy používají stejně jako komponenty vlastní šablony, na základě kterých je definováno, jak má vypadat vzhled výsledné stránky. Každá presenter třída prochází mnoha různými fázemi (životními cykly), během kterých dochází k volání korespondujících metod. Příkladem je metoda startup, která se provádí jako první a dochází zde většinou ke kontrole autorizace a k následnému připojení tříd modelu. Dalším důležitým typem metod jsou metody začínající textem render. Tyto metody jsou volány pro vykreslení šablony presenteru. Třída, která obsluhuje úvodní stranu aplikace, je HomepagePresenter. Tato třída využívá komponenty SearchForm a SearchResult pro základní vyhledávání aukční položek. Pro vytvoření těchto komponent se využívají metody začínající textem createComponent. Takto vytvořené komponenty je pak možné ihned používat v šabloně třídy.
Obr. 39
Třída HomepagePresenter
6.1.12
Třída RegisterPresenter
Aby se mohl uživatel dostat k pokročilým funkcím vyhledávače, musí se nejprve zaregistrovat. Registrace do aplikace je však umožněna pouze na základě odkazu s pozvánkou. Proto dochází v metodě startup ke kontrole platnosti vložené pozvánky. Následně se vytvoří komponenta pro registrační formulář, pomocí něhož může uživatel dokončit svou registraci.
Implementace vyhledávače
Obr. 40
Třída RegisterPresenter
6.1.13
Třída SignPresenter
63
Po registraci se uživatel může do aplikace přihlásit pomocí přihlašovacího formuláře. O vytvoření a zpracování tohoto formuláře se stará třída SignPresenter. Zároveň se stará o vykreslení a zpracování formuláře pro resetování hesla uživatele. Uživatel si po vložení svého uživatelského jména a e-mailové adresy může nechat resetovat své zapomenuté heslo, které je následně odesláno na jeho emailovou adresu.
Obr. 41
Třída SignPresenter
6.1.14
Třída PremiumPresenter
Po přihlášení se uživatel dostane na úvodní stranu pro přihlášené uživatele. Tato strana je obsluhována pomocí třídy PremiumPresenter a uživateli umožňuje používat pokročilé vyhledávání aukčních položek. Oproti základní verzi zde není omezen maximální počet výsledků na deset. Zároveň se zde vyskytují různá nastavení pro filtrování výsledků. Jedná se o možnost vyhledávání pouze položek s obrázky, vyhledávání bez neprodaných položek nebo vyhledávání pouze na určitých aukcích. Dále zde může uživatel použít různé třídění nalezených výsledků. Zde se jedná o třídění od nejlevnější nebo od nejdráže prodané položky a třídění od nejnovější nebo od nejstarší aukce.
Implementace vyhledávače
Obr. 42
Třída PremiumPresenter
6.1.15
Třída ListingPresenter
64
Přihlášení uživatelé nemusí využívat pouze hledání, aby našli položky, které hledají. Extrahované aukce mohou procházet jako katalogy. K vygenerování všech katalogů slouží třída ListingPresenter. Tato třída umí zobrazovat dva typy stránek. Prvním typem je seznam všech extrahovaných aukcí, ze kterých si může uživatel vybrat určitou aukci k prohlížení. Po kliknutí na určitý odkaz aukce dojde k zavolání metody renderAuction, která vytvoří druhý typ stránky. Jedná se o tabulkový seznam všech položek dané aukce. Pro rozdělení všech položek na stránky se používá komponenta VisualPaginatorControl.
Obr. 43
Třída ListingPresenter
6.1.16
Třída ItemPresenter
Aplikace pro každou nalezenou položku generuje odkaz, který ji jednoznačně identifikuje. Po kliknutí na tento odkaz je uživatel přesměrován na stránku, kde se zobrazí veškeré informace o dané položce. Pro generování těchto stránek slouží třída ItemPresenter. Odkazy fungují pro registrované i neregistrované uživatele, proto je možné poslat je e-mailem kamarádovi.
Implementace vyhledávače
Obr. 44
Třída ItemPresenter
6.1.17
Třída FavoritePresenter
65
Každá položka umožňuje přidání na seznam oblíbených položek uživatele. K zobrazení seznamu těchto položek slouží třída FavoritePresenter. Zde jsou všechny oblíbené položky uživatele zobrazeny na jedné stránce. Uživatel tedy nemusí hledat stejné položky stále dokola.
Obr. 45
Třída FavoritePresenter
6.1.18
Třída SettingsPresenter
Důležitou funkcí v aplikaci je nastavení uživatelského účtu. To je umožněno prostřednictvím třídy SettingsPresenter, která umožňuje změnit heslo nebo změnit e-mail uživatele. Třída SettingsPresenter proto umí zobrazovat několik různých typů formulářů, pomocí nichž uživatel změnu provádí. Pro změnu hesla je vygenerován formulář pomocí metody createComponentChangePasswordForm, kde je uživatel požádán o zadání starého a dvakrát nového hesla. Pokud vše proběhne v pořádku, je heslo uživatele změněno. Obdobně slouží metoda pro generování formuláře pro změnu e-mailové adresy. Zde uživatel musí vložit své heslo a dvakrát svůj nový e-mail. Po provedení jakékoliv změny dojde k aktualizaci objektu Identity, aby následně mohly být zobrazeny správné údaje.
Implementace vyhledávače
Obr. 46
Třída SettingsPresenter
6.1.19
Třída AdminPresenter
66
Pokud se do aplikace vyhledávače přihlásí někdo s administrátorskými právy, bude mít v menu dostupný odkaz pro zobrazení administrátorského rozhraní. O vykreslení a obsluhu tohoto rozhraní se stará třída AdminPresenter. V tomto rozhraní lze nalézt seznam všech zaregistrovaných uživatelů a seznam všech aktivních pozvánek pro registraci do aplikace. Administrátor má možnost vygenerovat novou pozvánku nebo pozvánku smazat.
Obr. 47
Třída AdminPresenter
6.2 Popis funkce vyhledávače Po spuštění aplikace se uživatel dostane na úvodní stranu (viz Obr. 48). Tato strana umožňuje funkci vyhledávání, která je jako jediná dostupná i neregistrovaným uživatelům. Vyhledávání se provádí pomocí dvou vyhledávacích polí, kdy první pole vyhledává v popisu a druhé v období aukční položky. Tento způsob vyhledávání byl použit, protože stejný text v popisu položky a rozdílné období vede k diametrálně rozdílným výsledkům. Například při vy-
Implementace vyhledávače
67
hledávání jedné koruny může být v závislosti na zvoleném období nalezena mince z běžného kovu, stříbrná mince, zlatá mince nebo papírová bankovka. Vyhledávání bez přihlášení je značně omezené, protože neobsahuje žádné možnosti filtrování výsledků a zároveň je maximální počet výsledků omezen na deset položek. Pro základní hledání to stačí, pokud chce uživatel využít vyššího uživatelského komfortu, musí se do aplikace zaregistrovat.
Obr. 48
Vyhledávač – výřez úvodní obrazovky
Vzhled aplikace má jednotný styl, kde se menu nachází v horní liště aplikace. Nepřihlášený uživatel zde může vidět několik ikonek, které slouží pro zobrazení přihlašovací stránky a pro zobrazení stránky s nápovědou. U každého formulářového pole se nachází ikonka s malým otazníkem. Ta slouží k zobrazení plovoucího pole s kontextovou nápovědou, která se zobrazí, pouze pokud je kurzor myši umístěn nad touto ikonkou. 6.2.1
Registrace a přihlášení do aplikace
Aby mohl uživatel používat pokročilé funkce aplikace, musí se do aplikace zaregistrovat. Registrace však není dostupná pro každého, používá se zde systém registrace pomocí tzv. pozvánek. Pozvánkou se rozumí webový odkaz ve speciálním tvaru, kdy je po jeho navštívení uživateli zobrazena webová stránka umožňující vytvoření nového uživatelského účtu. Před tímto zobrazením musí dojít ke kontrole existence a platnosti pozvánky, aby nemohlo dojít k opakovanému použití jedné pozvánky. Pro registraci stačí uživateli vyplnit do formuláře své uživatelské jméno, heslo a e-mailovou adresu. Pokud uživatel vyplní vše správně, je automaticky přihlášen. Pro opakované přihlášení se používá přihlašovací formulář, který je dostupný pod první ikonkou lišty aplikace (viz Obr. 49). Tento formulář, kromě standardního přihlášení pomocí uživatelského jména a hesla, nabízí i možnost resetování hesla. Možnosti resetovat heslo může využít každý registrovaný uživatel, který svoje heslo zapomněl. Při procesu rese-
Implementace vyhledávače
68
tu hesla dojde k vygenerování nového hesla, které je odesláno na e-mailovou adresu uživatele.
Obr. 49
Vyhledávač – přihlašovací a resetovací formulář
V aplikaci se proces resetování hesla provádí pomocí kliknutí na odkaz s textem „Zapomněl jsem heslo“. Poté je uživatel přesměrován na formulář, kde je vyzván pro vložení svého uživatelského jména a e-mailu. Pokud je kombinace platná, dojde k vygenerování a odeslání nového hesla na e-mailovou adresu uživatele. 6.2.2
Prémiová část aplikace
Pokud je uživatel v aplikaci registrován a přihlásí se, dostane se do prémiové části aplikace (viz Obr. 50). Úvodní strana prémiové části aplikace nabízí, podobně jako úvodní strana aplikace, vyhledávání v aukčních výsledcích. Rozdíl je pouze v množství doplňkových funkcí, které může uživatel používat. Tyto funkce umožňují lépe filtrovat hledané položky. Konkrétně se jedná o výběr prohledávané aukce, způsob řazení výsledků nebo možnost výběru, zda se mají vyhledávat neprodané položky nebo položky bez obrázků. Prémiová část aplikace také obsahuje možnost zvolit si maximální počet výsledků vyhledávání. Uživatel zde není omezen pouze na limit deseti výsledků, který je na pevno nastaven v neregistrované části aplikace. Menu prémiové části aplikace obsahuje několik ikonek, které je možné vidět na Obr. 50. Zleva doprava je jejich význam následující – nastavení účtu uživatele, odhlášení z prémiové části, vyhledávání, prohlížení aukcí, zobrazení
Implementace vyhledávače
69
oblíbených položek uživatele, zobrazení nápovědy a přístup do administrátorského rozhraní. Poslední ikonka je dostupná pouze pro administrátory aplikace, ostatním uživatelům se nezobrazuje.
Obr. 50
Vyhledávač – prémiová část (se zobrazenou kontextovou nápovědou)
Jelikož je aplikace velmi obsáhlá, v následující části budou popsány pouze nejdůležitější procesy v aplikaci. Procesy jako zobrazení nápovědy nebo nastavení účtu uživatele nebudou více rozebírány. 6.2.3
Vyhledávání aukčních položek
Hlavním účelem aplikace je umožnit uživatelům vyhledávat v extrahovaných datech aukčních výsledků. Pokud uživatel vloží název hledané položky do formuláře, jsou uživateli vráceny všechny aukční položky, které obsahují uživatelem zadaný text. Uživatel může následně upravit text dotazu, aby se dostal k relevantnějším výsledkům. Z nalezených výsledků se uživatel může dozvědět mnoho důležitých informací, které se týkají ceny a četnosti výskytu hledané položky. Nalezené výsledky jsou uživateli zobrazeny ve formě tabulky, kde každý řádek obsahuje jednu relevantní aukční položku. Každá položka obsahuje popis, období, vyvolávací a konečnou cenu, datum a jméno aukce, na které byla položka dražena, a někdy i aukční fotografie. Při vyhledávání uživatel není omezen na prostý text. Může využívat několika speciálních znaků, které slouží k zpřesnění výsledků vyhledávání. Jedná se o znak uvozovek a znak minus. Znak uvozovek slouží pro vyhledání přesné fráze uzavřením dané fráze do uvozovek. To se může hodit při hledání všech položek obsahující text 10 korun. Pokud uživatel vloží tento text do vyhledávače bez uvozovek, dojde k nahrazení všech mezer za znak procenta. Bude tedy vyhledán výraz %10%korun%. Tomuto výrazu odpovídají nejenom všechny položky obsahující text 10 korun, ale také 100 korun, 1000 korun nebo třeba 10 medvědů s cibulkou má na hlavě korunu. Při uzavření hledaného výrazu do uvozovek
Implementace vyhledávače
70
nebudou nahrazeny mezery nacházející se v uvozovkách. Bude tedy hledán výraz %10 korun%, který mnohem pravděpodobněji nalezne to, co uživatel hledá. Znak minus se používá pro definici slov, která se v textu nalezených položek nesmí vyskytnout. Příklad použití ukazuje Obr. 51, kde je hledán výraz „10 koruna“ 1933 -soubor. Při použití tohoto výrazu dojde k vyhledání všech aukčních položek, které odpovídají výrazu %10 koruna%1933% a zároveň neobsahují text soubor. Pro definici více slov, která se ve výsledku vyhledávání nemají objevit, se před každý slovem použije znak minus.
Obr. 51
Vyhledávání aukčních položek
6.2.4
Prohlížení aukčních výsledků
Kromě vyhledávání aplikace umožňuje i prohlížení extrahovaných aukčních výsledků. K této funkci se uživatelé dostanou po kliknutí na čtvrtou ikonku menu (otevřená kniha). Stránka, která umožňuje prohlížení aukčních výsledků, je celá generována automaticky, a to na základě extrahovaných aukcí. Vše je přehledně rozděleno podle názvu aukce a jednotlivé aukce jsou řazeny podle data konání. Díky tomu může uživatel velmi rychle nalézt aukci, kterou hledá. Reálnou automaticky vygenerovanou stránku je možné vidět na Obr. 52. U každého termínu aukce se nachází ikonka lupy, která slouží pro přesměrování na detail zvolené aukce. Tato stránka obsahuje seznam všech aukčních položek, které byly na zvolené aukci draženy. Výpis položek je stejně jako při vyhledávání tabulkový, kde každý řádek obsahuje jednu aukční položku. Pro všechny tyto výpisy se používá třída komponenty SearchResultControl, která byla popsána dříve. Jelikož aukční výsledky běžně obsahují stovky nebo i tisíce položek, je nutné toto množství nějak stránkovat, aby nedocházelo k pomalému načítání stránky nebo k dlouhému scrolování uživatele. Z tohoto důvodu používá aplikace třídu komponenty VisualPaginatorContol.
Implementace vyhledávače
Obr. 52
71
Prohlížení aukčních položek – seznam aukcí
Po vložení VisualPaginatorControl do šablony stránky dojde k vykreslení vizuální komponenty, která umožňuje přesun mezi jednotlivými stránkami aukce. Tato komponenta aplikaci předává rozsah položek, které mají být na dané stránce zobrazeny. Programátor se už nemusí starat o přepočítávání jednotlivých rozsahů položek k zobrazení.
Obr. 53
Prohlížení aukčních položek – detail aukce
6.2.5
Oblíbené položky
Aplikace také umožňuje přidávání položek, které uživatele nějak zaujaly, na seznam oblíbených aukčních položek. Všechny oblíbené položky jsou poté dostupné na jednom místě aplikace (ikonka hvězdička). Přidávání na tento seznam
Implementace vyhledávače
72
může být užitečné pro ukládání položek, které by jinak uživatel musel zdlouhavě znovu hledat. Ikonka pro přidání položky mezi oblíbené se nachází na začátku každého řádku aukční položky. Pouze na základě obrázku ikonky je uživatel schopen okamžitě poznat, zda se položka nachází na jeho seznamu. Pokud je ikonka bílá hvězda, položka se na seznamu oblíbených položek nenachází. Pouze pokud je ikonka žlutá hvězda, uživatel má jistotu, že se položka nachází mezi jeho oblíbenými položkami.
Obr. 54
Přidávání do oblíbených položek
Po implementační stránce funguje celý proces přidávání a odebírání pomocí technologie AJAX. Díky tomu je možné položku přidat nebo odebrat bez toho, aby bylo potřeba znovu načíst webovou stránku. Pokud uživatel klikne na bílou hvězdu, dojde k odeslání ajaxového požadavku na server. Zde dojde k přidání položky do tabulky Favorite. Následně je zpět odeslán výsledek operace a změněn stav ikonky na žlutou hvězdu. Při opětovném kliknutí dojde k podobné akci jako v předchozím případě s tím rozdílem, že je položka z tabulky oblíbených položek odebrána. V aplikaci je vyřešen problém s opakovaným klikáním před dokončením operace, kdy běžně dochází k odeslání více požadavků. Po kliknutí je ikonka hvězdy změněna na běžící tečku, která neumožní další kliknutí a tedy ani odeslání požadavku.
Testování
73
7 Testování Testování aplikace bylo zaměřeno převážně na proces tvorby extrakční šablony a následnou kontrolu správnosti extrahovaných dat. Proces tvorby extrakční šablony byl testován na následujících webových stránkách: • http://aurea.cz/index.php?main=katalog&lang=cz, • http://www.numismatika.cz, • http://www.sixbid.com. Tato množina testovaných webových stránek byla zvolena záměrně, protože reprezentuje nejdůležitější české i zahraniční sběratelské aukce. Zároveň jsou zde zastoupeny stránky s různým rozvržením aukčních položek. S problémem extrakce aukčních položek ze stránek s různým rozvržením se extrakční robot musel být schopen vypořádat už během tvorby extrakční šablony. Proces testování probíhal v několika krocích. Prvním krokem bylo vytvoření extrakční šablony. Nejprve proběhlo učení Bayesova filtru. Tento filtr při dostatečném množství trénovacích příkladů fungoval vždy správně a extrakční robot byl schopen poznat, které odkazy vedou na aukční položky a které ne. Následně probíhala manuální tvorba extrakční šablony. Zde byla věnována pozornost schopnosti automatické detekce aukčních položek při různých rozvrženích stránek. Aplikace si dokázala poradit s jednosloupcovým i dvousloupcovým rozvržením aukčních položek, který se na těchto webových stránkách používá (viz Obr. 55).
Obr. 55
Tvorba šablony pro Sixbid.com – dvousloupcové rozvržení
Extrakční robot neměl potíže ani s následnou extrakcí dat z webů a podařilo se mu správně extrahovat datum aukce, ceny i měny (viz Obr. 56). Během testová-
Testování
74
ní byla zjištěna pouze jediná omezující podmínka. Pokud odkaz na stránku s aukčními výsledky vede na jiný web, robot nemůže výsledky z této stránky extrahovat. To je způsobeno rozdílným objektovým modelem dokumentu oproti naučené šabloně, kterému se šablona extrakce nedokáže přizpůsobit. S tím však bylo počítáno už při tvorbě extrakčního robota a algoritmus Bayesova filtru tyto odkazy efektivně filtruje. Druhou nevýhodou extrakčního robota je, že nedokáže extrahovat aukční výsledky ze stránek, kde jsou data načítána prostřednictvím technologie AJAX. Pro funkční extrakci dat z takovýchto stránek by extrakční robot musel umět provádět skripty, což není triviální problém. S tímto však nebylo při návrhu počítáno, a proto robot všechny skripty ze stránek odstraňuje. Díky tomu dokáže robot vytvořit šablony pro stránky, které mají skriptem zamezeno načtení v rámu.
Obr. 56
Sixbid.com – test správnosti extrakce
Diskuze
75
8 Diskuze Zadání práce se podařilo splnit, což bylo potvrzeno testováním na reálných webových stránkách. Aplikace po vytvoření extrakčních šablon dokázala automaticky extrahovat veškeré dostupné aukční výsledky. Celkově bylo do testovací databáze extrahováno 46 aukcí s 33 921 aukčními položkami. Vynechány byly pouze ty aukce, kde byl obsah generován prostřednictvím JavaScriptu. S extrakcí stránek generovaných pomocí skriptu však nebylo počítáno. Vysoké úspěšnosti při extrakci dat z webových stránek bylo dosaženo pomocí několika technik, které byly využity během procesu extrakce. Konkrétně se jedná o: • automatické rozpoznávání odkazů pomocí Bayesova klasifikátoru, • automatická identifikace a extrakce datových záznamů z webových stránek, • automatická extrakce a standardizace dat, měn a cen, • plánování práce prostřednictvím třídy plánovače. Extrakční robot potřebuje automaticky rozpoznávat odkazy, které vedou na webové stránky obsahující aukční výsledky. K automatickému rozpoznávání odkazů byl použit Bayesův klasifikátor [4][8] umožňující učení pomocí technologie AJAX. Výběr a přeučení Bayesova klasifikátoru díky tomu může probíhat živě a administrátor aplikace může okamžitě vidět, zda už je klasifikátor správně naučen. Filtr odvozený z Bayesova klasifikátoru je nejefektivnějším a nejpoužívanějším nástrojem pro detekci spamu. Přesnost klasifikace tohoto filtru roste se zvyšujícím se množstvím trénovacích příkladů [9]. Z tohoto důvodu byl výběr Bayesova klasifikátoru pro klasifikaci odkazů nejvhodnějším řešením. Pro tvorbu extrakční šablony byl využit algoritmus identifikace a extrakce aukčních položek [10][12][13]. Během tvorby extrakční šablony uživatel používá kurzor myši pro výběr jednotlivých bloků webové stránky. Následně jsou pomocí skriptu generovány XPath dotazy, které jednoznačně identifikují určitý blok na webové stránce [11]. Díky použití techniky automatické identifikace datových záznamů není potřeba vybírat jednotlivé bloky stránky ručně. Stačí označit pouze jeden blok a jeho vnitřní prvky. Aplikace si už všechny ostatní sama dokáže vyhledat na základě shodnosti vnitřních struktur XPath dotazů všech bloků. Tato skutečnost dělá z extrakčního robota velmi efektivní nástroj, který se dokáže přizpůsobit mnoha různým rozvržením aukčních položek na webových stránkách. Zároveň je robot schopen extrahovat data z webových stránek, u kterých došlo k určité změně struktury stránek. Nesmí však dojít ke změně vnitřní struktury aukčních položek. Poté by už extrakční robot nedokázal jednotlivé položky identifikovat. Součástí procesu extrakce je i automatická extrakce a standardizace dat, měn a cen. Na základě uživatelského výběrů bloků extrakční robot pozná, v kterých částech stránky má provést extrakci a standardizaci daného údaje. Pro účel extrakce a standardizace údajů se osvědčily regulární výrazy. Nejsložitější je
Diskuze
76
extrakce a standardizace data aukce, které může být uloženo v mnoha různých formátech. Zde se kromě regulárních výrazů používá i PHP funkce strtotime, která dokáže převést řetězec v zadaném formátu do zvoleného formátu. K úplné automatizaci procesu extrakce bylo nutné použít jednoduchý plánovač, který řídí práci extrakčního robota. Vhodným řešením se ukázalo být použití jednoduché třídy, která generuje a žádá o zpracování akcí. Celkově bylo nutné použít dva typy akcí, kde první slouží k extrakci odkazů a druhá slouží pro extrakci dat ze zvoleného odkazu. Po úspěšném provedení akce dojde k jejímu smazání nebo označení za provedenou v závislosti na tom, zda má být v budoucnu provedena znovu nebo ne. Při návrhu bylo myšleno i na chyby ukládání do databáze. Ta podporuje transakční zpracování. Je tedy možné zaručit konzistenci dat v databázi. Použití transakční databáze sice znemožnilo vložení nekonzistentních dat, ale bohužel způsobilo problémy s nemožností použití fulltextového vyhledávání. Z tohoto důvodu aplikace pro vyhledávání používá pouze operátor LIKE, který má určitá omezení. Nejvýznamnější nevýhodou je nutnost vkládat hledaná slova v pořadí, ve kterém se běžně vyskytují v aukčních textech. Výraz pro hledání „10 korun“ a „korun 10“ tedy nemůže vrátit stejný výsledek. Při tvorbě bylo experimentováno s vyhledáváním, kde dochází k hledání všech možných posloupností zadaných slov. Z důvodu vysoké časové složitosti takto generovaných SQL dotazů při větším množství slov bylo od tohoto upuštěno.
Závěr
77
9 Závěr Cílem práce bylo analyzovat, navrhnout a implementovat aplikaci, která by uživatelům poskytla podporu pro rozhodování o nákupu nebo případném prodeji sběratelských předmětů na sálových aukcích aukčních společností. Podporou pro rozhodování bylo myšleno nabídnutí relevantních aukčních výsledků pro zadaný dotaz uživatele. Zároveň byl kladen důraz na jednoduchost ovládání aplikace a automatizaci procesu extrakce. Všechny tyto požadavky se podařilo úspěšně splnit. Výsledná aplikace uživatelům umožňuje dohledat cenu sběratelského předmětu na základě jeho popisu. Program pro vložený dotaz vrátí všechny relevantní položky, které byly na aukcích draženy. Na základě těchto informací poté uživatel může odhadnout výhodnost budoucích nákupů nebo prodejů sběratelských a investičních předmětů (mincí, medailí, vyznamenání, bankovek a dalších). Aplikace tedy svým uživatelům umožňuje jednodušeji a lépe dosáhnout zisku. Z tohoto důvodu je v praxi velmi dobře použitelná. Celá aplikace se skládá ze dvou částí, a to z extrakčního robota a vyhledávacího nástroje. Extrakční robot se stará o extrakci aukčních výsledků z proběhlých webových aukcí. Vyhledávací nástroj následně umožňuje v těchto extrahovaných datech vyhledávat, prohlížet seznamy aukcí a ukládat oblíbené položky. Činnost extrakčního robota se podařilo z velké části automatizovat. Uživatel musí vytvořit extrakční šablonu, poté už je činnost robota spouštěna pomocí softwarového démona Crona. Proces tvorby extrakční šablony nevyžaduje od uživatele žádné mimořádné znalosti. Uživatel nejprve provede učení Bayesova klasifikátoru výběrem relevantních a irelevantních odkazů. Následně vybere jeden blok s aukční položkou. Ostatní bloky jsou dohledány automaticky pomocí algoritmu extrakce datových záznamů [5][10][12][13]. Extrakční robot může poté automaticky plnit databázi extrahovanými daty. V naplněné databázi následně může vyhledávat vyhledávací část aplikace. Tato část registrovaným uživatelům umožňuje vyhledávat v aukčních výsledcích, prohlížet extrahované aukce a ukládat vybrané položky mezi oblíbené. Pro upřesnění vyhledávání může uživatel použít několik operátorů (hledání přesné fráze a odebrání slova z vyhledávání). Jelikož aplikace obrázky aukčních položek nestahuje a pouze na ně odkazuje, nejsou po odstranění ze zdrojového serveru ve vyhledávači dostupné. To je dáno nutností provozu na hostingu zdarma, kdy je diskový prostor omezený a obrázky by se sem nevešly. Pokud by aplikace běžela na placeném hostingu, nebyl by problém obrázky stahovat. Databáze aplikace nepodporuje fulltextové vyhledávání a musí být využíván operátor LIKE. To vede k nemožnosti nalezení položek, které mají v popisu prohozená hledaná slova. Je to způsobeno využitím tabulek typu InnoDB, které podporují transakční zpracování, ale nepodporují fulltextové vyhledávání. Problém bude možné jednoduše vyřešit v MySQL 5.6, kde tabulky InnoDB začnou podporovat fulltextové vyhledávání [36].
Literatura
78
10 Literatura [1]
HAVEL, J., ODEHNAL, A. Peníze do kapsy. 1. vyd. Praha: Albatros, 2004, 455 s. ISBN 80-000-1408-4.
[2]
YAHOO FINANCE. U.S. Rare Coin Market Roared in 2013, Reports Professional Numismatists Guild. [online]. [cit. 2014-02-02]. Dostupné z: http://finance.yahoo.com/news/u-rare-coin-market-roared130000408.html.
[3]
HERITAGE AUCTIONS. [online]. [cit. 2014-02-02]. Dostupné https://www.ha.com/c/register.zx?ic=join-header-121913-interior.
[4]
LIU, B. Web Data Mining : Exploring Hyperlinks, Contents, and Usage Data. 2nd edition. Heidelberg : Springer, 2011. 622 p. ISBN 978-3642194-597.
[5]
CHAKRABARTI, D. MEHTA, R. The Paths More Taken: Matching DOM Trees to Search Logs for Accurate Webpage Clustering. [online] 2010. Dostupné z: http://www.cs.cmu.edu/afs/cs.cmu.edu/Web/People/deepay/mywww/ papers/www10-wrappers.pdf.
[6]
MCSEARCH. The medieval & modern coin search engine [online]. [cit. 2014-02-03]. Dostupné z: http://www.mcsearch.info.
[7]
AUREA NUMISMATIKA. Mince, medaile, bankovky, vyznamenání [online]. [cit. 2014-02-03]. Dostupné z: http://aurea.cz.
[8]
HOLČÍK, J. Analýza a klasifikace dat. Vyd. 1. Akademické nakladatelství CERM, 2012, 111 s. ISBN 978-807-2047-932.
[9]
GFI WHITEPAPER. Why Bayesian filtering is the most effective anti-spam technology. [online]. 2011 [cit. 2014-05-02]. Dostupné z: http://www.gfi.com/whitepapers/why-bayesian-filtering.pdf.
z:
[10] BLANCO, L., DALVI, N., MACHANAVAJJHALA, A. Highly Efficient Algorithms for Structural Clustering of Large Websites. [online]. 2011 [cit. 2014-02-10]. Dostupné z: http://www.ra.ethz.ch/CDstore/www2011/proceedings/p437.pdf.
Literatura
79
[11] KOSEK, J. PHP a XML. Praha: Grada, 2009. 368 s. ISBN 978-80-2471116-4. [12] CRESCENZI, V., MERIALDO, P., MISSIER, P. Clustering Web pages based on their structure. [online]. 2004 [cit. 2014-02-10]. Dostupné z: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.158.8406&rep =rep1&type=pdf. [13] LIU, B., GROSSMAN, R., ZHAI, Y. Mining data records in web pages. [online]. 2003 [cit. 2014-02-10]. Dostupné z: http://www.cs.uic.edu/~liub/publications/kdd2003-dataRecord.pdf. [14] SCHMULLER, J. Myslíme v jazyku UML: knihovna programátora. Vyd. 1. Praha: Grada, 2001, 360 s. ISBN 80-247-0029-8. [15] BÖHMER, M. Návrhové vzory v PHP. Vyd. 1. Brno: Computer Press, 2012, 320 s. ISBN 978-80-251-3338-5. [16] MICROSOFT OFFICE. Visio Professional 2013. [online]. 2014 [cit. 2014-0224]. Dostupné z: http://office.microsoft.com/en-us/visio/. [17] ULLMAN, L. PHP a MySQL: Názorný průvodce tvorbou dynamických WWW stránek. Vyd. 1. Brno: Computer Press, 2004, 534 s. ISBN 80-2510063-4. [18] HOSTINGER. PHP a MySQL hosting zdarma. [online]. 2014 [cit. 2014-0212]. Dostupné z: http://www.hostinger.cz/. [19] ROOT.CZ. Přehled a vývoj PHP frameworků. [online]. 2008 [cit. 2014-0212]. Dostupné z: http://www.root.cz/clanky/prehled-a-vyvoj-phpframeworku/. [20] ZEND FRAMEWORK 2. The most popular framework for modern, highperforming PHP applications. [online]. 2014 [cit. 2014-02-12]. Dostupné z: http://framework.zend.com/. [21] NETTE. Nette framework. [online]. 2014 [cit. 2014-02-12]. Dostupné z: http://nette.org/cs/. [22] BÖHMER, M. Zend Framework: programujeme webové aplikace v PHP. Vyd. 1. Brno: Computer Press, 2010, 416 s. ISBN 978-80-251-2965-4.
Literatura
80
[23] JQUERY. Write less, do more. [online]. 2014 [cit. 2014-02-13]. Dostupné z: http://jquery.com/. [24] LACKO, Ľ. Ajax: hotová řešení. Vyd. 1. Brno: Computer Press, 2008, 269 s. ISBN 978-80-251-2108-5. [25] SHAH, S., SOYINKA, W. Administrace systému Linux: překlad čtvrtého vydání. Vyd. 1. Praha: Grada, 2007, 426 s. ISBN 978-80-247-1694-7. [26] UNIX MAN PAGEs. Crontab - tables for driving cron. [online]. 2007 [cit. 2014-02-14]. Dostupné z: http://unixhelp.ed.ac.uk/CGI/mancgi?crontab+5. [27] ORACLE. MySQL Workbench 6.0. [online]. 2014 [cit. 2014-03-04]. Dostupné z: http://www.mysql.com/products/workbench/. [28] GOYVAERTS, J., LEVITHAN, S. Regulární výrazy: kuchařka programátora. Vyd. 1. Brno: Computer Press, 2010, 381 s. ISBN 978-80-251-1935-8. [29] BERKA, P. Dobývání znalostí z databází. Vyd. 1. Praha: Academia, 2003, 366 s. ISBN 80-200-1062-9. [30] GOOGLE SUPPORT. Search operators. [online]. 2014 [cit. 2014-02-26]. Dostupné z: https://support.google.com/websearch/answer/136861?p=adv_operators &hl=en. [31] PHP.NET. PHP Data Objects [online]. [cit. 2014-03-26]. Dostupné z: http://www.php.net/manual/en/book.pdo.php. [32] ISO. Currency codes - ISO 4217. [online]. [cit. 2014-04-01]. Dostupné z: http://www.iso.org/iso/home/standards/currency_codes.htm. [33] XE. World Currency Symbols. [online]. [cit. 2014-04-01]. Dostupné z: http://www.xe.com/symbols.php. [34] MYSQL 5.1 REFERENCE MANUAL. The DATE, DATETIME, and TIMESTAMP Types. [online]. [cit. 2014-04-01]. Dostupné z: https://dev.mysql.com/doc/refman/5.1/en/datetime.html.
Literatura
81
[35] DOPLŇKY NETTE. VisualPaginator. [online]. 2011 [cit. 2014-04-03]. Dostupné z: http://addons.nette.org/cs/visualpaginator. [36] MYSQL 5.6. FULLTEXT Indexes [online]. 2014 [cit. 2014-04-17]. Dostupné z: http://dev.mysql.com/doc/refman/5.6/en/innodb-table-andindex.html#innodb-fulltext-index.
Přílohy
82
Přílohy
Přílohy
83
A Praktické použití Praktická ukázka použití programu bude ukazovat hledání orientační ceny zlatého dukátu českého krále Karla IV. Jedná se o velmi vzácnou minci, za kterou by se dal koupit osobní vůz. Pro hledání vydražených položek uživatel do formulářového pole s popiskem hledaná položka vloží text dukát. Pro odstranění nepůvodních a neoriginálních mincí z výsledků hledání je možné tyto výsledky z hledání odebrat přidáním textu -novoražba -replika. Aby aplikace nenašla dukátové mince všech panovníků, je nutné do formulářového pole s popiskem období vložit text karel IV. Nyní už stačí spustit vyhledávání. Výsledek hledávání byl z důvodu lepší čitelnosti rozdělen do následujících pěti obrázků.
Obr. 57
Praktická ukázka – hledání dukátu Karla IV. (první část)
Přílohy
84
Obr. 58
Praktická ukázka – hledání dukátu Karla IV. (druhá část)
Obr. 59
Praktická ukázka – hledání dukátu Karla IV. (třetí část)
Přílohy
85
Obr. 60
Praktická ukázka – hledání dukátu Karla IV. (čtvrtá část)
Obr. 61
Praktická ukázka – hledání dukátu Karla IV. (pátá část)
Na základě takto vrácených výsledků si může sběratel nebo investor udělat představu o ceně této mince. Je zde vidět, že mezi roky 2010 až 2014 bylo draženo na českých aukcích celkem pět dukátů Karla IV. Poslední se neprodal, u ostatních se cena pohybovala od 70 000 Kč za velmi špatně zachovalý kus až
Přílohy
86
k 500 000 Kč za velmi krásně zachovalý kus. Z výsledků lze vyčíst mnoho dalších informací ohledně místa prodeje, data prodeje, čísla dražené položky, popisu položky nebo vyvolávací ceny. U této mince nelze dopředu určit výslednou cenu, protože se naskýtá k prodeji velmi málo. Pro prezentaci funkčnosti aplikace je to však dostačující příklad.