Mendelova univerzita v Brně Provozně ekonomická fakulta
Systém pro automatizaci srovnávání produktů konkurence Bakalářská práce
Vedoucí práce: Ing. Ondřej Popelka, Ph.D.
Pavel Řezníček
Brno 2013
List zadání práce
Děkuji vedoucímu práce Ing. Ondřeji Popelkovi, Ph.D. za cenné rady, konstruktivní připomínky a čas, který mi při konzultacích věnoval. Také děkuji své rodině a nejbližším přátelům, kteří mě při tvorbě práce podporovali a dodávali mi inspiraci.
Prohlašuji, že zadanou bakalářskou práci jsem vypracoval samostatně pod vedením Ing. Ondřeje Popelky, Ph.D. a v seznamu literatury uvedl veškeré použité zdroje. V Brně dne 22. května 2013
__________________
Abstract Řezníček, P. System for automation of comparison of the competitive products. Bachelor thesis. Brno, 2013. The thesis describes the design and the implementation of the system ADETA. The system is intended for the administrators of the e-shops and it provides them an opportunity to monitor and compare products of the competitors. In the first part, there are the descriptions of actual possibilities of monitoring the competitors and there is also a comparison of the options, usable by the administrator of the e-shop. In the second part, there is an analysis of the new comparative system along with the description of the technologies, usable to solve the problems. The third part is dedicated to the implementation of the system and there are the descriptions of its parts. In the conclusion, there’s an assessment of the results and there are outlined some more steps for the expansion of the system. Keywords Monitoring of competitors, web application, products comparison, wget, DOM, XPath.
Abstrakt Řezníček, P. Systém pro automatizaci srovnání produktů konkurence. Bakalářská práce. Brno, 2013. Text práce popisuje návrh a implementaci systému ADETA, určeného správcům e-shopů, který umožňuje sledování a porovnávání produktů konkurence. V první části práce je popsán současných stav možností sledování konkurence a jsou zde porovnány jednotlivé správcem e-shopu využitelné varianty. V druhé části je rozebrán návrh nového srovnávacího systému spolu s popisem technologií využitelných k řešení daného problému. Třetí část práce je věnována implementaci systému a popisu jeho jednotlivých částí. V závěru je výsledek práce zhodnocen a jsou zde nastíněny některé další možné kroky pro rozšiřování systému. Klíčová slova Sledování konkurence, webová aplikace, porovnání produktů, wget, DOM, XPath.
Obsah
11
Obsah 1
2
Úvod a cíl práce 1.1
Úvod ......................................................................................................... 15
1.2
Cíl práce ................................................................................................... 15
Možnosti sledování konkurence
Srovnávací systémy .................................................................................. 17
2.2
Existující systémy pro hromadné srovnání ............................................. 19
2.2.1
Price checking .................................................................................. 19
2.2.2
Karsa Monitor ................................................................................. 20
Shrnutí .................................................................................................... 22
Návrh řešení
25
3.1
Uživatel systému ..................................................................................... 27
3.2
Relační datový model.............................................................................. 28
3.3
Stažení webu ........................................................................................... 32
3.3.1
cURL................................................................................................ 33
3.3.2
Wget ................................................................................................ 33
3.3.3
HTTrack Website Copier ................................................................ 34
3.3.4
Výběr nástroje ................................................................................. 34
3.4
Zpracování obsahu webu ........................................................................ 34
3.4.1
XML................................................................................................. 35
3.4.2
HTML DOM .................................................................................... 36
3.4.3
Výběr nejvhodnějšího nástroje ....................................................... 37
3.4.4
Vyčištění HTML kódu ..................................................................... 37
3.5 4
17
2.1
2.3 3
15
Definice atributů produktu ..................................................................... 38
Implementace
43
4.1
Použité technologie ................................................................................. 43
4.2
Stažení a zpracování webu ...................................................................... 44
4.2.1
Konfigurační parametry a spuštění Wget ....................................... 44
12
Obsah
4.2.2
Konfigurace Tidy .............................................................................45
4.2.3
Převod kódování stránek ................................................................ 46
4.2.4
Získání hodnoty elementu ............................................................... 47
4.2.5
Zpracování zrcadla webu ................................................................ 48
4.3
Uživatelské rozhraní ............................................................................... 49
4.3.1
Získání XPath cesty ......................................................................... 51
4.3.2
Dynamický formulář definice atributů produktu ...........................54
4.3.3
Ukazatel průběhu zpracování ..........................................................54
4.3.4
NiftyGrid ..........................................................................................56
4.4
Model pro řízení práv a přístupů ........................................................... 58
4.5
Instalace systému ....................................................................................59
5
Závěr
61
6
Literatura
63
A
Náhledy vybraných částí aplikace
66
Seznam obrázků
13
Seznam obrázků Obr. 1 Rozdělení trhu porovnávačů zboží v roce 2012 [25]
18
Obr. 2
Ukázka XML zdroje dat pro porovnávač zbozi.cz
19
Obr. 3
Ukázka XLS výstupu systému Price checking
20
Obr. 4
Standardní report z aplikace Karsa Monitor
22
Obr. 5
Sekvenční diagram použití systému
26
Obr. 6
ER diagram systému
29
Obr. 7
Příklad použití SAX rozhraní
36
Obr. 8
Diagram aktivit definice atributu
39
Obr. 9
Prototyp části aplikace k definici atributů produktu
41
Obr. 10
Prototyp rozložení prvků aplikace
50
Obr. 11
Sitemap webové aplikace
51
Obr. 12
Ukázka vybraných produktů stejného webu
53
Obr. 13
Ukázka formuláře pro přidávání atributů produktu
54
Obr. 14
Ukazatel průběhu zpracování
55
Obr. 15
Využití NiftyGrid pro práci s uživateli systému
56
Obr. 16
Využití NiftyGrid pro práci s firmami
57
Obr. 17
Ukázka části aplikace pro srovnávání produktů
66
Obr. 18
Ukázka části aplikace pro zrcadlení webu
67
14
Úvod a cíl práce
15
1 Úvod a cíl práce 1.1
Úvod
Internetový obchod je v dnešní době běžným způsobem jak nabízet a prodávat své produkty, ať už v podobě výrobků nebo služeb. Funkce internetového obchodu (e-shopu) jsou závislé na jeho poskytovateli a na implementaci pro zákazníka. Na českém trhu je široké spektrum poskytovatelů, jejichž nabídka se liší zejména v doprovodných službách, jako jsou SEO, webový hosting nebo napojení na účetní systém. Co už ale mnoho poskytovatelů nenabízí, je možnost porovnání zboží majitele e-shopu s konkurencí a to zejména porovnání cen produktů. Právě cena produktu je při rozhodování konečného zákazníka o koupi produktu jedním z hlavních kritérií, a proto by měl provozovatel e-shopu ceny na trhu sledovat a určitým způsobem se jim přizpůsobovat. Pro určité prodejce je důležité srovnání nejen cen, ale také například množství produktů na skladě a dalších položek jednotlivých produktů. Konkurenční boj existuje napříč všemi odvětvími a získat určitou výhodu nad ostatními je čím dál těžší. Majiteli internetového obchodu navíc zabere spoustu času průzkum konkurence a její srovnávání s vlastními produkty. S využitím vhodných nástrojů je možné tento proces srovnávání určitým způsobem zautomatizovat, díky čemuž lze dosáhnout úspory drahocenného času a s vhodnou strategií získat konkurenční výhodu na daném trhu. Prováděný monitoring cen konkurence není pouze o zlevňování svých produktů a dosahování lepšího postavení v cenových srovnávačích jako je například Heureka.cz, ale také o vyhledávání položek, kde si prodejce může dovolit zdražit a zvyšovat tím svůj hospodářský zisk.
1.2 Cíl práce Cílem této práce je vytvořit systém ADETA umožňující správcům e-shopů srovnávat své produkty s konkurencí se zaměřením nejen na srovnávání ceny, ale i dalších parametrů produktů. V práci nejdříve prozkoumám současné možnosti majitelů e-shopů v oblasti sledování produktů svých konkurenčních subjektů. Na základě informací získaných průzkumem zhodnotím dostupné možnosti sledování konkurence a popíši technologie využitelné k řešení této problematiky. Následně navrhnu nový systém, který bude sloužit k získávání libovolných uživatelem definovaných parametrů produktů konkurenčních subjektů pomocí analýzy HTML kódu webů konkurenčních e-shopů. Tento systém umožní snadné srovnání ceny a dalších parametrů vlastních produktů se zvolenou konkurencí. Navržený systém pomocí vhodných technologií implementuji formou webové aplikace a v práci rozeberu její hlavní části. V závěru práce zhodnotím, jaké přínosy vytvořená aplikace uživatelům poskytuje, v jakých ohledech se liší od existujících systémů, a nakonec stručně popíši další možné kroky při jejím rozšiřování.
Možnosti sledování konkurence
17
2 Možnosti sledování konkurence Internetové obchodování se postupem času stalo již běžnou součástí nákupních praktik spotřebitelů. Ze studie E-comerce 2012 [27] od společnosti Gemius vyplývá, že v roce 2012 na českém trhu existovalo přibližně 21 tisíc aktivních internetových obchodů, které jen v roce 2011 vygenerovaly obrat přibližně kolem 37 miliard Kč. Z průzkumu také vyplývá, že pro nákup zboží či služeb použilo internet celkem 64% obyvatelstva ČR (34% z nich nakupovalo více než jednou). Nejčastějšími uvedenými důvody, proč lidé využili obchodování přes internet, bylo ušetření času, možnost porovnávání cen, větší výběr zboží a nižší ceny než v kamenných obchodech. Oproti většině Evropy, kde je běžné platit kartou, používají čeští zákazníci raději platbu dobírkou a to z důvodu obavy ze zneužití své platební karty. Nakupované produkty si zákazníci vybírají v e-shopech, jež jsou zaměřeny vždy na určitou část trhu. V každém odvětví existuje několik e-shopů, které nabízejí stejné produkty a to, co spotřebitele ovlivňuje při rozhodování, kde si nakonec produkt koupí, je mimo jiné cena produktu. Způsobem, jak si udržet stávající zákazníky a pokusit se přilákat zákazníky nové, je poskytování vlastních produktů za nejnižší ceny na trhu. K tomu je potřeba provádět určitým způsobem průzkum stavu konkurence. Ruční průzkum, který by mohl představovat zjišťování cen konkurence, jejich zapisování a porovnávání s vlastními cenami, je zejména časově velice náročná záležitost. Pro ušetření času, ale i finančních prostředků spojených se mzdami pracovníků, kteří by průzkum vykonávali, nastává nutnost využít na řešení tohoto problému nějaký automatizovaný nástroj.
2.1 Srovnávací systémy Srovnávací systém je nástroj určený pro koncového zákazníka, který mu umožní porovnat parametry nakupovaného výrobku v různých konkurenčních e-shopech. Zákazník sleduje nejen cenu výrobku, ale také ostatní parametry jako je například doba dodání, počet výrobků skladem nebo dostupnost v prodejnách. Systémů umožňujících toto srovnání produktu je na internetu veliké množství. Uvádím výčet některých českých srovnávacích systémů, které jsou provozovány jako webové portály. Zboží.cz – http://www.zbozi.cz/ Heureka - http://www.heureka.cz/ Srovname.cz - http://www.srovname.cz/ Hyper zboží - http://www.hyperzbozi.cz/ Hledejceny.cz - http://www.hledejceny.cz/ Monitor.cz - http://www.monitor.cz/
18
Možnosti sledování konkurence
Nejlepší ceny - http://www.nejlepsiceny.cz/ SrovnaniCen.cz - http://www.srovnanicen.cz/ NejNákup.cz - http://www.nejnakup.cz/ Podle studie spojené s projektem Shoptet.cz si v roce 2012 český trh rozdělili srovnávače zboží zbozi.cz se 44% trhu a heureka.cz se 40% trhu. Zbylých 16% připadlo dalším menším systémům jako například srovnavame.cz nebo hyperzozi.cz. [27]
Obr. 1
Rozdělení trhu porovnávačů zboží v roce 2012 [25]
Účelem srovnávacích systémů, které o sledovaném produktu přehledně na jednom místě poskytují informace zejména o ceně produktu z různých e-schopů, je především ušetřit čas koncového zákazníka při koupi výrobku. Zákazník nemusí procházet nabídky jednotlivých e-shopů a systém mu umožní jednoduše stanovovat cenové stropy produktů, nebo řadit a filtrovat výsledky hledání, které vidí přehledně na jednom místě. Určitou nevýhodou je, že s využitím srovnávacího systému může zákazník najednou srovnávat vždy pouze jeden produkt. Toto srovnání se navíc provádí pouze pro produkty e-shopů, které jsou do systému registrovány a poskytly XML zdroj (feed)1 svého zboží, jehož ukázka je uvedena na obrázku 2. XML feed zboží se pomocí e-shopového rozhraní v určitých správcem definovaných intervalech Speciální datový soubor ve formátu XML (eXtensible Markup Language) s přesně definovanou strukturou, představující seznam všech produktů e-shopu, které jsou určeny ke srovnávání. 1
Možnosti sledování konkurence
19
nebo ručně aktualizuje. Hodnoty produktů jsou z něj následně systémem pravidelně získávány nejčastěji 1× za 24h.
Obr. 2
Ukázka XML zdroje dat pro porovnávač zbozi.cz
2.2 Existující systémy pro hromadné srovnání Na českém trhu se v současné době vyskytují dva nástroje, které umožňují automatizovaně srovnávat větší množství produktů s uživatelem definovanou částí konkurence. Prvním popisovaným nástrojem je Price checking, tím druhým je nástroj Karsa Monitor. 2.2.1
Price checking
Price checking je webová aplikace, která umožňuje porovnávání cen výrobků v e-shopech nejen českých, ale i slovenských a maďarských. Zaměřuje se převážně na bílé zboží (pračky, ledničky, myčky nádobí), TV a audiotechniku (televize, mp3/4 přehrávače, DVD technika, reproduktory), počítače (hardware, software), pneu a hračky. Aplikace sleduje přes 250 výrobců ve více než 200 e-shopech a další výrobce a e-shopy je možné za příplatek do aplikace přidat. [24] Pro porovnání cen výrobků musí uživatel nejdříve zadat vstupní údaje. Vstupním údajem může být název porovnávaného výrobku (např. HTC One V) nebo v souboru2 definovaný seznam výrobků, který se do aplikace importuje. Tento soubor potom aplikace zpracuje a doplní o údaje cen výrobků konkurenčních e-shopů, které si uživatel vybere z nabídky dostupných e-shopů. Ke spárování a porovnání odpovídajících produktů využívá aplikace heuristické algoritmy, které k sobě přiřazují výrobky s nejlepší dostatečnou shodou.
2
Soubory typu XSL nebo XML, které mohou být exportovány přímo z e-shopu.
20
Možnosti sledování konkurence
Toto přiřazování může uživatel v aplikaci změnit a výrobky k sobě libovolně přiřazovat sám. V aplikaci pak porovnání např. 2000 výrobků na 20-ti e-shopech trvá měně než 5 minut, uvádí prodejce. Upravený soubor s doplněnými cenami produktů konkurence je po zpracování nabídnut ke stažení.
Obr. 3
Ukázka XLS výstupu systému Price checking
Data o cenách výrobků jsou v databázi systému aktualizována pravidelně 2x týdně a dochází tak k určité neaktuálnosti údajů, které se například v období svátků mohou měnit ze dne na den a uživatel systému na ně tak nestíhá reagovat. V aplikaci lze kromě porovnání cen výrobků provádět také statistické pohledy na vývoj cen jednotlivých výrobků a pozorovat data z minulosti. Cena licence za užití aplikace se odvíjí zejména od množství sledovaných e-shopů, kde hraje roli, zda se jedná o již sledovaný nebo nový e-shop či nového výrobce. Noví sledovaní výrobci nebo celé e-shopy, které požaduje uživatel zařadit do srovnávání, cenu výrazně zvedají a ze základních 6000 Kč/měsíc3 se může cena za licenci dostat až k 65000 Kč/měsíc. [24] 2.2.2
Karsa Monitor
Karsa Monitor je projektem společnosti KARSA TECHNOLOGIES, s.r.o., která se v minulosti zabývala vývojem e-shopů. Tento projekt je provozován jako webová
3
Částky jsou uvedeny v cenách bez DPH
Možnosti sledování konkurence
21
služba určená pro majitele e-shopů a její hlavní funkcí je pravidelné denní monitorování cen produktů konkurenčních e-shopů. Umožňuje zákazníkovi monitorovat tisíce produktů z širokého spektra kategorií4 u více než 250 e-shopů. [12] Aktualizace dat probíhá automaticky každý den pomocí webové služby, XML nebo CSV souboru dle preferencí zákazníka. Použití uživatelské části této webové aplikace je rozděleno na čtyři samostatné kroky: 1.
Výběr sortimentu Zákazník si nejdříve určí kategorii produktů (např. bílé zboží, foto, parfémy, pneumatiky), u kterých chce monitorování cen provádět. Jednotlivé hlavní kategorie jsou dále děleny do podkategorií.
2.
Volba konkurence Po zvolení kategorie, kterou chce zákazník sledovat, musí určit z nabídky dostupných e-shopů ty, které pro něj představují konkurenci. U zvolených e-shopů bude prováděno monitorování cen. Při výběru e-shopů se u každého zobrazuje počet monitorovaných produktů ve zvolené kategorii.
3.
Odeslání poptávky Dalším krokem je zaslání formuláře s kontaktními informacemi o zákazníkovi (jméno, příjmení, společnost, email, telefon a adresa zákazníkova obchodu). Po odeslání formuláře zákazníka kontaktuje pověřený pracovník a prodiskutuje s ním podrobnosti projektu. Pokud požadovaný konkurenční e-shop není v nabídce nalezen, je možné jeho název napsat do Poznámky u odesílacího formuláře poptávky. Pracovníci Karsa Monitor pomocí rozhraní odděleného od webové aplikace web nového e-shopu analyzují a definují cesty k potřebným atributům produktu, zejména k názvu a ceně. Tyto cesty jsou při zpracování použity v algoritmech získávajících informace ze všech stránek webu e-shopu.
4.
Získání aktuálních cen každý den Zákazníkovi jsou poté každý den poskytovány reporty o stavu konkurence ve formátu XSL, které si může dále libovolně upravovat.
Na stránkách projektu je dostupný ceník služeb, pomocí kterého si lze snadno sestavit předběžnou kalkulaci požadovaných služeb. Výsledná částka se skládá z jednorázové ceny za přípravu projektu a dále jednotlivých měsíčních poplatků za provozování monitorovacích služeb. Se zvyšujícím se počtem sledovaných konkurentů měsíční cena za službu lineárně roste. Výhodou při zpracování velkého množství produktů je, že s rostoucím počtem reportovaných produktů se cena za report jednoho produktu snižuje.
Přehled hlavních kategorií dostupný z http://www.karsa-monitor.cz/category/4539/Hlavni-kategorie 4
22
Obr. 4
Možnosti sledování konkurence
Standardní report z aplikace Karsa Monitor
Ve výsledném reportu, jehož příklad je vidět na obrázku 4, označuje barevné zvýraznění nejlevnější a nejdražší cenu. Na stupnici skladovosti jsou zvýrazněny hodnoty produktů, které jsou nejdražší, a zároveň jich má firma mnoho kusů na skladě. Opačná situace nastává, pokud je produkt nejlevnější a naskladněno je málo kusů.
2.3 Shrnutí Srovnávací systémy jako zbozi.cz či heureka.cz jsou určeny pro koncové spotřebitele, kteří ve většině případů srovnávají pouze jeden produkt. Rychlost srovnání jednoho produktu a zobrazení výsledků je závislá na rychlosti internetového připojení uživatele, i tak ale ve většině případů zabere řádově pouze několik sekund (±5s). Pro provozovatele e-shopu, který srovnává někdy i tisíce svých produktů, jsou pro jeho účely tyto srovnávací systémy nedostačujícím nástrojem. Srovnání všech svých produktů je v nich velice časově náročné a nemusejí pokrývat celou požadovanou konkurenční oblast. Price checking je aplikace poskytující majiteli e-shopu přehlednou formou informace o cenách konkurence. Kromě aktuálního stavu cen produktů v konkurenčních e-shopech, který je možné exportovat do souboru a získat z něj důležité
Možnosti sledování konkurence
23
informace pro cenovou tvorbu, poskytuje také různé statistické záznamy o cenách. Nevýhodou této aplikace je zaměření pouze na ceny produktů. Pro majitele e-shopu mohou být při budování cenové strategie důležité i některé další informace o produktech jako například množství zboží skladem. Karsa Monitor umožňuje majiteli e-shopu prohlížet pravidelné denní reporty z výsledků monitorování cen produktů konkurence. Do reportů z aplikace jsou kromě srovnání cen produktů zařazeny i informace o počtu vlastních výrobků na skladě. Na základě těchto údajů se lze rozhodovat při naskladňování nových výrobků. Informace o počtu výrobků skladem u produktů konkurence, použitelné při řízení stavu svých zásob, už však poskytovány nejsou. V případě větší konkurenční rivality v odvětví (5 a více konkurentů) licence za využití Price checking či Karsa Monitor výrazně podraží a s každým dalším novým sledovaným konkurentem její cena roste. Správa většího počtu dat je tak vykoupena vyšší cenou za poskytnuté služby. Majitelé menších nebo rozjíždějících se e-shopů bez většího vstupního kapitálu, kteří nedisponují dostatkem volných peněžních prostředků na využívání služeb těchto srovnávacích nástrojů, zůstávají neinformováni o pohybu cen a dalších položek produktů konkurence, která je na základě svých informací a cenové strategii v očích koncových zákazníků překoná. Na trhu chybí systém, který porovnává nejen ceny, ale i další libovolné uživatelem definované atributy produktů s produkty konkurence a neomezuje uživatele výběrem konkurence pouze z nabídky dostupných sledovaných e-shopů bez dalších příplatků. Proto je v této práci vytvořen systém ADETA, jehož návrh a následná implementace budou podrobněji popsány v následujících kapitolách.
Návrh řešení
25
3 Návrh řešení Systém pro srovnání produktů konkurence ADETA je nástroj určený majitelům internetových obchodů, který umožňuje porovnání parametrů vlastních produktů s produkty konkurence. Uživatel si definuje, jaké e-shopy chce sledovat a na jeho impuls systém stáhne stránky zvolených e-shopů, analyzuje jejich kód a uloží do databáze uživatelem definované informace o produktech (např. cena, počet kusu skladem, dostupnost). Velké množství uložených dat o konkurenčních produktech systém umožní uživateli přehledně porovnat se svými vlastními produkty. Na základě informací získaných z tohoto přehledu může uživatel upravovat svou stávající cenovou strategii k dosažení lepšího postavení na trhu. Schéma zobrazující kroky uživatele, které musí provést pro srovnání produktů konkurenční firmy se svými produkty je zobrazeno na obrázku 5.
26
Obr. 5
Návrh řešení
Sekvenční diagram použití systému
Systém ADETA je navržen jako webová aplikace přístupná odkudkoliv, kde je k dispozici připojení k Internetu, pouze s využitím webového prohlížeče. Pro majitele e-shopů je práce s webovým prohlížečem přirozená a při používání systému budou navíc některé funkce prohlížeče5 velice užitečné a usnadní práci se systémem.
Získávání XPath výrazů pomocí nástroje Developer Tools v prohlížeči Google Chrome, které bude popsáno v kapitole 4.2.4. 5
Návrh řešení
27
3.1 Uživatel systému Systém ADETA je navržen pro správce e-shopů, kteří chtějí získat přehled nad svou konkurencí. Člověk, který se důkladněji zajímá o svou konkurenci, se snaží nalézt způsoby jak zvýšit svůj zisk a má přinejmenším zájem na tom vědět, jak jeho e-shop funguje. Předpokládám tedy, že pořizovatelem systému je člověk s určitou počítačovou gramotností, který zná alespoň základy jazyka HTML a dokáže se v něm orientovat a zároveň pro něj nebude práce s webovým rozhraním ničím novým. Ačkoliv by systém měl dokázat využívat a ovládat kdokoliv, jsou v něm prováděny určité operace, které by měl uskutečňovat pouze pověřený a proškolený pracovník. Z toho důvodu je oprávnění k vykonávání operací v systému rozděleno do tří základních uživatelských úrovní. Uživatel Člověk bez potřebných znalostí používaných technologií, který systém využívá převážně ke srovnávání produktů s konkurencí a na základě získaných informací si utváří závěry pro své budoucí jednání. Tento uživatel je oprávněn k činnostem jako: srovnání cen produktů srovnání dalších libovolných atributů produktů zobrazení a úprava atributů vlastních produktů zobrazení konkurenčních firem přidávání dalších konkurenčních firem úprava údajů o firmách odstranění firem, které si nepřeje nadále sledovat sledování stavu konkurence z pohledu jiné firmy Správce Osoba, se znalostmi struktury HTML jazyka, která v systému provádí změny a je zodpovědná za ukládané informace. Správce dědí veškerá oprávnění od uživatele a navíc je oprávněn k: stahování e-shopu konkurenční firmy definování sledovaných atributů produktů při zpracování staženého webu zobrazení náhledu zpracování zpracování staženého webu
28
Návrh řešení
Administrátor Osoba s nejvyššími uživatelskými oprávněními v systému, pověřená zejména správou uživatelských účtů aplikace. Dědí oprávnění od role správce a má navíc oprávněním k: přidávání nových uživatelů úprava údajů a mazání stávajících uživatelů změny hesel uživatelů
3.2 Relační datový model K uchování potřebných dat a budoucímu přístupu k nim byla zvolena relační databáze. ER diagram6 na obrázku 6 zobrazuje navrženou strukturu tabulek a jejich vzájemné vazby. Diagram obsahuje 10 tabulek, jejichž význam a atributy budou popsány v následujícím textu. Při navrhování a následnému vytváření struktury modelu jsem vycházel z několika základních požadavků na funkce systému, které by měl uživateli poskytovat. Těmito požadavky jsou: sledování libovolného počtu firem srovnávání cen produktů libovolných firem srovnání dalších různých volitelných atributů produktů možnost sledování stavu konkurence z pohledu jiné firmy identifikování nových cen a nových produktů firem V rámci této subkapitoly lze název firma ztotožňovat přímo s jejím e-shopem.
6
Entiti-Relationship diagram
Návrh řešení
Obr. 6
29
ER diagram systému7
Tabulka firmy id_firmy – primární klíč nazev – unikátní klíč url priorita V tabulce jsou uchovávány informace o e-shopech firem, jejichž produkty jsou sledovány. Ukládány jsou zejména informace o názvu firmy, dále URL adrese jejího e-shopu, odkud jsou získávány informace o produktech příslušné firmy a také 7 Žlutý klíč
– atribut je primárním klíčem, Prázdný diamant – nepovinný atribut, Modrý diamant – povinný atribut, Červený diamant – atribut je cizím klíčem
30
Návrh řešení
je ukládána hodnota priority. Čím je hodnota priority menší, tím významnější firma je a firma s nejnižší hodnotou priority je považována za firmu primární. Veškeré údaje o firmě jsou zadávány ručně při definici nové firmy nebo při modifikaci firmy již existující. Tabulka produkty id_produkty – primární klíč identifikator – unikátní klíč Tabulka poskytuje přehled o produktech, které jsou předmětem srovnávání. Každý produkt má přiřazen identifikátor, což je jeho jedinečná specifická hodnota. Například identifikátor knihy je její ISBN, u jiných produktů to může být kód EAN nebo pouze název produktu. Identifikátor produktu je povinný atribut, jehož hodnota by měla být vhodně zvolena, protože na základě hodnoty identifikátoru probíhá spárování produktů různých firem při porovnávání jejich cen a dalších atributů. Hodnoty tabulky produkty se plní při hromadném zpracování staženého webu hodnotami získanými syntaktickou analýzou HTML kódu jednotlivých souborů s využitím jazyka XPath. Tabulka produkty_firmy id_produkty_firmy – primární klíč id_firmy – cizí klíč idenfitikující firmu, ke které produkt patří id_produkty – cizí klíč určující produkt, jehož cenu ukládám a spolu s id_firmy tvoří unikátní klíč cena Tabulka je asociační tabulkou mezi tabulkami produkty a firmy. Pro další budoucí využití v aplikaci je zde definován primární klíč id_produkty_firmy. Položky tabulky produkty_firmy reprezentují produkty jednotlivých firem, u kterých je uchováván údaj o ceně. Hodnota ceny se ukládá při zpracování jednotlivých souborů obrazu webu e-shopu. Je to jeden z povinných údajů o produktu, který sleduji vždy a podle kterého produkty porovnávám, a proto je oddělen od ostatních atributů produktu a umístěn již v této tabulce. Tabulka p_atributy id_atributy – primární klíč nazev – unikátní klíč Tabulka poskytuje přehled o názvech atributů produktů. Závisí na uživateli a konkrétním použití aplikace, které atributy použije. U produktu může například uživatel definovat atributy „kusů skladem“, „dostupnost“ a další.
Návrh řešení
31
Tabulka pf_data id_pf_data – primární klíč id_produkty_firmy – cizí klíč představující produkt konkrétní firmy id_p_atributy – cizí klíč určující atribut, jehož hodnotu ukládám a spolu s id_produkty_firmy tvoří unikátní klíč hodnota Tabulka poskytuje informace o hodnotách sledovaných atributů jednotlivých produktů, které tento produkt lépe popisují (např. počet kusů na skladě). Tabulka nove_produkty id_nove_produkty – primární klíč id_produkty – atribut identifikující produkt id_firmy – atribut identifikující firmu, ke které se nový produkt vztahuje a spolu s id_produkty tvoří unikátní klíč Tabulka slouží k identifikaci produktů firem, které byly u jednotlivých firem získány nově, tzn., při posledním minulém získávání informací o produktech konkrétní firmy tyto produkty firma v nabídce neměla. Při každém novém zahájení zpracování produktů určité firmy jsou hodnoty pro danou firmu z této tabulky smazány a je prováděno naplňování hodnotami novými. Tabulka nove_ceny id_nove_ceny – primární klíč id_produkty – atribut identifikující produkt, jehož cena byla změněna id_firmy – atribut identifikující firmu, ke které se nový produkt vztahuje a spolu s id_produkty tvoří unikátní klíč Tabulka slouží k identifikaci produktů firmy, jejichž ceny se od posledního minulého získávání informací o produktech této firmy změnily. I zde jsou při každém novém zahájení zpracování produktů určité firmy hodnoty zpracovávané firmy z této tabulky smazány a je prováděno naplňování novými hodnotami. Tabulka uzivatele id_uzivatele – primární klíč id_u_opravneni – cizí klíč určující roli, pod kterou uživatel v systému vystupuje prihlasovaci_jmeno – jméno, pod kterým se uživatel přihlašuje do systému
32
Návrh řešení
heslo – atribut, který se spolu s atributem prihlasovaci_jmeno kontroluje při přihlašování uživatele do systému jmeno prijmeni email – kontaktní údaj o emailu uživatele telefon – údaj o telefonním čísle uživatele Tabulka uzivatele uchovává informace o jednotlivých uživatelích systému. Změny údajů o uživatelích provádí vždy pouze uživatel s rolí admin. Kromě přihlašovacího jména a hesla, které slouží k autorizaci uživatele do systému, se o uživateli ukládá také informace o jeho jméně, příjmení a jeho kontaktních údajích. Tabulka u_opravneni id_u_opravneni – primární klíč role – název role, pod kterou uživatel v systému vystupuje Tabulka slouží jako číselník rolí, které určují oprávnění uživatele k přístupu do jednotlivých částí aplikace. Tabulka progress souboru_celkem – počet všech souborů zrcadla webu souboru_zpracovano – počet doposud zpracovaných souborů, který se při procesu zpracování v určitých časových intervalech aktualizuje souboru_chybovych – počet souborů, kde systém při zpracování nezískal identifikátor produktu nebo jeho cenu Tabulka progress se využívá při zpracování zrcadla webu. Při zpracování jsou do ní systémem ukládány údaje o současném stavu zpracování a tyto informace jsou uživateli zobrazovány pomocí ukazatele průběhu zpracování.
3.3 Stažení webu Informace o produktech konkurenčních firem lze získat z jejich e-shopů, kde firmy svým zákazníkům produkty nabízejí. Tyto informace chci z HTML stránek jednotlivých produktů získat pomocí sémantické analýzy kódu. Všechny stránky e-shopu jsou systémem analyzovány jednotlivě a musejí být nejdříve staženy na disk. Potřebuji využít nástroj, který umožní web e-shopu zrcadlit – projde celý web rekurzivně a na lokální disk serveru vytvoří jeho offline verzi.
Návrh řešení
3.3.1
33
cURL
Jedním ze způsobů jak na disk stáhnout internetovou stránku, popřípadě stránky je využít jeden z produktů projektu cURL8. Prvním produktem je libcurl - knihovna pro TCP/IP protokoly, určená zejména pro HTTP komunikaci, podporovaná na nejrůznějších platformách od Solaris, NetBSD přes Windows až po Android. Druhým produktem je cURL, nástroj spouštěný z příkazové řádky. Oba tyto produkty slouží ke stažení dat stránky ze zadaného URL a umožňují i nahrání souboru na server. Verze knihovny jsou k dispozici pro více než 40 jazyků včetně C/C++, Java, PHP a Python. [26] cURL umožňuje při definici URL adres, které mají být staženy několik usnadnění. Jedním z nich je možnost zadat URL adresy výčtem za pomoci hranatých závorek. http : //www.cl.cam.ac.uk/ ~ rja14/Papers/SE - [01 - 24].pdf odpovídá http : //www.cl.cam.ac.uk/ ~ rja14/Papers/SE - 01.pdf http : //www.cl.cam.ac.uk/ ~ rja14/Papers/SE - 02.pdf ... http : //www.cl.cam.ac.uk/ ~ rja14/Papers/SE - 24.pdf
Dalším usnadněním je zadávání URL pomocí výčtu s využitím složených závorek. http: //www.something.name /page/{one , two, three}.pdf
Tyto usnadnění zjednodušují definici stahovaných souborů. Při stahování celého e-shopu však neznám indexy prvního a posledního souboru, ani přesné názvy souborů. 3.3.2
Wget
GNU Wget je program, vydávaný pod licencí GPL9, pro stahování souborů z internetu pomocí protokolu HTTP a FTP. Původně byl naprogramován pro operační systém Linux, ale během vývoje vzniklo již několik verzí pro další operační systémy, jako jsou Mac OS X nebo Microsoft Windows. Wget pracuje velmi dobře na pomalých či nestabilních spojeních, kde se pokouší soubor získat tak dlouho, dokud není celý načtený. Podporuje využití proxy serverů, které mohou odlehčit síťovou zátěž a zrychlit stahování. [11] Wget umožňuje následovat odkazy z již stažených stránek a rekurzivně opakovat tuto činnost tak dlouho, dokud nejsou staženy všechny stránky ze zadané 8 9
http://curl.haxx.se/ http://www.gnu.org/software/wget/
34
Návrh řešení
domény. Konfiguračními parametry lze ovlivnit hloubku zanoření rekurze. Rekurzivní stahováním se web zrcadlí a vytváří se na serveru či lokálním disku jeho offline verze. Jednou z výhod Wgetu je velké množství konfiguračních parametrů, podrobně popsaných v obsáhlé dokumentaci, které uživateli umožňují detailně specifikovat co přesně a jakým způsobem se má stahovat. 3.3.3
HTTrack Website Copier
HTTrack Website Copier je nástroj umožňující rekurzivní stažení webových stránek do lokálního adresáře, rekurzivní sestavení adresářů, získání HTML souborů, obrázků a dalších souborů. HTTrack lez využít jako knihovnu nebo GUI10 aplikaci pro Windwos nebo Linux/Unix. Funkce HTTracku je konfigurovatelná řadou parametrů popsaných v dokumentaci. [20] 3.3.4
Výběr nástroje
Všechny popisované nástroje umožňují získat HTML soubor přes FTP, HTTP nebo HTTPS protokol. Lze je spustit z příkazové řádky a jsou vydávány jako open source. Nástroj cURL neumožňuje web stahovat rekurzivně, a pro takto navržený systém by byl uplatnitelný až po vlastním doimplementování potřebné funkcionality. HTTrack i Wget umožňují zrcadlit web, vyloučit ze stahování definované typy souborů (jpg, gif, css) a určit hloubku zanoření při stahování. Některé webové stránky si mohou provádět analýzy přístupů z programů, jako jsou Wget nebo HTTrack a jejich činnost případně přerušit a blokovat. Kontrolují se podobnosti v časech mezi jednotlivými žádostmi při stahování souborů webu. Konfigurační parametr --random-wait umožňuje Wgetu nastavit náhodný čas mezi žádostmi z intervalu 0.5 až 1.5*wait, kde wait je počet sekund nastavený u dalšího parametru --wait. Pomocí přístupu na web v náhodných časových intervalech dokáže obejít algoritmy kontrolující činnost těchto stahovacích robotů. Stažení kompletního zrcadla webu je operace, která může v určitých případech trvat i několik hodin a délka stahování pro mě při rozhodování mezi nástroji pro stahování nehrála roli. HTTrack měl při testování na pomalejším připojení problém s opětovným stažením souboru, který nebyl stažen kompletní. V důsledku toho nebyly ve správné podobě staženy vždy všechny soubory e-shopu. Wget s opětovným stahováním souborů neměl problémy a fungoval bez chyb, proto byl v systému využit.
3.4 Zpracování obsahu webu Ačkoliv podle schématu z obrázku 5 probíhá zpracování obsahu webu až po definici atributů produktu, bude v práci nejdříve popsána problematika zpracování
10
Graphical User Interface – Grafické uživatelské rozhraní
Návrh řešení
35
obsahu webu a to z důvodu, že definice atributů produktu závisí na zvolené technologii zpracování. Ze souborů staženého zrcadla webu potřebuji pomocí syntaktické analýzy 11 HTML kódu získat uživatelem definované informace o produktech. Existuje několik možností jak tyto informace získat, ty budou v následujícím textu stručně popsány a následně bude vybrána nejvhodnější technologie. 3.4.1
XML
První možností, která se nabízí, je zpracování HTML souboru jako XML souboru. K tomuto zpracování lze využit rozhraní SAX (Simple API for XML). SAX je parser založený na řízení pomocí událostí (event-driven), který soubor prochází vždy od začátku do konce. Pomocí rozhraní se vytváří vazba mezi událostmi, které generuje parser, a kódem. [21] V praxi to znamená, že se definují funkce, které se zavolají v okamžiku, kdy parser narazí na začátek elementu, obsah elementu, konec elementu, komentář apod. Zpracování jediné informace je rozděleno vždy na tři části: událost začátku elementu událost znakových dat událost konce elementu Je potřeba napsat stavový automat, který umožní identifikaci stavů a určí další postup při zpracování jednotlivých elementů.
11 Syntaktická analýza
je proces, kterým se transformuje vstupní text do datové struktury, většinou stromu, jenž je vhodný pro pozdější zpracování a který zachovává hierarchii vstupních dat. http://cs.wikipedia.org/wiki/Syntaktick%C3%A1_anal%C3%BDza
36
Návrh řešení
Obr. 7
Příklad použití SAX rozhraní
3.4.2
HTML DOM
HTML DOM je objektový model pro přístup k HTML dokumentům a k manipulaci s nimi. Dokument je reprezentován jako stromová struktura, kde každému elementu odpovídá jeden uzel stromu. [8] HTML DOM vyžaduje před samotným zpracováním souboru nahrání celého stromu dokumentu do paměti a až poté umožňuje z dokumentu získávat určité informace nebo nad ním provádět nějaké změny. U větších souborů (nad 10MB) zabírá DOM poměrně velkou část paměti a rychlost čtení z něj s rostoucí velikostí souborů klesá, což jsou jeho velké nevýhody. [1] Pro správné vytvoření stromu dokumentu musí zpracovávaný soubor splňovat podmínky validity12. U souboru s nevalidní strukturou nemusí jít strom dokumentu vůbec vytvořit, popřípadě nemusí odpovídat skutečnosti, což znemožní správný pohyb po jeho uzlech. Elementům stromu odpovídají instance třídy DOMElement, atributům instance třídy DOMAttr a textovým uzlům pak instance třídy DOMText. Všechny uzly mají mnoho společných metod a vlastností. Nejdůležitějšími a pro mě podstatnými vlastnostmi jsou ty, které umožňují získat jméno uzlu (nodeName) a jeho hodnotu (nodeValue).
Validita - sémantická správnost kódu. http://www.seo-konzultace.cz/vyznam-validity-kodu-pro-seo/ 12
Návrh řešení
37
Na rozdíl od SAXu není potřeba dokument procházet od začátku do konce, ale můžu se v něm pohybovat dle vlastní potřeby, například pomocí vlastnosti childNodes, která vrací seznam podřízených uzlů, nebo vlastnosti parentNode, která vrací rodiče uzlu. K jednotlivým elementům dokumentu lze také přistoupit za pomoci metod getElementById() nebo getElementsByTagName(), které vracejí seznam uzlů odpovídajících hodnotám zadaným jako parametry těchto metod. V případě první uvedené metody je parametrem id hledaného elementu, u druhé zmíněné je to název elementu. [8] XPath 1.0 XPath (XML Path Language) [29] verze 1.0 definuje organizací W3C schválenou syntaxi popisu adres částí XML nebo HTML dokumentu. Adresuje stromový model dokumentu, k jehož jednotlivým uzlům se lze dostat pomocí výrazu zvaného cesta (location path). XPath cesty podobně jako cesty v systému souborů, navigují v rámci stromového modelu, kde identifikují množinu uzlů (node-set). Spolu s množinami uzlů podporuje XPath ještě další tři datové typy: logické hodnoty (boolean), čísla (number) a textové řetězce (string). Každý XPath výraz vrátí objekt jednoho z možných uvedených datových typů, s kterým lze následně pracovat. [23] 3.4.3
Výběr nejvhodnějšího nástroje
S rozhraním SAX, pomocí kterého by bylo možno HTML soubor zpracovávat jako soubor XML, bych musel pro získání hodnot elementů procházet každý soubor od začátku do konce. Na jednotlivých stránkách mě však někdy zajímají pouze jejich malé části, z kterých potřebuji informace získat. HTML DOM, který umožňuje se ve stromu dokumentu pohybovat libovolně, představuje lepší variantu. Nejdůležitějším rozhodovacím kritériem pro mě, i přes tuto výhodu DOM, byl způsob definice cesty atributu produktu. Tuto definici v aplikaci provádí samotný uživatel a měla by tedy být co nejjednodušší. S využitím nástrojů moderních internetových prohlížečů má uživatel možnost získat XPath cestu k elementu pomocí několika kliknutí myši. Z důvodu, že každou staženou stránku zpracovávám samostatně a předpokládám, že její velikost nepřesáhne 10MB, nepředstavuje paměťová náročnost DOM parseru problém. S využitím jazyka XPath poté získám přístup k potřebným elementům stránky a jejich hodnotám, které uložím do databáze. 3.4.4
Vyčištění HTML kódu
HTML stránky obrazu webu vždy nesplňují požadavky validity. Při zpracovávání souborů pomocí DOM a XPath, které jsem zvolil jako nejvhodnější nástroje, je však pro jejich správnou práci zapotřebí, aby HTML stránky validní byly. Ponechání struktury souborů v podobě, ve které byly staženy, by mohlo vést k chybám
38
Návrh řešení
při vytváření stromu dokumentu a XPath výrazy by tak nevraceli správné výsledky. Zajistit potřebnou úroveň validity zpracovávaných souborů pro správné vytvoření stromu dokumentu a tím dosáhnout i správného fungování jazyka XPath lze využitím nástroje HTML Tidy. Tento nástroj slouží ke kontrole validace a opravovaní chyb HTML, XHTML a XML souborů. Je vydáván pod GNU licencí a tedy volně dostupný. HTML Tidy je kompilován přes příkazový řádek, nebo využíván jako dynamická knihovna. Knihovna je dostupná pro široké využití v aplikacích vyvíjených v jazycích PHP, Java, Python nebo Perl. [9] U souborů Tidy detekuje a opravuje řadu chyb v kódu a snaží se vytvářet strukturu odpovídajících značek, které jsou kompatibilní se standardy W3C a jsou podporovány ve většině webových prohlížečů. Podporuje standard HTML 4.0 a částečně i XML 1.0. Poslední, prozatím experimentální, verze HTML Tidy je rozšířena o podporu HTML5. [18] Nástroje knihovny Tidy jsou schopny opravit širokou škálu chyb nebo pouze upozornit na věci, které by měly být opraveny. Každá nalezená položka je opatřena indexem řádku a sloupce, takže je při konečném výpisu chyb zřetelné, kde problém nastal. Pro konkrétní představu jsem uvedl několik příkladů úprav, které Tidy dokáže v nevalidním souboru provádět: [18] doplnění chybějících koncových značek oprava neodpovídajících koncových značek oprava nesprávného pořadí značek doplnění uvozovek okolo hodnot atributů
3.5 Definice atributů produktu Systém ADETA jsem navrhl tak, aby jeho uživatel mohl u produktu srovnávat libovolný počet jeho atributů, které si sám zvolí. Srovnávané atributy definuje v systému pouze uživatel s příslušným oprávněním například na základě žádosti svého vedoucího pracovníka. Na obrázku 8 je zobrazen postup při definici atributu produktu.
Návrh řešení
Obr. 8
39
Diagram aktivit definice atributu
Po zvolení firmy a úspěšném stažení webu jejího e-shopu je definice atributů produktu posledním krokem před zpracováním celého obrazu webu a ukládáním dat do databáze. Tato část systému je navržena tak, aby si uživatel mohl na jednotlivých souborech staženého webu otestovat, zda výsledná hodnota zadané XPath cesty odpovídá skutečné hodnotě na stránce webu, a až poté zahájit zpracování celého obrazu webu e-shopu. Po zvolení testovací stránky, kterou následně systém zobrazí, uživatel zvolí kódování, ve kterém jsou stránky e-shopu napsány. Dalším krokem uživatele je volba filtrovacího elementu. Tato položka slouží k identifikaci sledované katego-
40
Návrh řešení
rie produktů na zpracovávaném webu. Na konkurenčním e-shopu mohou být nabízeny různé typy zboží současně (DVD, knihy, parfémy apod.) a je potřeba identifikovat pouze ty kategorie zboží, které chce zákazník sledovat. Pomocí definice XPath cesty elementu, určujícího typ zboží, a zadáním filtrovacího řetězce představujícího sledovanou hodnotu (např. 'DVD'), uživatel definuje kategorii e-shopu, jejíž produkty budou zpracovány. Ostatní kategorie budou při zpracování vynechány. Kromě povinných atributů, kterými jsou identifikátor a cena produktu, lze libovolně přidávat nebo ubírat i další sledované atributy. O atributech produktu jsou do databáze ukládány vždy dva údaje. Prvním údajem je jeho název, který při definici atributu zadává uživatel. Druhým ukládaným údajem o atributu je hodnota. Získání hodnoty atributu pro každý produkt je prováděno při zpracování jednotlivých souborů. Z každého souboru je vytvořen strom dokumentu přes HTML DOM, který pomocí jazyka XPath umožňuje přístup k uzlům stromu. Uživatel do systému zadá XPath výraz identifikující část HTML kódu, kde se zjišťovaný atribut nachází, a jeho hodnota je následně zobrazena. Hodnotu atributu lze před uložením do databáze ještě upravit. Uživatel má možnost oříznout z výsledné hodnoty určitý počet znaků (např. 3 znaky zleva). Může také na hodnotu aplikovat regulární výraz13, který v aplikaci zadá, nebo použít jednu z funkcí pro transformaci textu (např. funkce pro převod znaků na velká či malá písmena). Tento proces lze provádět pro libovolný počet souborů, které si uživatel jeden po druhém volí z adresáře obsahujícího zrcadlo webu firmy.
Regulární výraz je vzorem, který popisuje obsah řetězce. Říká, co se v řetězci smí a nesmí vyskytovat, jaký je možný počet opakování těchto výskytů, na jaké pozici v řetězci má co být apod. https://akela.mendelu.cz/~darena/Perl/regexp.html 13
Návrh řešení
Obr. 9
Prototyp části aplikace k definici atributů produktu
41
Implementace
43
4 Implementace V této kapitole popisuji technologie, které jsem při vývoji systému ADETA využil. Jsou zde také popsány některé konkrétní části aplikace spolu s problémy, které bylo nutné při jejich implementaci řešit.
4.1 Použité technologie HTML5 – je specifikace jazyka HTML (HyperText Markup Language), který se využívá k definici obsahu webové stránky. Ačkoliv je verze 5 stále ve vývoji, je již nyní podporována řadou webových prohlížečů a oproti starší verzi HTML4 přináší vývojářům řadu nových elementů a atributů usnadňujících tvorbu webových aplikací. [7] CSS3 – je nejnovější a v současné době stále vyvíjená verze jazyka nazývaného kaskádové styly (Cascading Style Sheets), který je určen k definici vzhledu stránek psaných ve značkovacích jazycích. jQuery – je open-source knihovna pro JavaScript, která poskytuje mnoho metod usnadňujících práci s JavaScriptem a je podporována všemi prohlížeči. Umožňuje průchod a manipulaci s HTML dokumentem, zpracování událostí, animace a zjednodušuje práci s technologií AJAX. [14] AJAX – je zkratka pro Asynchronous JavaScript and XML. Tato technologie umožňuje měnit části stránky bez nutnosti celou stránku znovu načítat. Tento proces je nazýván jako ‘‘částečné obnovení stránky’’. Všechny moderní prohlížeče poskytují XMLHttpRequest object, který se využívá k zasílání AJAX requestu na webový server a následnému získání dat, které server vrátí. JavaScript je v prohlížeči využit ke zpracování vrácených dat a modifikaci stránky. Při práci s AJAXem lze specifikovat, jaký typ dat má server vracet a lze využít prostý text, XML, HTML nebo JSON. [14] Pro samotnou implementaci aplikace jsem využil programovací jazyk PHP a Nette Framework, který nabízí vlastní šablonovací systém Latte, propracované ladící nástroje, podporu HTML5, AJAX a je v něm kladen velký důraz na bezpečnost. [22] Pro zpřehlednění kódu a oddělení aplikační logiky od kódu zobrazujícího data uživateli jsem využil návrhového vzoru MVP, který aplikaci rozděluje do 3 logických částí: [15] Model – datový a zejména funkční základ celé aplikace obsahující aplikační logiku View – vrstva zobrazující uživatelské rozhraní aplikace Presenter – zpracovává požadavky od uživatele a na jejich základě volá příslušnou aplikační logiku (metody modelu) a předává data k zobrazení do View
44
Implementace
Pro práci s databází jsem zvolil databázovou vrstvu dibi, která podporuje řadu databází jako: MySQL, PostgreSQL, SQ Lite, MS SQL, Oracle a obecné PDO. Aplikace je postavena na databázi MySQL, která však může být díky nezávislosti dibi na databázové platformě změněna. [3]
4.2 Stažení a zpracování webu 4.2.1
Konfigurační parametry a spuštění Wget
Využití Wgetu jehož funkce byla popsána v kapitole 3.3.2 je velice široké a pomocí konfiguračních parametrů lze přizpůsobit jeho chování tak, aby prováděl potřebné operace k dosažení požadovaného výsledku. Pro stažení zrcadla webu jsem nastavil níže uvedené konfigurační parametry. U jednotlivých parametrů uvádím jejich krátkou i dlouhou podobu zápisu a jejich účel: [28] -np (--no-parent): při rekurzivním stahování nedovolit vstoupit do nadřazeného adresáře -nd (--no-directories): nevytvářet adresářovou hierarchii -o logfile (--output-file=logfile) : ukládat logy do souboru logfile.log -P prefix (--directory-prefix=prefix): nastavit adresář kam se bude zrcadlo ukládat -E (--adjust-extension): pokud se stáhnou soubory, které nekončí podle regulárního výrazu ‘\.[Hh][Tt][Mm][Ll]?’, přidat těmto souborům příponu html -w seconds (--wait=seconds): vyčkat zadaný počet sekund mezi pokusy o získání souboru -R rejlist (--reject rejlist): výčet přípon souborů, které nestahovat -r (--recursive): zapnout rekurzivní procházení -l depth (--level=depth): nastavit hloubku zanoření -m (--mirror): nastavit parametry vhodné pro zrcadlení webu Použitím této volby se dá současně nastavit rekurzivní stahování, nastavování timestampů soborů, nekonečná hladina zanoření a zákaz odstraňování dočasných souborů. Je to ekvivalent k použití voleb -r -N -l inf --no-removelistening. -t number (--tries=number): nastavit počet pokusů o stažení souboru
Implementace
45
public function mirrorCompanyEshop($id_firmy) { session_write_close(); if($this->is_exec_available()) { set_time_limit ( 0 ); $url = $this->getCompanyUrl($id_firmy); $reject ="jpg,jpeg,png,gif,bmp,js,css,swf,ico,php,xml,txt"; $reject_uc = strtoupper($reject_extensions); $wget_command = "wget -m -E -t 3 -R $reject, $reject_uc -w 5 --random-wait -P ../data/$id_firmy -np -nd -o ../temp/mirror.log $url"; exec($wget_command);
Výše uvedená část kódu v aplikaci obstarává stažení zrcadla webu e-shopu firmy, jejíž id je předáno jako parametr funkci mirrorCompanyEshop($id_firmy). Proces zrcadlení může v určitých případech trvat i několik hodin, proto pomocí funkce set_time_limit parametrem 0 nejdříve nastavuji neomezený čas, po který může skript na serveru běžet. Pomocí php funkce exec(), která spouští externí programy, spustím program Wget s potřebnými nastavenými parametry, který do adresáře data stáhne kompletní zrcadlo webu. Počet pokusů o stažení jednoho souboru jsem na základě testování nastavil na hodnotu 3, která byla pro úspěšné stažení souborů dostačující. Soubory s příponami uvedenými v proměnné $reject, které pro budoucí zpracování nejsou podstatné, budou ze stahování vyloučeny. Tím ušetřím místo na disku a sníží se tím i čas potřebný ke stažení zrcadla webu. Výstup programu Wget přesměrovávám do souboru mirror.log, jehož část je po dokončení zrcadlení webu uživateli zobrazena a poskytuje informaci o průběhu celé operace stahování. Volbami ‘-w 5 --random-wait’ zajišťuji náhodné časy mezi jednotlivými přístupy programu na web, čímž odstraním riziko přerušení stahování, které může kontrolní program na webu vyvolat. 4.2.2
Konfigurace Tidy
Pro správné vytvoření stromu dokumentu z HTML stránky pomocí instance třídy DOMDocument musí být její vstup validní HTML. Nelze spoléhat na to, že všechny weby e-shopů sledovaných firem splňují kritéria validity, a proto každou stránku před samotným zpracováním nejdříve zvaliduji s využitím knihovny Tidy. Uvádím část konfiguračních parametrů, podle kterých probíhá očištění původního HTML kódu.
46
Implementace
$config = array( 'show-body-only' => false, 'clean' => true, 'doctype' => 'auto', 'input -encoding' => 4, output-encoding' => 4, 'add-xml-decl' => true, 'add-xml-space' => true, 'output-html' => false, 'output-xml' => false, 'output-xhtml' => true, 'numeric-entities' => false, 'ascii-chars' => false, 'doctype' => 'strict', . . . )
U položek input-encoding (vstupní kódování) a output-encoding (výstupní kódování) jsem nastavil hodnotu 4, což podle specifikace knihovny Tidy odpovídá kódování UTF-814. [9] V tomto kódování vytvářím instanci třídy DOMDocument, a proto stránky napsané v jiném kódování před vytvořením instance nejdříve převádím na UTF-8, které je kompatibilní se všemi ostatními českými kódováními. 4.2.3
Převod kódování stránek
U českých webů převládají kódování ISO 8859-2, Windows-1250 a UTF-8. [16] Z těchto údajů jsem vycházel a uživateli jsem dal při definici kódování stránky na výběr z těchto možností: iso-8859-1 iso-8859-2 iso-8859-3 iso-8859-4 iso-8859-5 UTF-8 UTF-16 UTF-32 windows-1250
UTF-8 (UCS Transformation Format) je kódování umožňující reprezentovat každý znak ze sady Unicode, které bylo navrženo se zpětnou kompatibilitou s ASCII. 14
Implementace
47
windows-1251 windows-1252 windows-1253 windows-1254 windows-1255 Samotný převod kódování provádím pomocí funkce iconv() z knihovny iconv, přebírající jako parametry vstupní kódování zadané uživatelem, zdroj dat a výstupní kódování. Funkce převede zadaný řetězec ze zdrojového do cílového kódování. [13] Pro definici výstupního kódování jsem využil způsob zápisu ‘UTF8//IGNORE’, umožňující vynechat znaky, které nemohou být reprezentovány v množině znaků výstupního kódování. [10] 4.2.4
Získání hodnoty elementu
K možnosti využít pro získání hodnoty elementu odkazovaného pomocí jazyka XPath musím při zpracování nejprve každý soubor načíst do paměti. Pomocí třídy DOMDocument15 a její metody loadHTML() vytvořím objekt reprezentující stromovou strukturu souboru. Instanci této třídy předám jako parametr konstruktoru třídy DOMXpath16, která podporuje jazyk XPath 1.0 a obsahuje metody pro pohyb po stromu dokumentu pomocí XPath cest. [4] [5] WebKit jako vykreslovací jádro prohlížeče Google Chrome, pro který byla aplikace optimalizována, na stránce webu vytváří uvnitř elementu table další vnoření element s názvem tbody, který se v původním zdrojovém kódu nenachází a obsahuje původní data elementu table. Po zkopírování může získaná XPath cesta obsahovat elementy tbody, které při získávání hodnoty výrazu odstraňuji. public function get_XPath_result($DOMXPath,$XPath_expression) { $XPath_expression = str_replace("/tbody/", "/", $XPath_expression); return trim($DOMXPath->evaluate("string($XPath_expression)")); }
Získaná hodnota XPath výrazu je podle uživatelem definovaných úprav modifikována na požadovaný tvar. Systém umožňuje z výsledných hodnot oříznout libovolný počet řetězců od začátku i z konce. Tento nástroj je využitelný v situaci, kdy se například před názvy všech produktů na webu objevuje stejná sekvence znaků, které je potřeba odstranit (např. DVD: Název filmu). Zpracovávané řetězce jsou v kódování UTF-8 a mohou mít jeden znak uložen ve více než jednom bajtu.
15 16
http://php.net/manual/en/class.domdocument.php http://php.net/manual/en/class.domxpath.php
48
Implementace
Pro práci s těmito řetězci je v PHP určena knihovna mbstring17, kterou jsem při implementaci využil. [13] Odříznutím nepotřebných znaků v původním řetězci získám požadovanou hodnotu. Pro náročnější uživatele jsem do systému implementoval i možnost kontroly získané hodnoty pomocí regulárního výrazu. Pomocí následujících uvedených funkcí provádím transformaci získaných hodnot atributů produktu před ukládáním do databáze. public function applyRegular($value,$regular_expression) { $regular_expression = preg_quote($regular_expression, '/'); if (!preg_match("/$regular_expression/", trim($value))) { $value = ''; } return $value; } public function applyFunction($value, $function_name) { switch ($function_name) { case 'none': break; case 'strtolower': $value = strtolower($value); break; case 'strtoupper': $value = strtoupper($value); break; default: break; } return $value; }
4.2.5
Zpracování zrcadla webu
Proces zpracování zrcadla webu následuje po definování atributů produktu a jejich příslušných XPath cest. Celý proces začíná tím, že smažu údaje o zpracovávané firmě z tabulky nove_produkty a nove_ceny. Poté spočítám počet souborů v adresáři, kde se nachází stažené zrcadlo webu, a tento údaj uložím do tabulky progress, jejíž obsah poslouží k zobrazování průběhu zpracování uživateli. Pro každý soubor zrcadla zvlášť nejdříve kontroluji, zda uživatelem zadaná hodnota kontrolního elementu odpovídá skutečné získané hodnotě jeho XPath výrazu. Pokud hodnota neodpovídá, soubor odstraním a pokračuji ve zpracování dalšího souboru. Odpovídá-li hodnota kontrolního elementu, kontroluji, zda byl podle 17
http://cz1.php.net/manual/en/book.mbstring.php
Implementace
49
uživatelem zadané XPath cesty nalezen identifikátor a cena produktu, které jsou povinnými údaji o produktu. Pokud ne, je tento soubor v adresáři ponechán, navyšuji hodnotu nezpracovaných souborů a pokračuji zpracování dalšího souboru. Pokud je hodnota identifikátoru i ceny na stránce nalezena, jsou uloženy do databáze a provádím zpracování atributů produktu. Při ukládání dat do databáze současně kontroluji, zda se jedná o nové produkty či ceny a popřípadě tyto data ukládám do tabulek nove_produkty nebo nove_ceny. Kontrolu provádím pomocí návratové hodnoty funkce execute(), která je součástí dibi rozhraní. Při ukládání údajů o produktu a jeho ceně do tabulky produkty_firmy využívám konstrukci ‘INSERT … ON DUPLICATE KEY UPDATE’, kde při jejím použití nastávají v systému 3 možné stavy. $result = $this->dibi->insert("produkty_firmy", $array) ->onDuplicateKeyUpdate("cena = %i", $cena) ->execute(); if ($result == 0) { /* zachování původního produktu se stejnou cenou */ } else if ($result == 1) { /* proběhlo vložení nového produktu a ceny (INSERT) */ } else if ($result == 2) { /* proběhla aktualizace ceny produktu (DELETE, INSERT) */ }
Tyto stavy kontroluji a na jejich základě dále postupuji při zpracovávání souboru. Pro každý uživatelem definovaný atribut naleznu pomocí zadané XPath cesty jeho hodnotu a i zde kontroluji, zda je to hodnota atributu nová nebo již v databázi uložená. Po úspěšném zpracování souboru a uložení všech sledovaných atributů o produktu do databáze soubor odstraním, navýším počítadlo zpracovaných souborů, jehož hodnotu uložím do tabulky progress, a pokračuji zpracováním dalšího souboru. Pro nezpracované soubory je možné po dokončení operace zadat nové XPath cesty a opět zahájit zpracování.
4.3 Uživatelské rozhraní Při tvorbě layoutu stránky jsem vycházel z volně šiřitelného administrátorského skinu Internet Dreams18, jehož upravené CSS soubory a nepatrně změněné původní rozložení jsem v aplikaci využil. Zvoleným layoutem jsem uživateli poskytl dostatečnou pracovní plochu a zároveň jsem docílil přehledného rozložení všech potřebných prvků aplikace. http://www.netdreams.co.uk/index.php/blog/2010/02/18/free-admin-skin-available-fordownload 18
50
Implementace
Obr. 10
Prototyp rozložení prvků aplikace
Oznámení o stavech systému uživateli zobrazuji pomocí flash zpráv 19, které jsou součástí Nette Frameworku. V aplikaci jsem pro různé stavy, které mohou nastat, definoval 3 typy zpráv: message-success – zpráva zvýrazněná zeleně, která informuje o úspěšném dokončení nejrůznějších akcí v aplikaci message-info – zpráva se žlutým zvýrazněním, která při práci s aplikací uživateli sděluje další doporučené kroky message-error – červeně zvýrazněná zpráva, informující o snaze uživatele použít aplikaci nesprávným způsobem Jediným avšak naprosto dostačujícím navigačním prvkem aplikace je dvouúrovňové menu, které jsem umístil do horní části okna aplikace pod logo systému ADETA. V menu je vždy zvýrazněna sekce, ve které se uživatel při práci se systémem nachází. Všechny sekce včetně jejich hierarchie lze vidět na obrázku 11. S využitím modelu AccessControlList popsaného v kapitole 4.4 uživateli zobrazuji pouze ty části menu, k jejichž přístupu má oprávnění (uživateli s rolí správce například není zobrazena sekce Uživatelé). V případě prvního přihlášení je uživatel přesměrován na úvodní stránku, na kterou se dostane z kterékoliv části aplikace
Flash zpráva je zpráva informující o výsledku určité operace (např. úspěšné přidání uživatele), která sama zmizí. 19
Implementace
51
také kliknutím na logo systému. Při delší nečinnosti v systému, je uživatel automaticky odhlášen a po opětovném přihlášení je přesměrován vždy zpět na stránku, odkud byl odhlášen.
Obr. 11
Sitemap webové aplikace
V částech aplikace, kde oprávněný uživatel pracuje s údaji o firmách, uživatelích a v části kde definuje atributy produktů, jsem do pravé části okna aplikace umístil statické okno nápovědy, která slouží k ujasnění toho, jak jednotlivé části systému fungují. Nápověda uživateli poskytuje návod jak pracovat s různými částmi systému a popisuje důsledky v systému prováděných akcí. Je určena zejména pro uživatele, kteří nemají se systémem ADETA zkušenosti a šetří jejich čas při zkoumání funkcionality systému. 4.3.1
Získání XPath cesty
Při definici atributů produktu uživatel do systému zadává XPath cesty sledovaných elementů stránky. Uživatel znalý jazyka XPath by byl po prozkoumání zdrojového kódu stránky, ze které chce získávat informace o produktech, schopen XPath výrazy definující cesty k jednotlivým elementům sestavit sám. Ne všichni potencionální uživatelé systému ADETA tento jazyk ovládají, a proto bylo potřeba zvolit jinou formu získání XPath cesty. Usnadnění poskytují samotné prohlížeče webových stránek, které nabízejí funkce jak tento výraz získat pouhým kliknutím myši. To uživateli usnadní práci s aplikací a ušetří čas strávený případným studiem jazyka XPath nebo sestavováním XPath výrazů.
52
Implementace
Mozilla Firefox V prohlížeči Mozilla Firefox (verze 20.0.1 a starší) potřebná funkce na získání XPath výrazu není. Avšak po nainstalování rozšíření Firebug sloužícího zejména k ladění a editaci webových stránek získává prohlížeč novou funkcionalitu. Firebug umožňuje zobrazit hierarchický strom dokumentu, ve kterém se lze snadno orientovat. [6] Uživatel má dvě možnosti, jak k potřebným elementům stránky přistoupit. Prozkoumávání stromu dokumentu Stromem dokumentu, který zobrazuje hierarchii značek, lze procházet a zanořovat se hlouběji do dalších úrovní. Pokud uživatel ví, který element hledá, lze se k němu poměrně snadno pomocí průchodu úrovněmi dostat. Tato operace však může u špatně strukturovaných souborů trvat i několik minut. Prozkoumat prvek Vše co musí uživatel udělat je kliknout pravým tlačítkem na text stránky, který představuje například identifikátor produktu nebo jeden z jeho atributů, a v nabídce zvolit položku Prozkoumat prvek. Tímto se ve stromu dokumentu dostává přímo k požadovanému elementu. Tento způsob je jednodušší, rychlejší a proto uživatelům doporučovaný. Po pravém kliknutí myši na požadovaný element z nabízených voleb uživatel zvolí položku Kopírovat XPath. Do schránky se zkopíruje absolutní XPath cesta k elementu a v aplikaci ji uživatel vloží do formuláře pro definici atributů produktu. Google Chrome Do prohlížeče Google Chrome není potřeba instalovat žádná další rozšíření. Už v jeho základu je připraven nástroj DeveloperTools, který nabízí v podstatě stejné funkce jako již zmíněný Firebug. [2] Pro přístup k elementům lze zvolit jeden z možných postupů jako u prohlížeče Mozilla Firefox, s tím rozdílem, že místo položky Prozkoumat prvek uživatel volí po pravém kliknutí na text z nabídky položku Zkontrolovat prvek. Po zkopírování XPath cesty elementu volbou Copy XPath, se oproti Firebugu do schránky nezkopíruje absolutní cesta ale cesta relativní. Uvádím příklad absolutní a relativní cesty odkazující na stejný element stránky zobrazující jejich rozdíl.
/html/body/div/div[2 ]/div[3]/d iv/div[6]/ div/h1 (1) // * [@id =" contentdetail" ]/h1 Relativní podoba XPath cesty je úspornější a její použití částečně řeší problém různé struktury zpracovávaných souborů stejného webu. Jedná se o situaci, kdy je před sledovaný elementem ve zdrojovém kódu stránky přidán element další.(2)
Implementace
Obr. 12
53
Ukázka vybraných produktů stejného webu
Na obrázku 13 lze vidět, že před cenou produktu včetně DPH, kterou uživatel může sledovat, se v případě prvního produktu nachází navíc informace o doporučené maloobchodní ceně (MOC). Ve zdrojovém kódu stránek těchto dvou produktů rozdíl znamená dva elementy div navíc před sledovaným elementem ceny. Z tohoto důvodu bude mít element s cenou každého produktu jinou absolutní XPath cestu, která musí být při hromadném zpracování jednotná.
/html/body/div[2]/div/div[3]/ div[3]/div [2]/div[16] (3) /html/body/div[2]/div/div[3]/ div[3]/div [2]/div[14] U webů, které mají zdrojový kód dobře strukturovaný a používají pro elementy obsahující informace o produktech atribut id v takové míře, že se podle něj dají identifikovat jednotlivé položky produktů (např. cena produktu se nachází v elementu s id=‘price‘), budou relativní XPath cesty s větší pravděpodobností odkazovat na stejné elementy na všech stránkách webu. I z tohoto důvodu je Google Chrome doporučován jako nejvhodnější webový prohlížeč pro tuto aplikaci.
54
4.3.2
Implementace
Dynamický formulář definice atributů produktu
Pro zadávání dalších volitelných atributů produktu jsem vytvořil dynamický formulář, který využívá rozšíření Nette Frameworku s názvem Replikátor formulářových kontejnerů. [19] Pro přidávání a odebírání atributů jsem s pomocí tohoto rozšíření využil technologie AJAX, která zde umožňuje snadnou a dynamickou manipulaci s formulářovými prvky bez nutnosti znovunačtení a překreslení celé stránky. Jako součást tohoto formuláře jsem stejně jako u povinných atributů produktu (identifikátor, cena) implementoval i část pro případnou úpravu výsledných hodnot XPath výrazů, pomocí kterých lze výsledek před uložením do databáze modifikovat.
Obr. 13
Ukázka formuláře pro přidávání atributů produktu
4.3.3
Ukazatel průběhu zpracování
Zpracování všech souborů zrcadla webu je operace, která může trvat i několik desítek minut. Délka trvání se odvíjí od počtu zpracovávaných souborů a rychlosti serveru, kde je aplikace provozována. Uživateli zobrazuji pomocí ukazatele průběhu informaci o stavu zpracování a také informace o počtu doposud zpracovaných produktů, počtu produktů nových a také počtu nových cen a nezpracovaných souborů. (4)
Implementace
Obr. 14
55
Ukazatel průběhu zpracování
Ukazatel průběhu jsem implementoval pomocí prvku <progress>, který byl představen v jazyku HTML5. Hodnotu ukazatele průběhu spolu s ostatními informacemi o průběhu zpracování pravidelně každých 5 sekund s využitím technologie AJAX získávám pomocí javascriptové funkce poll(), která je spouštěna po zahájení zpracování. function poll() { $.get({link insert! 'id_firmy' => $id_firmy}, function(payload){ $("#novych_produktu").text(payload.novych_produktu); $("#novych_cen").text(payload.novych_cen); $(".souboru_chybovych").text(payload.souboru_chybovych); $("#zpracovano_produktu").text( 'celkem'+payload.souboru_zpracovano+' produktů'); $("#dokonceno").text(payload.dokonceno); progressBarUpdate(payload.dokonceno); if(payload.dokonceno < 100){ window.setTimeout(poll,5000); } }); }
Funkce příslušného presenteru zpracovávající signál insert, vrací funkci $.get() data získaná z databáze. Jako zdroje dat jsou zde využity tabulky progress, nove_produkty a nove_ceny. Uživatel může v průběhu operace zpracování stále libovolně pracovat s aplikací a po jejím dokončení prohlížet nově získaná data.
56
4.3.4
Implementace
NiftyGrid
Pro zobrazení tabulkových dat z databáze a jejich modifikaci jsem využil komponentu Nette Frameworku NiftyGrid jejímž autorem je Jakub Holub. Komponenta nabízí plnou AJAXovou podporu, která uživateli zpříjemňuje práci s daty. NiftyGrid umožňuje data filtrovat pomocí speciálních vzorů20, dále umožňuje řazení a filtrování záznamů, jejich stránkování a editaci přímo uvnitř vykreslené tabulky. [17] Pro zobrazení přehledu uživatelů, kteří jsou do systému přidávání pomocí samostatného formuláře, jsem v komponentě nastavil validační pravidla pro položky email a telefon uživatele, které jsou kontrolovány pomocí regulárních výrazů pro ověření jejich platného tvaru. Uživateli umožňuji upravovat údaje o jednotlivých uživatelích systému přímo v komponentě, pouze ke změně hesla uživatele slouží v aplikaci samostatný formulář, který je od této komponenty oddělen.
Obr. 15
Využití NiftyGrid pro práci s uživateli systému
Do komponenty zobrazující uživatelem sledované firmy jsem kromě editace údajů a odstranění firmem zakomponoval i jejich přidávání. Při zadávání údajů se zde kontroluje jejich povinnost a u URL adresy webu e-shopu firmy její platný tvar. Do přehledu firem jsem zařadil i rychlé odkazy na další funkce systému jako jsou Zrcadlení webu firmy, Aktualizace produktů firmy a Zobrazení nových produktů a cen firmy. U jednotlivých firem je kromě priority, názvu firmy a URL jejího webu e-shopu uživateli navíc zobrazován počet produktů, které jsou pro danou firmu v systému sledovány, spolu s počtem nových produktů, které u firmy přibyly od posledního zpracování zrcadla webu, a počtem nových cen, které se u produktů od posledního zpracování změnily.
20 vzory pro
filtrování textu: ‘TEXT’ (obsahuje TEXT), ‘TEXT%’ (začíná na TEXT), ‘%TEXT’ (končí na TEXT); vybrané vzory pro filtrování čísel: ‘1’ (přesně 1), ‘>1’ (větší než 1), ‘<=1’ (menší nebo rovno 1)
Implementace
Obr. 16
57
Využití NiftyGrid pro práci s firmami
Kromě zobrazení přehledu firem a uživatelů jsem komponentu NiftyGrid použil také pro vykreslení tabulky, kde uživatel porovnává ceny a další atributy produktů s produkty konkurence. Zde se dají nejvíce využít možnosti filtrování dat, pomocí kterých uživatel snadněji nalezne hledané produkty. NiftyGrid umožňuje filtrovat data současně podle více sloupců a na tyto vyfiltrovaná data dále aplikovat různé způsoby řazení. Pro každý produkt je zde možné zobrazit si i jeho další atributy (např. počet kusů skladem). Porovnávání produktů je částí aplikace, která je pro uživatele zdrojem cenných informací, které pomocí srovnávání získává. Zde zjišťuje, jak se liší jeho nabídka od nabídky konkurence. Umožňuji uživateli zobrazit nejen srovnání konkurenčních produktů s jeho vlastními produkty, ale také zobrazit produkty, které mají konkurenční firmy navíc. Spolu s údaji o cenách produktů lze v aplikaci navíc libovolně zobrazit další sloupce s daty, které mají určitou vypovídající hodnotu o stavu cen. Jedná se o údaje o maximální, minimální a průměrné ceně každého produktu, které jsou při získávání dat z databáze agregovány. Spolu s těmito údaji dopočítávám a zobrazuji hodnotu představující rozdíl mezi agregovaným údajem a cenou produktu firmy, která je určena jako firma primární. U jednotlivých produktů zelenou barvou zvýrazňuji cenu, která je pro daný produkt u všech sledovaných firem nejnižší a barvou červenou naopak cenu nejvyšší. Pomocí tohoto zvýraznění a porovnání s agregovanými údaji například o průměrné ceně produktů uživatel přehlednou formou získává informace o svém postavení vůči konkurenčním firmám. Při srovnávání produktů je v přehledu vždy na prvním místě zobrazována firma, která je primární (má nejnižší hodnotu priority). Změnou priorit firem uživatel získává možnost sledovat situaci na trhu z pohledu jiné konkurenční firmy a vytvářet si tak představu o tom, jak situace na trhu se sledovanými produkty vypadá z pohledu ostatních konkurentů.
58
Implementace
4.4 Model pro řízení práv a přístupů Pro ověření zda májí uživatele práva k přístupu do jednotlivých částí systému, či práva provádět určité akce jsem vytvořil model, který implementuje třídu Nette\Security\IAuthorizator a pomocí ACL21 vrstvy provádí řízení práv a přístupů uživatelů. Po nadefinování rolí uživatelů systému, u kterých jsem využil možnost dědičnosti rolí, jsem definoval zdroje, ke kterým mohou uživatelé přistupovat. Nakonec jsem definoval pravidla, která určují, kdo může s jakým zdrojem co provádět. S využitím toho způsobu řízení přístupu a práv je velice snadné definovat v případných dalších verzích systému další nové role. Určitá nevýhoda tohoto přístupu je v nutnosti definovat pravidla pro všechny existující zdroje (v níže uvedeném kódu názvy zdrojů odpovídají názvům presenterů) a akce spolu s nutností předefinování při změně názvů akcí či zdrojů. use Nette\Security as NS; class AccessControlList implements NS\IAuthorizator { private $acl = null; public function __construct() { $this->acl = new Nette\Security\Permission; $this->acl->addRole('guest'); $this->acl->addRole('authenticated','guest'); $this->acl->addRole('uživatel','authenticated'); $this->acl->addRole('admin', 'uživatel'); $this->acl->addRole('správce', 'uživatel'); $this->acl->addResource('sign'); $this->acl->addResource('product'); $this->acl->addResource('company'); $this->acl->addResource('homepage'); $this->acl->addResource('user'); $this->acl->allow('guest','sign',array('in')); $this->acl->allow('authenticated','homepage',array('default')); $this->acl->allow('authenticated','product', array('default','show','showMyProducts')); $this->acl->allow('authenticated','company', array('default','show'));
21
Access Control List – seznam pravidel řídících identifikaci a přístup k určitému objektu
Implementace
59
$this->acl->allow('správce',NS\Permission::ALL,NS\ Permission::ALL); $this->acl->deny('správce','user',array ('show,default')); $this->acl->allow('admin',NS\Permission::ALL,NS\Permission::ALL); } public function isAllowed($role, $resource, $privilege) { return $this->acl->isAllowed($role, $resource, $privilege); } }
4.5 Instalace systému Ke zprovoznění systému ADETA je zapotřebí webový server s PHP 5.3.0 nebo vyšší, což je minimální požadavek použité 2.0.7 verze Nette Frameworku. Další minimální požadavky na nastavení serveru, které jsou nutné pro správnou funkci Nette, jsou dostupné na stránkách frameworku22. Před instalací systému je doporučeno tato nastavení zkontrolovat pomocí skriptu checker.php, který je součástí distribuce Nette Framework. Další z nutností pro úspěšnou činnost systému ADETA je knihovna Tidy jako rozšíření PHP a je potřeba aby použitý webový server toto rozšíření podporoval. Na serveru musí být také povolena funkce exec() spouštějící příkaz wget, který je standardní součástí linuxových serverů avšak na Windows Server je potřeba program wget doinstalovat. Je nutné vybrat server, který poskytuje dostatek úložného prostoru pro stahování zrcadel webů konkurenčních firem, jejichž velikost může dosahovat řádově od desítek MB až po několik GB. Uživatel při zavádění systému na server v konfiguračním souboru definuje informace o databázi (typ databáze, název databáze, uživatelské jméno a heslo). Databázová vrstva dibi je přenositelná mezi různými databázovými servery, aplikace však byla testována pouze na serveru MySQL.
22
http://doc.nette.org/cs/requirements
Závěr
61
5 Závěr Na základě stanovených cílů jsem nejdříve prozkoumal současné možnosti majitelů e-shopů v oblasti sledování produktů svých konkurenčních subjektů. Dále jsem popsal technologie využitelné k řešení problematiky hromadného srovnávání produktů. Následně jsem navrhl a pomocí vhodných technologií implementoval srovnávací systém, který řeší určité nedostatky současných systémů pro srovnávání produktů. Stanovené cíle byly naplněny a výsledkem práce je systém ADETA, který oproti stávajícím systémům pro sledování produktů konkurence, zaměřujících se především na srovnávání cen, umožňuje správci e-shopu přehledně porovnávat kromě ceny i další libovolné atributy svých produktů se zvolenou konkurencí. Vytvořený systém navíc umožňuje správci e-shopu sledovat situaci na trhu z pohledu jiné konkurenční firmy a na základě údajů získaných porovnáním atributů produktů poskytuje informace, podle kterých může uživatel v budoucnu upravovat svou cenovou politiku a to nejen formou zlevňování svých produktů, ale také zvyšováním cen vybraných produktů a tím dosahovat růstu svého zisku. Systém ADETA jsem implementoval formou webové aplikace, jejíž testovací verze je dostupná na http://adeta.php5.cz/www/. Po přihlášení pod rolí administrátora systému, oprávněného pro přístup do všech částí aplikace, je možné všechny tyto části prozkoumat. Pouze stahování zrcadel webů není z bezpečnostních důvodů v této verzi aplikace povoleno. Aplikace je optimalizována pro internetový prohlížeč Google Chrome. Přihlašovací údaje - login: admin, heslo: 773F91Xm Oproti současným srovnávacím systémům, klade ADETA na uživatele větší nároky a aktuálnost výsledků srovnání produktů se odvíjí od množství aktualizací atributů produktů prováděných samotným uživatelem. Veškeré operace v systému iniciuje uživatel a sám tak ručí za získaná data. Určitou nevýhodou systému je také absence možnosti exportu výsledků srovnávání. Systém je výhledově možné rozšířit například o import vlastních produktů uživatele do aplikace, provádění stahování zrcadel e-shopů automaticky v určitých časových intervalech, statistiky o vývoji cen produktů v čase, export výsledků srovnání nebo důmyslnější algoritmus pro párování produktů.
Literatura
63
6 Literatura [1]
Čtení a manipulace s XML dokumentem. KOSEK, JIŘÍ. XML API [online]. 2002 [cit. 2013-05-15]. Dostupné z: http://www.kosek.cz/xml/api/ [2] DevTools. GOOGLE DEVELOPERS. Chrome DevTools [online]. 2013 [cit. 2013-05-08]. Dostupné z: https://developers.google.com/chrome-developer-tools [3] Dibi. Database Abstraction Library for PHP 5 [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://dibiphp.com/cs/ [4] DOMDocument. PHP. DOMDocument Introduction [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://php.net/manual/en/class.domdocument.php [5] DOMXPath. PHP. DOMXPath Introduction [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://php.net/manual/en/class.domxpath.php [6] Firebug. MOZILLA CORPORATION. Doplňky aplikace Firefox [online]. 2013 [cit. 2013-05-08]. Dostupné z: https://addons.mozilla.org/cs/firefox/addon/firebug/ [7] HOGAN, BRIAN P. HTML5 a CSS3: výukový kurz webového vývojáře. Vyd. 1. Brno: Computer Press, 2011, 272 s. ISBN 978-80-251-3576-1. [8] HTML DOM. W3. HTML DOM Introduction [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://www.w3schools.com/htmldom/ [9] HTML Tidy Project Page. HTML Tidy library [online]. 2008 [cit. 2013-5-08]. Dostupné z: http://tidy.sourceforge.net/ [10] Iconv. PHP. Iconv manual page [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://www.php.net/manual/en/function.iconv.php [11] Introduction to GNU Wget. GNU. Wget [online]. 2011 [cit. 2013-04-25]. Dostupné z: http://www.gnu.org/software/wget [12] Jak funguje sledování cen konkurence. KARSA TECHNOLOGIES. Karsa monitor: Aplikace pro sledování a porovnávání cen konkurence [online]. 2013 [cit. 2013-05-04]. Dostupné z: http://www.karsa-monitor.cz/article/1/jak-to-funguje [13] KOSEK, JIŘÍ. PHP a XML. 1. vyd. Praha: Grada, 2009, 367 s. ISBN 97880-247-1116-4. [14] MURACH, MIKE a ZAK RUVALCABA. Murach's JavaScript and jQuery. Vyd. 1. United States of America: Mike Murach & Associates, Inc., 2012, 616 s. ISBN 978-1-890774-70-7. [15] MVC aplikace & presentery. NETTE FOUNDATION. Nette Framework: Dokumentace [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://doc.nette.org/cs/presenters
64
Literatura
[16] Nejčastější kódování. Čeština na webu v HTML [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://www.jakpsatweb.cz/cestina.html [17] NiftyGrid. HOLUB, Jakub. Nette Framework: Doplňky [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://addons.nette.org/cs/niftygrid [18] RAGGETT, DAVE. Clean up your Web pages with HTML TIDY. W3 [online]. 2011 [cit. 2013-05-04]. Dostupné z: http://www.w3.org/People/Raggett/tidy/ [19] Replikátor formulářových kontejnerů. PROCHÁZKA, Filip. Nette Framework: Doplňky [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://addons.nette.org/cs/form-container-replicator [20] ROCHE, XAVIER. Httrack: Website Copier. Httrack Website Copier [online]. 2013 [cit. 2013-05-04]. Dostupné z: http://www.httrack.com/ [21] SAX. Official website for SAX [online]. 2004 [cit. 2013-05-08]. Dostupné z: http://sax.sourceforge.net/ [22] Seznámení s Nette Frameworkem. NETTE FOUNDATION. Nette Framework: Dokumentace [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://doc.nette.org/cs/getting-started [23] SKONNARD, AARON a MARTIN GUDGIN. XML - pohotová referenční příručka: referenční příručka programátora ke XML, XPath, XSLT, XML Schema, SOAP a dalším. 1 vyd. Překlad Lucie Rút Bittnerová. Praha: Grada, 2006, 342 s. ISBN 80-247-0972-4. [24] Sledování a porovnání cen konkurence. E-SOLUTIONS. Price-checking: O aplikaci [online]. 2012 [cit. 2013-05-04]. Dostupné z: http://www.pricechecking.cz/ [25] Stav e-comerce v ČR. Shoptet [online]. 2012 [cit. 2013-05-05]. Dostupné z: http://www.shoptet.cz/stav-e-commerce-v-cr/ [26] STENBERG, DANIEL, DAN FANDRICH a YANG TSE. curl groks URLs. Curl and libcurl [online]. 2013 [cit. 2013-05-04]. Dostupné z: http://curl.haxx.se/ [27] URBANOVÁ, IZABELA. Studie E-commerce 2012. Gemius SA [online]. 2012-10-04 [cit. 2013-05-04]. Dostupné z: https://cz.gemius.com/cz/novinky/2012-10-04/01 [28] Wget 1.13.4 Manual. GNU. Wget [online]. 2011 [cit. 2013-05-04]. Dostupné z: http://www.gnu.org/software/wget/manual/wget.html [29] XML Path Language. W3. XML Path Language (XPath) [online]. 1999 [cit. 2013-05-04]. Dostupné z: http://www.w3.org/TR/xpath/
Přílohy
65
Přílohy
66
Náhledy vybraných částí aplikace
A Náhledy vybraných částí aplikace
Obr. 17
Ukázka části aplikace pro srovnávání produktů
Náhledy vybraných částí aplikace
Obr. 18
Ukázka části aplikace pro zrcadlení webu
67