1 České vysoké učení technické v Praze Fakulta elektrotechnická Diplomová práce SEO Monitor Bc. David Kubát Vedoucí práce: Ing. Viktor Černý Studijní ...
České vysoké učení technické v Praze Fakulta elektrotechnická
Diplomová práce
SEO Monitor Bc. David Kubát
Vedoucí práce: Ing. Viktor Černý
Studijní program: Elektrotechnika a informatika strukturovaný magisterský Obor: Informatika a výpočetní technika květen 2011
~2~
KAPITOLA: Seznam obrázků
Poděkování Rád bych poděkoval vedoucímu mé diplomové práce Ing. Viktoru Černému za poskytnutí konzultací a připomínek v rámci tvorby diplomové práce. Dále děkuji Ing. Davidu Kantovi a Ing. Jaroslavu Petchovi za umoţnění vzniku aplikace, podporu a testování.
Prohlášení Prohlašuji, ţe jsem svou diplomovou práci vypracoval samostatně a pouţil jsem pouze podklady uvedené v přiloţeném seznamu. Nemám závaţný důvod proti uţití tohoto školního díla ve smyslu 60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Praze dne 1.3.2011
………………………………………….
~4~
KAPITOLA: Seznam obrázků
Abstract The goal of this work is to implement internet application for monitoring keywords in searchers. Application offers management of users and watching data and offers well arranged outputs in a form of tables and graphs.
Abstrakt Cílem práce je implementace internetové aplikace pro sledování klíčových slov ve vyhledávačích. Aplikace nabízí správu uţivatelů a sledovaných dat a poskytuje přehledné výstupy ve formě tabulek a grafů.
Obsah Seznam obrázků ......................................................................................................................................iii 1
Popis jednotlivých metod .................................................................................................................. 27 Fáze výkonná (execution) .............................................................................................................. 27 Fáze změn vnitřních stavů (interaction) ........................................................................................ 27 Fáze vykreslovací (rendering)....................................................................................................... 27 Fyzické vykreslení šablony ........................................................................................................... 28 Ukončení činnosti (shutdown) ....................................................................................................... 28 6.2.2
Seznam citované literatury ........................................................................................................ 47
ii
Seznam obrázků Obrázek 3-2: Úvod .................................................................................................................................. 7 Obrázek 3-1: hlavní menu ....................................................................................................................... 7 Obrázek 3-3: Porovnání pozic ................................................................................................................. 9 Obrázek 3-4: Vyhledání pozice ............................................................................................................. 10 Obrázek 3-6:Ukázka grafu vývoje klíčového slova .............................................................................. 12 Obrázek 3-5: Nastavení grafu................................................................................................................ 11 Obrázek 4-1: SEO Servis - pozice ve vyhledávačích ........................................................................... 15 Obrázek 4-2: SEO nástroje - pozice ve vyhledávačích ......................................................................... 16 Obrázek 5-1: Nette "laďenka" ............................................................................................................... 17 Obrázek 5-2: Schéma databáze ............................................................................................................. 18 Obrázek 6-1: Model-View-Presenter .................................................................................................... 25 Obrázek 6-2: Ţivotní cyklus presenteru ................................................................................................ 26 Obrázek 6-3: BasePresenter .................................................................................................................. 29 Obrázek 6-4: PositionModel.................................................................................................................. 31 Obrázek 6-5: Captcha ............................................................................................................................ 32 Obrázek 6-6: Proxy model .................................................................................................................... 33 Obrázek 6-7: Periodické hledání pozic slov .......................................................................................... 40
iii
KAPITOLA: Úvod
~1~
1 Úvod Mezi nejdůleţitější metody marketingu patří SEO optimalizace. SEO (Search Engine Optimization, optimalizace pro vyhledávače) je metodika vytváření a upravování webových stránek takovým způsobem, aby jejich forma a obsah byly vhodné pro automatizované zpracování v internetových vyhledávačích. Cílem pak je získat ve výsledku hledání ve vyhledávačích, které odpovídá obsahu, pro danou webovou stránku vyšší pozici a tím četnější a zároveň cílené návštěvníky [1]. Mnoho společností zabývajících se E-marketingem si nechává od klientů platit za SEO optimalizaci stránek. Platí se za dosaţené výsledky, které musí být měřitelné. Měřítkem úspěchu je dosaţení určité pozice ve fulltextovém vyhledávání ve vyhledávači. Cílem je dostat klientovu doménu na co nejvyšší pozici. Nejvyšší pozice je v tomto případě 1. pozice, tj. po zadání klíčového slova se klientova doména objeví jako 1. Kaţdá optimalizace se provádí pro dvojici klíčové slovo a doména. Zadání klíčového slova do vyhledávače vrací seznam domén odpovídajících zadanému slovu. Pro tuto práci není nijak důleţité, jakým způsobem vyhledávač určí pořadí a jaké domény vypíše. Hlavním důvodem vzniku této práce je potřeba měření pozic domén ve výsledcích hledání klíčového slova. Toto měření musí probíhat kaţdodenně a z naměřených dat počítat cenu, kterou klient bude na konci měsíčního období platit za dosaţené pozice jeho domény ve fulltextovém hledání.
~2~
KAPITOLA: Úvod
KAPITOLA: Řešený problém a požadavky
2
~3~
Řešený problém a poţadavky
2.1 Popis řešeného problému Kaţdodenní měření pozic ve vyhledávačích je potřeba realizovat robotem, který se bude vyhledávačů ptát na pozici domény pro klíčové slovo. Jelikoţ slovo nemusí být na první stránce, kterou vyhledávač vrátí, musí se robot zeptat, zda je na druhé, třetí, čtvrté… stránce. Je zřejmé, ţe pro kaţdé slovo můţe být například 10 hledání, neţ se rozhodne, ţe pozice domény není nalezena. V případě, ţe se bude hledat 1000 slov pro různé domény a ani jedna z nich nebude nalezena, proběhne na vyhledávači 10 x 1000 = 10 000 dotazů bezprostředně za sebou. Jedná se o velikou zátěţ, které se pochopitelně vyhledávače brání a zavádějí opatření, která robotům zabrání v takovémto počínání. Řešení měření pozic je největším problémem se kterým se aplikace musí vypořádat. Vzhledem k tomu, ţe poskytovatelé vyhledávání občas mění vracené výsledky hledání, případně mění způsoby zabezpečení proti robotům, nelze ţádné řešení povaţovat za trvalé. Aplikace musí být tedy snadno upravitelná, aby se mohla velmi rychle přizpůsobit novým ochranným opatřením vyhledávačů. Parsování výsledků musí být taktéţ snadno upravitelné. Následné zpracování dat vyţaduje sloţité SQL dotazy, které jsou sice obtíţné na vyřešení, nicméně jakmile jsou jednou napsány, budou spolehlivě slouţit. Kaţdý den se měří několik set dvojic klíčové slovo – doména a kaţdé hledání můţe vrátit několik pozic. Denně se do databáze uloţí cca 1500 naměřených pozic, v budoucnu jich můţe být i mnohem víc. SQL dotazy tedy musí být optimalizovány pro rychlost, jelikoţ budou pracovat s poměrně velkým mnoţstvím dat a aplikace je bude volat třeba i několikrát během jednoho načtení stránky (například kvůli stránkování). 2.2 Vymezení cílů práce Cílem práce je vytvořit aplikaci, která bude sledovat klíčová slova ve vyhledávačích. Konkrétně se jedná o vyhledávače seznam.cz, google.cz, google.com a google.de. Aplikace musí řešit správu těchto slov a umoţňovat nastavení parametrů kaţdého slova. Hledá se vţdy pozice domény vůči klíčovému slovu. Ze získaných údajů se bude počítat cena klíčového slova podle umístění ve vyhledávači. Aplikace musí být přístupná z internetu, aby do ní mohli přistupovat klienti z celého světa. Hlavním cílem je kaţdodenní sbírání pozic klíčových slov a výpočet ceny za dosaţené pozice. 2.3
Poţadavky na implementovaný systém
2.3.1 Funkční poţadavky Následuje seznam funkčních poţadavků aplikace: Automatické sledování pozic slov Kaţdý den ráno se spustí skript, který zjistí aktuální pozici všech sledovaných slov a uloţí výsledky do databáze pro další zpracování. Vyhledávat se bude pouze v jednom ze čtyř vyhledávačů: seznam.cz, google.cz, google.com a google.de. U kaţdého slova bude moţnost
~4~
KAPITOLA: Řešený problém a požadavky
zvolit si, které vyhledávače se pro něj mají sledovat. U vyhledávače společnosti Google se nebudou započítávat katalogové zápisy (záznamy z aplikací Google a placené reklamy). Výpis pozice slov v libovolném dni Uţivatel bude mít moţnost vybrat si pozice klíčových slov pro libovolný den. Vybere si datum a dostane přehledný výpis pozic. Rozdělení klíčových slov do projektů Klíčová slova se budou vkládat k projektům. Aplikace musí umoţňovat správu projektů, ke kterým se slova přiřazují. Přiřazení jedné nebo více domén k projektu Administrace musí umoţňovat spravovat a přiřazovat domény k projektům. Vůči těmto doménám se budou sledovat pozice klíčových slov projektů. Upřesňující nastavení projektů U kaţdého projektu bude moţnost nastavit některá obecná nastavení. Především se bude jednat o maximální počet stran vyhledávače, které se budou prohledávat. Například hodnota 10 udává, ţe pozice nalezeného slova bude menší neţ 100, protoţe všechny vyhledávače mají standardně nastaven výpis deseti slov na stranu. Dále se zde budou nastavovat sledované vyhledávače. Přiřazení projektů ke klientům Projekty se budou přiřazovat ke klientům, které aplikace umoţní spravovat. Jeden klient můţe mít libovolný počet projektů. Globální filtr projektů V rámci celé aplikace bude k dispozici jednoduchý filtr pro operace s klíčovými slovy v rámci vybraného projektu. Ve výpisech se budou zobrazovat pouze slova z vybraného projektu. Projekty budou seskupeny podle klientů. Správa uţivatelů Velmi důleţitou součástí aplikace bude správa uţivatelů. K uţivatelům se přiřazují projekty, které vidí ve výpisech a statistikách. Kaţdý uţivatel můţe být v roli administrátora, nebo klienta. Do aplikace smí přistupovat pouze aktivní uţivatelé. Porovnání pozic slov ve dvou dnech Modul porovnávání klíčových slov umoţní zobrazit si vedle sebe pozice slov projektu ve dvou dnech. V rámci tohoto výpisu se zobrazí i ikona symbolizující posun slov vůči sobě. Vyhledání aktuální pozice Pro ověření vyhledávání bude k dispozici moţnost zadat si libovolné slovo a doménu, vybrat si vyhledávač a nechat si vypsat aktuální pozici zadaného slova vůči doméně v příslušném vyhledávači. Kalkulátor - výpočet ceny za dosaţené pozice slov
KAPITOLA: Řešený problém a požadavky
~5~
V kalkulátoru se zobrazí ceny za dosaţené pozice slov. Slouţí pro měsíční fakturace klientů a je nutné, aby se daly pěkně vytisknout přímo z aplikace. Graf zobrazující vývoj pozic klíčového slova Pro přehledné zobrazení vývoje klíčového slova bude slouţit modul grafy. V tomto modulu si uţivatel bude moci vybrat slovo, vyhledávač a období, ve kterém chce vidět vývoj pozic. Součástí bude i moţnost výběru z několika druhů grafů. Ceník slov Slouţí pouze pro přehledný výpis cen slov klientům. Vypíšou se zde všechna klíčová slova všech projektů přiřazených přihlášenému uţivateli a jejich ceny. Export výpisů Kaţdý tabulkový výpis bude moţné vyexportovat do CSV souboru pro snadnou archivaci. Mini nápovědy Na kaţdé stránce bude prostor, do kterého se budou umisťovat upozornění, tipy a triky vhodné pro zobrazenou stránku. 2.3.2 Identifikace uţivatelů Host je uţivatel, který neprošel přihlášením. Nemá ţádná oprávnění, nesmí nic vidět ani editovat. Můţe se pouze přihlásit a tím změnit svou roli. Klient je přihlášený uţivatel, který má právo pro poţadovanou akci (zobrazit, editovat, smazat, přesunout, aktivovat, přepnout projekt,…) Administrátor je hlavní správce, který má všechna dostupná oprávnění. 2.3.3 Poţadavky na personalizaci Host – vidí pouze přihlašovací stránku. Klient – vidí pouze jemu přiřazené projekty. Nevidí administraci a vyhledávání klíčových slov. Ve výpisu pozic slova nevidí sloupec splněno. Taktéţ nevidí nápovědy a odkazy, které pro něho nejsou přístupné. Administrátor – vidí všechny moduly, všechny projekty, všechny odkazy. Není nijak omezen. 2.3.4 Ostatní poţadavky Pouţitelnost: srozumitelnost, snadná obsluhovatelnost a atraktivnost aplikace Dostupnost: 99 %. Škálovatelnost: moţnost zvyšovat výkon aplikace úpravou modelu Bezpečnost: ochrana osobních údajů silou ověřovacích mechanismů, ukládáním hesel. Rozšiřitelnost: Základní jednotkou aplikace je modul. Je snadné přidat nový modul a snadno vytvořit jinou variantu jiţ existujícího modulu s plnou integrací do systému.
~6~
KAPITOLA: Řešený problém a požadavky
KAPITOLA: Popis struktury práce
3 3.1
~7~
Popis struktury práce Hlavní menu
Obrázek 3-1: hlavní menu
Hlavní menu se skládá z následujících částí: Úvod – zobrazuje pozice klíčových slov ve vybraném dni Porovnání – porovnává pozice klíčových slov vybraného projektu ve dvou dnech Vyhledání pozice – vyhledá pozici klíčového slova vůči vyhledávači Kalkulátor – přehled plateb za splněné pozice Grafy – vývoj pozic klíčových slov v měsíčních obdobích Ceník – ceník za dosaţené pozice klíčových slov Administrace – administrace uţivatelů, domén, klíčových slov a ostatních nastavení
3.2 Úvod V přehledné tabulce tato sekce zobrazuje pozice klíčových slov.
Obrázek 3-2: Úvod
Tabulka obsahuje následující sloupce: Klíčové slovo – text klíčového slova. V závorce se u placených slov zobrazuje cena za dosaţení 1. Aţ 5. Pozice Pozice – pozice ve vyhledávači. Obsahuje číslo určující pozici, nebo hodnotu „nenalezeno“ pokud slovo nebylo nalezeno do nastavené hloubky vyhledávání. Splněno – u placených slov se zobrazuje slovo „ano“, pokud je splněna placená pozice (slovo se umístilo do 10. místa ve fulltextovém vyhledávání v příslušném vyhledávači). Pokud je slovo placené a je na pozic vyšší neţ 10, zobrazí se zde
~8~
KAPITOLA: Popis struktury práce
hodnota „ne“. Pokud není nic uvedeno, znamená to, ţe dané slovo není placené. V takovém případě nebude u klíčového slova v závorce cena. Vyhledávač – název vyhledávače, ve kterém byla pozice nalezena Doména – jméno domény, vůči které byla pozice slova ve vyhledávači hledána Nalezená stránka – odkaz na konkrétní stránku, která byla nalezena Čas měření – datum a čas měření pozice Akce – sloupec pro akce přiřazené k příslušnému řádku. Umoţňuje pouze akci obnovit pozici. Po klepnutí znovu vyhledá pozici klíčového slova a aktualizuje záznam v databázi. Vypsané pozice lze filtrovat několika způsoby. Stejně jako v kaţdé části aplikace i zde se uplatňuje filtr projektů v pravé horní části pod logem. Pokud je filtr vybrán, zobrazují se pouze klíčová slova k vybranému projektu. Dále lze filtrovat výsledky podle hodnot ve sloupcích. Vybere se hodnota v roletkovém menu pod názvem sloupce. Klepnutím na „Nastavit filtry“ se filtry aplikují a výpis se omezí pouze na vybrané hodnoty. Kaţdý sloupec lze řadit klepnutím na šipku vedle názvu sloupce. Klepnutím na šipku směřující vzhůru se sloupce seřadí podle abecedy vzestupně (od a do z). Šipka směřující dolů sloupec seřadí sestupně (od z do a). Čas měření se zadává z klávesnice. Klepnutím na název sloupce se tabulka seřadí vzestupně podle tohoto sloupce. Dalším klepnutím se seřadí sestupně, třetí klepnutí aktivuje řazení opět vzestupně. Komponenta umoţňuje řazení i podle více sloupců. Provádí se to postupným klepnutím na řazení sloupců. Například pokud se má tabulka nejprve řadit podle vyhledávače a poté podle pozice, je třeba nejprve klepnout na řazení u sloupce vyhledávač a poté na řazení u sloupce pozice. K dispozici jsou ještě dva filtry. Filtr „zobrazit všechny pozice slova“ přidá do výpisu duplicitní domény. Během hledání klíčového slova se můţe stát, ţe je slovo pro doménu nalezeno na několika pozicích. Například slovo „pampeliška“ pro doménu „pampeliska.cz“ ve vyhledávači „seznam.cz“ můţe být nalezeno na 1. (http://www.pampeliska.cz/), 2. (http://ubytovani.pampeliska.cz/leto/), 4. (http://turistika.pampeliska.cz/) a 6. pozici (http://chaty-chalupy.pampeliska.cz/. Standardně zobrazí pouze 1. pozice (http://www.pampeliska.cz/), zapnutím filtru „zobrazit všechny pozice slova“ se zobrazí i zbytek. Druhým stavem filtru je „skrýt všechny pozice slova“, který vrací stav zpět. Druhým filtrem je odkaz „zobrazit všechny výsledky“. Ke klíčovému slovu je moţnost přiřadit více domén, proto se naleznou pozice ke kaţdému klíčovému slovu a pro kaţdou doménu. Tímto filtrem lze výpis omezit pouze na nejlepší pozice. Například slovo „světlo“ můţe být přiřazeno k doménám „e-light.cz“ a „poselsvetla.cz“. Bude nalezena 1. pozice pro doménu „e-light.cz“ a 3. pozice pro „poselsvetla.cz“. Standardně se zobrazí pouze řádek s 1. pozicí. Zapnutím filtru se obrazí i pozice třetí. Stav lze vrátit klepnutím na „zobrazit nejlepší výsledky“. Tento stav se ukládá do databáze k uţivateli, takţe se pro daného uţivatele zachovává.
KAPITOLA: Popis struktury práce
~9~
3.3 Porovnání Sekce porovnávání slouţí k porovnání pozice slova ve dvou dnech. Pokud není vyfiltrován projekt v hlavním filtru pod logem, bude uţivatel poţádán o výběr projektu. Po vybrání projektu se pro něj zobrazí všechna klíčová slova a jejich pozice v dnešní den a před týdnem. Datum lze změnit v pravé horní části stránky.
Obrázek 3-3: Porovnání pozic
V tabulce se zobrazují následující sloupce: Klíčové slovo – název klíčového slova Vyhledávač – název vyhledávače, ve kterém byla pozice slova nalezena Datum1 – pozice slova v datu uvedeném v názvu sloupce Datum2 – pozice slova v datu uvedeném v názvu sloupce Posun – Rozdíl datum1 – datum2, určuje o kolik pozic se slovo posunulo. Před hodnotou rozdílu se zobrazuje ikona pro lepší vizuální přehled. Kladné číslo označuje posun k lepšímu a je tedy označen zelenou šipkou směřující vzhůru . Červená šipka směřující dolů značí propad slova na horší pozici . Nezměněnou pozici znázorňuje modrá horizontální čárka . Existují ještě dva speciální stavy oranţový symbol plus udávající výrazné zlepšení pozice, nastane v případě, ţe klíčové slovo bylo na horší neţ maximálně měřené pozici a následně se ocitlo mezi měřenými. Opačnou změnu představuje fialový symbol kříţku .
~ 10 ~
KAPITOLA: Popis struktury práce
3.4 Vyhledání pozice Tato stránka slouţí ke zjištění aktuální pozice. Do formuláře se zadá klíčové slovo, coţ můţe být libovolný řetězec, dále se zadá hledaný web a zvolí se vyhledávač. Zaškrtávací políčko „Pokračovat v hledání po prvním nalezení?“ určuje, zda se bude pokračovat v hledání i po prvním nalezení pozice. Standardně je odškrtnuto a hledá se pouze do prvního nalezení. Pokud se zaškrtne, bude se vţdy prohledávat maximální počet stránek vyhledávače (standardně 10, coţ odpovídá maximálně 100. pozici). Výsledky hledání se zobrazí v přehledné tabulce pod formulářem pro zadání. Obrázek 3-4: Vyhledání pozice
3.5 Kalkulátor Tato stránka představuje jednu z nejdůleţitějších částí aplikace. Slouţí k výpočtu cen za dosaţené pozice slov v daném období. Pro zobrazení dat je potřeba mít vybraný projekt. Ten lze jako v ostatních částech aplikace zvolit v roletkovém menu v pravém horní části pod logem. Pokud není vybrán konkrétní projekt, aplikace poţádá uţivatele o výběr projektu stejným roletkovým menu jako pod logem.
Obrázek 3-5: Modul kalkulátor
KAPITOLA: Popis struktury práce
~ 11 ~
Období, pro které se má zobrazit tabulka s kalkulacemi se vybírá v pravé horní části stránky. Období jsou rozdělena po měsících. Hlavní část stránky zabírá tabulka s cenami za dosaţené pozice. Tabulka se skládá z následujících částí: Klíčové slovo – sledované klíčové slovo Doména – sledovaná doména pro klíčové slovo Vyhledávač – v kterém vyhledávači se slovo sleduje 1-5 pozice – počet dnů, ve kterých bylo slovo nalezeno na první aţ páté pozici 6-10 pozice – počet dnů, ve kterých bylo slovo nalezeno na šesté aţ desáté Ostatní pozice – počet dnů, ve kterých bylo slovo nalezeno na horší neţ desáté pozici, nebo nenalezeno 1-5 pozice – cena za dosaţení 1. – 5. pozice v daném období 6-10 pozice – cena za dosaţení 6. – 10. pozice ve vybraném období Cena celkem – celková cena za slovo ve vybraném období Pod tabulkou v pravé části stránky se vypisuje celková cena za všechna slova. 3.6 Grafy Modul s grafy slouţí pro grafické znázornění vývoje klíčového slova za určité období. Před výpisem zobrazením grafu je nutné vybrat projekt. K tomu je uţivatel vyzván, pokud nemá projekt vybrán. Po zvolení projektu se vykreslí graf (Obrázek 3-7:Ukázka grafu vývoje klíčového slova) pro náhodné klíčové slovo a náhodný sledovaný vyhledávač. Pro správnou funkci grafu je nutné mít prohlíţeč s podporou technologií flash a javascript. Graf se vykresluje náhodným efektem, který se vybírá z několika moţností. Náhodně se volí efekt i doba jeho trvání. Horizontální osa grafu představuje dny ve zvoleném období a vertikální představuje pozici slova k příslušnému dni. Graf se nastavuje ve formuláři pod grafem. Kaţdou změnu je potřeba potvrdit klepnutím na tlačítko vykreslit graf. Formulář je rozdělen do čtyř částí.
Obrázek 3-6: Nastavení grafu
V první části se vybírá typ grafu. Typy jsou rozděleny do tří podkategorií: sloupce, plochy a čáry. Grafy mohou být různě dlouhé a husté podle nastavené počtu vyhledávačů k zobrazení a počtu změřených dní ve zvoleném období. Pro
~ 12 ~
KAPITOLA: Popis struktury práce
různá nastavení se můţe hodit jiný typ grafu. Dále různí uţivatelé preferují různé typy grafů.
Obrázek 3-7:Ukázka grafu vývoje klíčového slova
Ve druhé části se volí vyhledávače, které budou zakresleny do grafu. Je moţná zvolit jeden či více vyhledávačů. Pokud pro zvolený vyhledávač nejsou ţádná data, graf se nevykreslí a uţivatel je informován, ţe nejsou data k vykreslení. Při volbě více vyhledávačů, z nichţ jsou data jen pro některý, se vykreslí pouze vyhledávač, u kterého jsou nějaká data. Volba slova ve třetí části ovlivňuje, pro jaké slovo se budou data vykreslovat. Ke slovu je nutné vybrat i doménu, protoţe pozice jsou určeny právě touto dvojicí. Poslední, čtvrtá část formuláře slouţí k výběru období. Budou zobrazeny pouze slova z tohoto období. 3.7 Ceník Modul ceník slouţí k přehlednému výpisu cen slov klienta. Pomáhá klientovi udrţet si přehled o cenách za jeho klíčová slova. Pro moţnost filtrace obsahuje tabulka následující sloupce: Klíčové slovo – slovo, které se bude optimalizovat Projekt – projekt, do kterého klíčové slovo patří Vyhledávač – ke kterému vyhledávači se cena vztahuje Pozice – ke kterým pozicím se cena vztahuje Cena – kolik peněz se bude měsíčně platit za dosaţení pozice Akce – odkaz na graf vývoje slova
KAPITOLA: Popis struktury práce
~ 13 ~
Stejně jako všechny ostatní tabulky i tuto je moţné vyexportovat do souboru s formátem CSV, dále je moţné tabulky řadit podle sloupců a filtrovat výpis. 3.8
Administrace
3.8.1 Projekty Klepnutím na odkaz Projekty se zobrazí správa projektů. Na této stránce je moţné přidávat, editovat a mazat projekty. Klepnutím na „přidat projekt“ se zobrazí formulář pro přidání projektu. Ve formuláři je povinná poloţka Název. Zde můţe být libovolný textový řetězec s maximální délkou 255 znaků. Dále je nutné přiřadit projekt pod klienta. Klepnutím na tlačítko přidat se projekt vytvoří a přiřadí se pod vybraného klienta. Editace projektů funguje stejně. Do editace se vstupuje přes ikonu editace na řádku s výpisem projektů. Pro smazání projektu slouţí tlačítko smazat, které je lokalizováno hned vedle tlačítka pro editaci . Tato stránka slouţí i pro výběr projektu, stejně jako filtrem pod logem. Pro zobrazení podstránky projektu je nutné mít vybraný projekt. Pokud vybraný není, zobrazí se tato stránka. Na této stránce se projekt vybírá klepnutím na název projektu. 3.8.1.1 Správa projektu Správa projektu odkazuje na stránku editace aktuálně vybraného projektu. Z uţivatelského testování vyplynulo, ţe je potřebná na tomto místě. Dokud neexistovala, měli někteří uţivatelé problém s nalezením stránky pro editaci projektu. 3.8.1.2 Klíčová slova Stránka klíčová slova slouţí ke správě klíčových slov projektu. Slova je moţné přidávat, editovat a mazat. Vše funguje stejně jako pro projekty. Nové slovo se přidává klepnutím na „přidat slovo“. Editovat slovo lze klepnutím na tlačítko editovat nebo na název klíčového slova. Mezi klíčovým názvem klíčového slova a sloupcem s akcemi se zobrazují ceny za pozice ve sledovaných prohlíţečích. Sledované prohlíţeče se mění v sekci nastavení. Při editaci a přidávání klíčového slova se musí vyplnit název klíčového slova (textový řetězec, který bude vyhledáván ve vyhledávači) a skupina. Standardně je skupina nastavena na default. Pokud si uţivatel přeje zařadit slovo do jiné skupiny, musí nejprve skupinu vytvořit na stránce skupiny. Zaškrtávací pole „Zastavit po prvním nalezení?“ určuje, zda se budou hledat pozice i po prvním nalezení slova. Pokud je políčko zaškrtnuté (standardně je), tak se po prvním nalezení pozice hledání přeruší. Pokud jsou slova placená, je potřeba ke kaţdému vyhledávači doplnit měsíční cenu za dosaţenou pozici. Pokud například bude zákazník platit 900 Kč měsíčně za slovo na první aţ páté pozici ve vyhledávači seznam.cz, je potřeba vyplnit do políčka „Seznam.cz: pozice 1-5“ číslo 900. Stejným principem se vyplňují i ceny za ostatní pozice.
~ 14 ~
KAPITOLA: Popis struktury práce
3.8.1.3 Skupiny slov Pro správu skupin slouţí stránka skupiny slov. Stejným způsobem jako u projektů a klíčových slov se zde dají přidávat, editovat a mazat skupiny. Formulář pro přidávání a editaci skupin je velmi jednoduchý, obsahuje pouze textové pole pro název skupiny. 3.8.1.4 Domény Kaţdý projekt můţe mít přiřazenu jednu nebo více domén. Pokud není zadána ţádná doména, nemůţe probíhat měření slov. Je-li přiřazeno více domén, sleduje se pozice kaţdé zde uvedené domény pro kaţdé klíčové slovo. 3.8.1.5 Nastavení V nastavení projektu se nastavují obecné parametry projektu. Prvním parametrem je „Prohledat stran“. Do tohoto pole se zadává kladné celé číslo. Určuje, kolik stran výsledků hledání se bude prohledávat. Pokud se zde nastaví číslo 10, bude se prohledávat 10 stran výsledků hledání. To znamená, ţe se bude hledat do maximálně sté pozice, protoţe kaţdá strana výsledků hledání obsahuje 10 pozic. 3.8.2 Klienti Projekty se přiřazují ke klientům. K tomuto účelu slouţí tato stránka. Správa klientů probíhá stejným způsobem jako správa projektů. Formulář pro přidání a editaci klienta obsahuje pouze jedno textové pole pro zadání názvu klienta. Tato poloţka je povinná. 3.8.3 Uţivatelé Správa uţivatelů probíhá stejným způsobem jako v ostatních částech administrace. Zajímavou částí je přidání uţivatele. Tento formulář se skládá z několika částí. Nejprve je potřeba vyplnit informace o uţivateli. Dále se přiřadí klient, ke kterému uţivatel patří. Dále se uţivateli přiřadí projekty, které po přihlášení uvidí. Výběr více stránek probíhá buďto podrţením klávesy CTRL a postupným klepnutím na stránky, které se mají uţivateli přiřadit, další moţností je klepnout na název stránky a taţením označit několik stránek bezprostředně pod sebou. Obě varianty lze kombinovat. Role patří mezi nejdůleţitější nastavení uţivatelského účtu. Klient můţe pouze prohlíţet naměřené výsledky. Administrátor má plná oprávnění a přístup do administrace.
KAPITOLA: Rešeršní zpracování existujících implementací
4 Rešeršní zpracování existujících implementací Pro měření klíčových slov existuje na internetu několik nástrojů. Následuje popis předních produktů zabývajících se sledováním pozic klíčových slov. 4.1 SEO Servis Tento nástroj zaujme velmi pěkným grafickým zpracováním. Velmi jednoduše se zjistí aktuální pozice v následujících vyhledávačích: Google.cz Bing Jyxo Seznam Morfeo Tabulka s výsledky je pěkná a přehledná. Dozvíme se z ní název vyhledávače, pozici a nalezený odkaz. Dobu, po kterou se pozice vyhledává, zpříjemňuje animace s titulkem „Vyhledávám“, coţ vytváří dojem důvěry v aplikaci, protoţe je stále vidět, ţe něco dělá. Po registraci má uţivatel k dispozici historii všech svých testů včetně grafického vývoje. Nástroj je volně přístupný na internetové adrese http://seo-servis.cz/search-pozice-ve-vyhledavacich/.
Obrázek 4-1: SEO Servis - pozice ve vyhledávačích
4.2 SEO nástroje Tento nástroj umoţňuje po registraci pravidelně sledovat pozice klíčových slov. Existuje ve variantě free a proxy. Varianta free umoţňuje sledovat pouze 10 slov pro 1 web. Profi varianta nemá omezení, nicméně stojí 100 Kč měsíčně za jeden web. Sleduje pozice v následujících vyhledávačích: Seznam.cz Google.cz Morfeo Jyxo
~ 15 ~
~ 16 ~
KAPITOLA: Rešeršní zpracování existujících implementací
Pozice lze vyhledat i jednorázově. Toto vyhledávání vrací přehlednou tabulku, ve které je pouze vyhledávač a nalezená pozice. Oproti pravidelnému hledání jsou prohledány i vyhledávače google.com a google.sk.
Obrázek 4-2: SEO nástroje - pozice ve vyhledávačích
Nastroj lze nalézt na adrese: http://www.nastroje-seo.eu/seo-monitor-popis
KAPITOLA: Analýza a návrh implementace
5 5.1
~ 17 ~
Analýza a návrh implementace Volba pouţitých technologií
5.1.1 Volba prostředí Vzhledem k potřebě přístupu k aplikaci z libovolného místa internetu je nejvhodnější pouţít některou z webových technologií. V úvahu přicházejí především PHP a ASP. Pro tvorbu v ASP je potřeba Microsoft Visual Studio. Firma, pro kterou se aplikace vyvíjí, nemá Visual studio k dispozici, proto jsem zvolil technologii PHP. 5.1.2 Volba Frameworku Z důvodu usnadnění práce jsem se rozhodl, ţe pouţiji některý z PHP Frameworků. Zvolil jsem Nette Framework z několika důvodů. Je šířen pod licencí BSD, je to tedy open source a zcela zdarma.
Obrázek 5-1: Nette "laďenka"
~ 18 ~
KAPITOLA: Analýza a návrh implementace
Mezi jeho hlavní výhody patří dokonale propracované ladicí nástroje. Pouţívá tzv. „laděnku“. Přehledně vypíše chybu a ukáţe i kontext chyby včetně http poţadavku a odpovědi. Jednotlivé bloky laděnky lze rozklikávat. 5.2 Schéma databáze Aplikace vyuţívá ke svému chodu databázi MySql 5.0.22. Všechny tabulky pouţívají úloţiště InnoDB a porovnávání utf8_czech_ci. Obecně se všude pouţívá kódování utf-8. Názvy sloupců a tabulek se skládají pouze z malých písmen bez diakritiky a číslic 0 aţ 9. Dále se dodrţuje pravidlo jednotných čísel pro názvy tabulek (např. se nepouţívá settings, ale setting). Kaţdá tabulka má jako první sloupec identifikátor. Název identifikátoru se skládá z názvu tabulky a řetězce „id“. Pro tabulku domain je to domain_id. Pro setting to bude setting_id.
Obrázek 5-2: Schéma databáze
Úloţiště InnoDB umoţňují tvorbu cizích klíčů, které znázorňují šipky na schématu databáze. Šipka začíná u poloţky, do které se bude dosazovat poloţka, vedle které šipka končí. Celkové schéma je vidět na následujícím obrázku. Kaţdý datový typ je na obrázku označen podle následujícího klíče:
KAPITOLA: Analýza a návrh implementace
~ 19 ~
int – celé číslo varchar – proměnlivě dlouhý textový řetězec enum – výčtový typ date (datetime) – datum nebo datum s časem Primární klíče jsou označeny kurzívou. V následujících podkapitolách budou popsány jednotlivé tabulky. 5.2.1 Tabulka user Tabulka slouţí k ukládání informací o uţivatelích aplikace. Obsahuje následující sloupce: user_id – identifikátor uţivatele login – přihlašovací jméno fname – jméno lname – příjmení pass – heslo (zaheshované aplikací) email – e-mail uţivatele client – identifikátor přiřazeného klienta (cizí klíč z tabulky client sloupec client_id) role – role uţivatele o guest – host o admin – administrátor o klient – klient inserted – datum a čas vloţení uţivatele status – stav o 0 – neaktivní o 1– aktivní deleted – určuje, zda je uţivatel smazán o 0 – není smazán o 1 – je smazán onlyBest – zobrazovat pouze nejlepší pozice slova na úvodní stránce o 0 – ne o 1 – ano 5.2.2 Tabulka setting V této tabulce jsou uloţena obecná nastavení pro jednotlivé projekty. Tato nastavení se dají změnit u konkrétních klíčových slov. Popis sloupců: settting_id – identifikátor nastavení web – identifikátor přiřazeného webu (cizí klíč tabulky web sloupec web_id) depth – hloubka vyhledávání (počet stran vyhledávače, které se mají prohledat) s_seznam_1_5 – cena za dosaţení 1. – 5. pozice ve vyhledávači seznam.cz s_seznam_6_10 – cena za dosaţení 6. – 10. pozice ve vyhledávači seznam.cz s_google_1_5 – cena za dosaţení 1. – 5. pozice ve vyhledávači google.cz
~ 20 ~
KAPITOLA: Analýza a návrh implementace
s_google_6_10 – cena za dosaţení 6. – 10. pozice ve vyhledávači google.cz s_google_com_1_5 – cena za dosaţení 1. – 5. pozice ve vyhledávači google.com s_google_com_6_10 – cena za dosaţení 6. – 10. pozice ve vyhledávači google.com s_google_de_1_5 – cena za dosaţení 1. – 5. pozice ve vyhledávači google.de s_google_de_6_10 – cena za dosaţení 6. – 10. pozice ve vyhledávači google.de s_seznamcz – určuje, zda se má pro daný web vyhledávat ve vyhledávači seznam.cz o 0 – nevyhledávat o 1 – vyhledávat s_googlecz– určuje, zda se má pro daný web vyhledávat ve vyhledávači google.cz o 0 – nevyhledávat o 1 – vyhledávat s_googlede– určuje, zda se má pro daný web vyhledávat ve vyhledávači google.de o 0 – nevyhledávat o 1 – vyhledávat s_googlecom– určuje, zda se má pro daný web vyhledávat ve vyhledávači google.com o 0 – nevyhledávat o 1 – vyhledávat inserted – datum a čas vloţení uţivatele status – stav o 0 – neaktivní o 1 – aktivní deleted – určuje, zda je uţivatel smazán o 0 – není smazán o 1 – je smazán 5.2.3 Tabulka client Do této tabulky se ukládají informace o klientech. client_id – identifikátor klienta name – název klienta inserted – datum a čas vloţení uţivatele status – stav o 0 – neaktivní o 1- aktivní deleted – určuje, zda je uţivatel smazán o 0 – není smazán o 1 – je smazán 5.2.4 Tabulka web Slouţí pro ukládání projektů. Následuje vysvětlení sloupců: web_id – identifikátor projektu name – název projektu
KAPITOLA: Analýza a návrh implementace
~ 21 ~
client – identifikátor přiřazeného klienta (cizí klíč z tabulky client sloupec client_id) link – odkaz stránky projektu (jiţ není aktuální, je zde z historických důvodů) inserted – datum a čas vloţení uţivatele status – stav o 0 – neaktivní o 1– aktivní deleted – určuje, zda je uţivatel smazán o 0 – není smazán o 1 – je smazán 5.2.5 Tabulka domain Tabulka pro ukládání a přiřazování domén k projektům. Následuje seznam sloupců: domain_id – identifikátor domény web – identifikátor projektu, ke kterému doména patří (cizí klíč tabulky web sloupec web_id) domain – domény, které se budou hledat pro slova projektu 5.2.6 Tabulka keyword Do této tabulky se ukládají všechna klíčová slova. Následuje seznam sloupců: keyword_id – identifikátor klíčového slova name – text klíčového slova web – identifikátor přiřazeného webu (cizí klíč tabulky web sloupec web_id) group – identifikátor skupiny, do které slovo patří (cizí klíč tabulky keyword_group sloupec keyword_group_id) seznam_1_5– cena za dosaţení 1. – 5. pozice ve vyhledávači seznam.cz seznam_6_10 – cena za dosaţení 6. – 10. pozice ve vyhledávači seznam.cz google_1_5 – cena za dosaţení 1. – 5. pozice ve vyhledávači google.cz google_6_10 – cena za dosaţení 6. – 10. pozice ve vyhledávači google.cz google_com_1_5 – cena za dosaţení 1. – 5. pozice ve vyhledávači google.com google_com_6_10 – cena za dosaţení 6. – 10. pozice ve vyhledávači google.com google_de_1_5 – cena za dosaţení 1. – 5. pozice ve vyhledávači google.de google_de_6_10 – cena za dosaţení 6. – 10. pozice ve vyhledávači google.de seznamcz – určuje, zda se má pro daný web vyhledávat ve vyhledávači seznam.cz o 0 – nevyhledávat o 1 – vyhledávat googlecz – určuje, zda se má pro daný web vyhledávat ve vyhledávači google.cz o 0 – nevyhledávat o 1 – vyhledávat googlede – určuje, zda se má pro daný web vyhledávat ve vyhledávači google.de o 0 – nevyhledávat o 1 – vyhledávat
~ 22 ~
KAPITOLA: Analýza a návrh implementace
googlecom– určuje, zda se má pro daný web vyhledávat ve vyhledávači google.com o 0 – nevyhledávat o 1 – vyhledávat first_found_stop – určuje, zda se má po prvním nalezení pozice skončit o 0 – pokračovat ve vyhledávání o 1 – ukončit vyhledávání inserted – datum a čas vloţení uţivatele status – stav o 0 – neaktivní o 1 – aktivní deleted – určuje, zda je uţivatel smazán o 0 – není smazán o 1 – je smazán 5.2.7 Tabulka keyword_group keyword_group_id – identifikátor skupiny name – název skupiny web – identifikátor přiřazeného webu (cizí klíč tabulky web sloupec web_id) inserted – datum a čas vloţení uţivatele status – stav o 0 – neaktivní o 1– aktivní deleted – určuje, zda je uţivatel smazán o 0 – není smazán o 1 – je smazán 5.2.8 Tabulka actual_position, position_01_2011,… Tabulky s nalezenými pozicemi. Mají následující strukturu: position_id – identifikátor pozice keyword – identifikátor klíčového slova (cizí klíč z tabulky keyword sloupec keyword_id) keyword_text – textová hodnota klíčového slova position – pozice slova searcher – vyhledávač o seznam o google ext – přípona vyhledávače o cz o en o de domain – identifikátor domény (cizí klíč z tabulky domain sloupce domain_id) type1 – určuje zda bylo slovo nalezeno na 1. – 5. pozici. Slouţí v kalkulátoru. o NULL – neumístěno
KAPITOLA: Analýza a návrh implementace
o 1 – umístěno type2 – určuje, zda bylo slovo nalezeno na 6. – 10. pozici. Slouţí v kalkulátoru. o NULL – neumístěno o 1 – umístěno type3 – určuje, zda bylo slovo nalezeno na > 10. pozici. Slouţí v kalkulátoru. o NULL – neumístěno o 1 – umístěno found_page_url – nalezená url page – stránka vyhledávače, kde byla pozice nalezena inserted_date – datum a čas vloţení inserted – datum vloţení 5.2.9 Tabulka proxy proxy_id – identifikátor proxy proxy – adresa a port proxy serveru status – stav o active – aktivní o inactive – neaktivní
~ 23 ~
~ 24 ~
KAPITOLA: Analýza a návrh implementace
KAPITOLA: Popis implementace
6
~ 25 ~
Popis implementace
6.1 Model-View-Presenter (MVP) Aplikace plně vyuţívá návrhový vzor MVP, který vychází z modelu Model-View-Controller (MVC). MVC je spíše neţ návrhový vzor softwarová architektura, která rozděluje aplikaci do tří vrstev: na datový model, uţivatelské rozhraní a řídicí logiku. Přičemţ modifikace některé z nich má pouze minimální vliv na ostatní. MVC dále určuje vztah jednotlivých komponent, který je znázorněn na obrázku: Model zajišťuje přístup k datům a manipulaci s nimi. View (pohled) převádí data reprezentovaná modelem do podoby vhodné k prezentaci uţivateli. Controller (řadič) reaguje na události pocházející od uţivatele a zajišťuje změny Obrázek 6-1: Model-View-Presenter
v modelu nebo v pohledu.
Tento princip poprvé popsal Trygve Reenskaug v roce 1979. Dnes je velmi populární právě u webových aplikací, jenţe často jde o tvrzení pramenící z jeho pochopení. Ve své původní podobně jej vlastně nepouţívá nikdo. Role a vztahy jednotlivých vrstev se často chápou velmi volně. To je také důvod, proč se Nette Framework hlásí k MVC jen jako k duševně spřízněné architektuře. Logice Nette Frameworku daleko lépe odpovídá nepříliš známý vzor MVP, tedy ModelView-Presenter. Zjednodušeně tak můţeme říct, ţe presenter v Nette je totéţ, co controller v jiných frameworcích. Zjednodušeně: model nemá vědět o tom, ţe nějaké view a presentery existují view o modelu vědět také nemusí (pasivní view), nebo naopak můţe data tahat přímo z něj, dle zvolené koncepce presenter seznámí view s modelem (ne naopak) a realizuje uţivatelské akce. Ty patří do tří kategorií o změna view (nejčastější) o změna stavu (interakce v rámci aktuálního view) o příkaz pro model Ideální je, aby se
~ 26 ~
KAPITOLA: Popis implementace
činnosti modelů omezily jen na získávání dat čili práci s databází logika v šablonách omezila na iterace, if, else logika v presenteru omezila na: o plnění šablon a registraci helperů a filtrů o sestavení stromu komponent o úkolování tříd z modelu Model ve většině případů bude tvořit více tříd. Jedna z nich se můţe starat právě o zapouzdření připojení k DB, které vyuţijí jiné třídy modelu. Ale z pohledu celé aplikace je to chápáno jako jeden celek, jeden model. Z pohledu jednotlivých vizuálních komponent i tyto mohou mít svůj vlastní malý model. Dal by se nazývat třeba komponentový model. Propojení těchto modelů s hlavním modelem pak opět zajistí presenter. Z pohledu celé aplikace se tyto modely budou spíš povaţovat za součást prezentační logiky neţ součást modelu. 6.2
Presentery
6.2.1 Presenter [2] Presenterem se rozumí jakýkoliv potomek třídy Presenter. Reaguje na události pocházející od uţivatele a zajišťuje změny v modelu nebo v pohledu. Jedná se o prvek, který zprostředkovává data z modelu do pohledu. Pohled následně vidí uţivatel. Ţivotní cyklus presenteru Ţivotní cyklus presenteru je rozdělen do několika částí představovaných voláním volitelně existujících metod. Jde o action{Action}, handle{Signal} a render{View}. Kaţdá metoda se hodí na něco jiného. Ty, které mají společné znaky, řadíme do společných fází ţivotního cyklu. Charakteristika fází: 1. výkonná (execution) 2. změny vnitřních stavů (interaction) 3. vykreslovací (rendering) 4. ukončení činnosti (shutdown) Následující obrázek ilustruje, jak jsou Obrázek 6-2: Ţivotní cyklus presenteru
KAPITOLA: Popis implementace
~ 27 ~
postupně vykonávány metody presenteru v jeho ţivotním cyklu a do jaké fáze tyto metody začleňujeme. bílé – metody společné pro všechny akce / pohledy hnědé – metody pro konkrétní pohled modrá – metoda, která má na starosti zpracování konkrétního signálu Popis jednotlivých metod Fáze výkonná (execution) 1. startup je vyvolána na začátku ţivotního cyklu presenteru. Můţe obsahovat například zajištění připojení k databázi. Během ţivotního cyklu aplikace se můţe spustit více presenterů, metoda startup() se můţe volat vícekrát. 2. action{Action} by měla obsahovat vykonání operací, po kterých můţe následovat přesměrování. Zde probíhá například automatické přesměrování na jinou jazykovou verzi (např. podle detekce z prohlíţeče). Také zde můţe být logika rozhodování pro členění na jednotlivé pohledy. Metoda action můţe například i zvalidovat vstupní parametry nebo řešit exekutivu (např. má se záznam smazat?). Onou validací můţeme chápat předání dat modelu k validaci, ověření práv a následné přesměrování do patřičných míst, pokud se vyskytne problém. Validace se můţe dělit na low-level (Je $id opravdu číslo?) nebo high-level (Existuje záznam pro $id v databázi? Má k němu $user přístup?). Řešit validaci se doporučuje v modelech (a nebo, pokud to framework vyţaduje, tak i v třídách formulářů), kde ji ale bude programátor řešit záleţí na něm nebo na konkrétní situaci. Klíčový moment pro redirect: je zde prostor pro inicializace perzistentních parametrů a manipulaci s modelem s moţností následného přesměrování, tzn. v tomto stavu se zohlední při redirectu i hodnoty perzistentních parametrů. Př.: Pokud zde nastavím perzistentnímu parametru $lang hodnotu 'cs', pak se i tato hodnota zohlední v novém poţadavku po přesměrování. Po redirectu se skript ukončí, prohlíţeč si vyţádá novou stránku a skript se spustí znovu. Tudíţ všechny „obyčejné“ proměnné se ztratí. Fáze změn vnitřních stavů (interaction) 3. handle{Signal} : zpracování signálů neboli subrequestů. Určeno pro uţivatelskou interakci a zpracování AJAXových poţadavků. Fáze vykreslovací (rendering) 4. beforeRender můţe obsahovat například společné nastavení filtrů pro všechny vykreslovače a nastavení společných proměnných pro šablony všech vykreslovačů. 5. render{View} má na starosti vykreslení a věci s tím spojené (tvorba odkazů v šablonách, přiřazení proměnných do konkrétních šablon, …).
~ 28 ~
KAPITOLA: Popis implementace
Fyzické vykreslení šablony 6. uloţení vnitřních stavů: dříve neţ se přejde k další fázi, uloţí se stav všech vnitřních stavů a perzistentních proměnných. 7. vykreslení šablony na výstup Ukončení činnosti (shutdown) 8. shutdown je vyvolána při ukončení ţivotního cyklu presenteru. Zde můţeme ukončit databázové připojení, kešování a podobně. Presenter má během svého ţivotního cyklu moţnost kdykoliv ukončit svou činnost, pokud je s prací hotový ($presenter->terminate()). To můţe udělat i během „společných“ metod startup(), beforeRender(). 6.2.2 Šablony (Templates) Presenter se pokusí vykreslit implicitní šablonu, pokud nebylo řečeno metodami setLayout() či setView() jinak, jméno šablony odvodí od view. Kaţdý presenter můţe mít vlastní layout uloţený v souboru: /templates/Homepage/@layout.phtml /templates/[email protected] nebo se pouţije společný layout uloţený v /templates/@layout.phtml Změnit layout jde metodou setLayout(), kde parameter FALSE layout zcela vypne, nebo lze předat název layoutu. Např. setLayout('extra') bude místo souboru [email protected] hledat [email protected]. Teprve kdyţ by soubor se šablonou neexistoval, vyhodí se výjimka BadRequestException. Toto chování má výhodu v tom, ţe pokud přidáváme nové view, stačí přidávat nové šablony do příslušné sloţky a není potřeba psát ţádné (prázdné) metody. A naopak, view jsou na šablonách nezávislé, můţeme je zpracovat dřív, neţ na kreslení šablony dojde. 6.2.3 Továrničky na komponenty Továrna na komponenty je elegantní způsob, jak komponenty vytvářet způsobem, aţ je jich doopravdy potřeba. Celé kouzlo spočívá v implementaci metody createComponent(), která umoţňuje vytvoření komponenty právě lazy loading / on-demand způsobem. V této metodě buď komponentu rovnou připojíte k presenteru (nebo například i controlu), nebo vrátíte a továrnička se o její připojení postará sama. Metodě createComponent je předáván volitelný parametr s názvem komponenty.
KAPITOLA: Popis implementace
~ 29 ~
Registrace komponenty továrničkou: class DefaultPresenter extends Presenter { public function renderDefault() { $fifteen = $this['game']; // získá komponentu // ... další kod } ... protected function createComponentGame($name) { $fifteen = new FifteenControl; $fifteen->onGameOver[] = array($this, 'GameOver'); $fifteen->useAjax = TRUE; return $fifteen; } }
Výhody pouţití továrničky nemusí být na první pohled patrné, projeví se hlavně při pouţití více komponent. Díky tomu, ţe jsou všechny komponenty definovány na jednom místě dochází k lepší přehlednosti. Komponenty z továrničky se také stávají lépe znovupouţitelnými, stačí si je jen kdekoliv přičarovat zápisem $this[...] a případné jemnější nastavení komponenty je pak moţno udělat aţ při jejím předání šabloně. Nic také nebrání pouţít jednu komponentu na stránce vícekrát, rozliší se názvem, který také pomáhá určovat správnou komponentu jako příjemce signálu. 6.2.4 BasePresenter Třída BasePresenter je rodičem všech ostatních presenterů projektu. Obsahuje tedy pouze funkce a proměnné, které jsou potřebné pro všechny ostatní presentery. Jelikoţ se jedná o hlavní presenter, který vyuţívají class presenters všechny ostatní, popíši jeho proměnné a některé funkce. Presenter BasePresenter
6.2.4.1 Proměnné Permission $acl (Access Control List) Obsahuje seznam zdrojů, oprávnění a rolí uţivatelů. Dále proměnná obsahuje přiřazení zdrojů k rolím. Nastavuje se v metodě initAcl(). Int $filter Určuje aktuálně vybraný projekt. Jedná se o obecný filtr, který zůstává v platnosti, dokud není změněn. Pokud je v této proměnné číslo 0, označuje to, ţe není vybrán ţádný filtr. Kladné celé číslo označuje id projektu, na který se má filtrovat obsah zobrazené stránky. Nastavuje se odesláním komponenty filter v její obsluţné funkci changeFilter().
# # # # # #
acl: var filter: var model: var projects: var root: var user: var
+ + + + # + + + # + +
__construct() : var createComponentCss() : var createComponentFilter() : var createComponentJs() : var cssFiles() : var getProjectName(var) : var changeFilter(BaseForm) : var initAcl() : var jsFiles() : var setProjectFilter(var) : var startup() : var
Obrázek 6-3: BasePresenter
~ 30 ~
KAPITOLA: Popis implementace
$model Do této proměnné si presentery ukládají svůj defaultní model. Přes tuto proměnnou se pak volají funkce modelu pro příslušný presenter. $projects Obsahuje seznam projektů, které můţe přihlášený uţivatel vidět a které si můţe nastavit. Obsah nastavuje funkce setProjectFilter(). $root V této proměnné je uloţena cesta uri cesty k hlavní stránce projektu. V současnosti nabývá hodnoty http://www.vidia-monitor.cz/. $user Informace o uţivateli aplikace jsou uloţeny v této proměnné. Jedná se o návratovou hodnotu volání $this->getUser(), pro snazší zápis v aplikaci. 6.2.4.2 Funkce Startup Volá všechny inicializační funkce aplikace, které jsou společné. Dále se zde kontroluje, zda je uţivatel přihlášený a pokud není, probíhá zde přesměrování na přihlašovací stránku. setProjectFilter Pokud je někde v kódu aplikace potřeba změnit projekt, zavolá se tato funkce a jako parametr se jí předá identifikátor projektu. createComponentCss Továrnička na komponentu stylů stránky. Spojí všechny potřebné styly stránky do jednoho souboru, tím se pak načítá jen jeden velký soubor, coţ zrychluje načítání stránky. Styly jsou definovány ve funkci cssFiles(). createComponentJs Továrnička na komponentu javascriptových souborů stránky. Spojí všechny potřebné js soubory do jednoho velkého, coţ zrychluje načítání stránky. Skripty jsou definovány ve funkci jsFiles(). cssFiles Tato funkce je přítomna v kaţdém z presenterů, který potřebuje doplňkové CSS styly. Vrací pole se styly, které se mají do stránky načíst. Pokud je uvedena v jiném neţ BasePresenteru, volá vţdy svého rodiče a k jeho stylům přidává své vlastní. jsFiles Stejné jako cssFiles, pouze místo stylů definuje skripty.
KAPITOLA: Popis implementace
~ 31 ~
createComponentFilter Továrnička na tvorbu formuláře pro výběr projektu. Tímto projektem se pak filtrují zobrazená klíčová slova a domény. changeFilter Funkce changeFilter je Handler komponenty filter. Po odeslání formuláře se výsledky odeslání zpracují v této funkci. Nastavuje se zde filtr. getProjectName Na základě zadaného identifikátoru projektu vrací tato funkce název projektu. 6.3
Model
6.3.1 Měření pozic slov 6.3.1.1 Formáty vyhledávačů V rámci aplikace existují tři formáty zápisu vyhledávače. Jedná se o lidmi čitelný formát, který se vyskytuje ve dvou variantách. První v rozloţené verzi, kdy název vyhledávače a přípona jsou rozděleny, např. vyhledávač google a přípona com. V tomto formátu se informace o vyhledávači ukládá do databáze. Většina dotazů do databáze, které vypisují data do tabulky, slučují vyhledávač a příponu do class models jednoho řetězce, např. google.com. Poslední moţností, se kterou se v aplikaci lze setkat, je konstanta jednoznačně označující vyhledávač. Tyto konstanty jsou definovány ve třídě PositionModel, začínají prefixem SEARCER, následuje podtrţítko (_), pak velkými písmeny název domény (např. GOOGLE), podtrţítko (_) a přípona opět velkými písmeny (např. COM). Výsledná konstanta nokem vypadá např. takto: SEARCHER_GOOGLE_COM. Označuje vyhledávač google.com a má přidělenou celočíselnou konstantu. Pro převod mezi formáty vyhledávače slouţí funkce explodeSearcher() a implodeSearcher(). Funkce explodeSearcher převede konstantu vyhledávače na její textovou podobu ve formě vyhledávač, přípona. Tyto dvě hodnoty vrací jako pole, ve kterém první prvek představuje vyhledávač a druhý
PositionModel + # + + + + +
GOOGLE_PER_PAGE: var = 10 {readOnly} proxy: var SEARCHER_GOOGLE_COM: var = 1002 {readOnly} SEARCHER_GOOGLE_CZ: var = 1001 {readOnly} SEARCHER_GOOGLE_DE: var = 1003 {readOnly} SEARCHER_SEZNAM_CZ: var = 1000 {readOnly} SEZNAM_PER_PAGE: var = 10 {readOnly}
+ + + + + + + + + + + + + + + +
__construct() : var dateDiff(var, var) : var explodeSearcher(var) : var getPageHtml(var, var, var) : var getPosition(var, var, var, var) : var getPositions(var, var, var, var, var) : var getSearcherPositions(var, var, var, var, var) : var getSeasonTableName(var, var) : var implodeSearcher(var, var) : var isValidSearchResult(var, var) : var parseGoogleHtml(var, var, var, var, var, var, var) : var parseSeznamHtml(var, var, var, var, var) : var refreshPosition(var) : var sanitizeWeb(var) : var saveRandomData(var, var, var, var, var) : var updatePosition(var, var, var, var) : var
Obrázek 6-4: PositionModel
~ 32 ~
KAPITOLA: Popis implementace
příponu. Opačnou funkci představuje implodeSearcher, která bere jako první argumenty vyhledávač (např. google), jako druhý příponu (např. de) a vrací konstantu reprezentující vyhledávač (např. pro google.de to bude SEARCHER_GOGLE_DE). 6.3.1.2 Řešení ochrany vyhledávačů proti robotům První verze aplikace nijak neřešila ochranu proti robotům, kterou pouţívají vyhledávače. Během malé chvíle bylo jasné, ţe bude potřeba tento problém váţně řešit. Největší potíţe způsobuje vyhledávač seznam.cz, kde jiţ po několika málo (do 10) hledání pozice v krátkých časových úsecích (cca 1 s) přestal skript měřit. Všechna slova vypadala jako nenalezena. Problém byl v tom, ţe seznam před vrácení výsledků vrátil stránku s „captchou“. CAPTCHA je Turingův test, který se na webu pouţívá ve Obrázek 6-5: Captcha snaze automaticky odlišit skutečné uţivatele od robotů [3]. Aby mohl robot něco takového obejít, musel by být schopen přečíst z obrázku zdeformovaný text, coţ je velmi obtíţné. Někdy jsou texty tak zdeformované, ţe mají s přečtením problém i zdraví lidé. Často bývá nutné captchu odeslat javascriptem, coţ je další překáţka k jejímu obejití robotem, protoţe javascript se spouští aţ v prohlíţeči, ne na serveru jako PHP. Jakmile seznam vygeneruje tuto ochrannou mezistránku, je téměř nemoţné, nebo při nejmenším velmi obtíţné a nejisté, robotem získat poţadované výsledky hledání. Řešením je nedopustit, aby seznam vrátil takovouto stránku. Z experimentů jsem zjistil, ţe velmi pravděpodobně se stránka s CAPTCHOU zobrazuje po několika rychlých přístupech za sebou ze stejné IP adresy. Pokud by se tedy podařilo navenek vystupovat pod jinou IP adresou, neměl by si vyhledávač všimnout, ţe se jedná o robota. Kdybychom změnili IP adresu v odchozích packetech, nedostali bychom odpověď od serveru. Řešením je tedy mezi server s aplikací (odesílatel) a server vyhledávače (příjemce) vloţit další prvek, který odesílatelovu IP adresu nahradí svou vlastní a odpověď odesílateli přepošle. Přesně takto se chová proxy server. Z experimentu vyšlo, ţe pokud má být vyhledávač zmaten, je potřeba střídat alespoň čtyři proxy servery. Stačí z nich vybírat náhodně. Na internetu existují stovky proxy serverů, které se dají zdarma k tomuto účelu vyuţít. Tyto volně přístupné proxy servery mají jeden veliký problém, a to ten, ţe nejsou vůbec spolehlivé. Nedá se od nich očekávat, ţe budou správně fungovat. Navíc jsou potřeba alespoň čtyři, aby byl vyhledávač zmaten. Řešení nespolehlivosti a zajištění dostatečného mnoţství proxy serverů je uvedeno v popisu měření pozic.
KAPITOLA: Popis implementace
6.3.1.3 ProxyModel Pro správu a přístup k proxy serverům slouţí proxyModel. Je tvořen samostatnou třídou typu singleton. Singleton je název pro techniku, které se vyuţívá v programování. Singleton, česky jedináček nebo unikát, představuje řešení problému, kdy v celém programu má běţet pouze jediná instance nějaké třídy (pouze 1 objekt dané třídy). Toho se vyuţívá například pro sdílení informací a vlastností mezi objekty [4].
~ 33 ~
class models Object ProxyModel #
instance: var proxies: var
+ + + + + + + + +
__clone() : var __construct() : var add(var) : var disable(var) : var enableAll() : var getInstance() : var getList() : var getRandom() : var init() : var isActive(var) : var
Při inicializaci (vytvoření objektu) se načtou z databáze všechny aktivní proxy servery do pole. Funkce getRandom() vrací náhodný aktivní proxy server. Důleţitou funkcí je funkce disable, která se postará o deaktivaci proxy v databázi a vyřazení ze seznamu aktivních proxy serverů současné instance Obrázek 6-6: Proxy model ProxyModelu. Také kontroluje, zda je k dispozici dostatečný počet proxy serverů. Pokud tomu tak není, reaktivuje všechny proxy servery. Jelikoţ jsou proxy servery občas aktivní a občas neaktivní, je toto správné řešení. Pro ověření, zda je server aktivní slouţí funkce isActive(). Pro vytváření HTTP dotazů pouţívajících proxy server se v celé aplikaci vyuţívá knihovna cUrl (http://curl.haxx.se/). Do konstruktoru se předá proxy server a následně stačí zavolat funkci get(), která vrátí kód stránky na url adrese, jeţ je parametrem funkce get. Pro ověření výsledku slouţí speciální stránka, kterou jsem pro tento účel napsal. Obsahuje ve zdrojovém kódu ověřovací řetězec, který se hledá. Pokud je nalezen, je proxy nastavena na aktivní. function isActive($proxy) { $cc = new cURL(true,'cookie.txt',null, $proxy); $html = $cc->get('http://www.vidiadesign.cz/mojeip/'); $pos = strpos($html, '_G6N$%9d8[41K85:wK>61'); return is_numeric($pos) && $pos > 0; }
Funkce add() slouţí k přidání nového proxy serveru. Kontrola zda, je aktivní, musí být provedena ručně před vloţením.
~ 34 ~
6.3.1.4
KAPITOLA: Popis implementace
Měření pozic
6.3.1.4.1 Funkce getPositions Měření pozice obstarává třída PositionModel. Lze zavolat kteroukoliv z jejich funkcí, ale hlavní funkce se jmenuje getPositions(). function getPositions($keyword, $web, $searcher, $pages = 10, $force = true) { $this->proxy = ProxyModel::getInstance(); $result = array(); for ($page = 1; $page <= $pages; $page++) { $positions = $this->getPosition($keyword, $web, $searcher, $page); if ($force && !empty($positions)) return $positions; if (is_array($positions)) { $result = array_merge($result, $positions); } } return empty($result)? false: $result; }
Pět parametrů funkce určuje její chování. Následuje vysvětlení parametrů funkce: $keyword – představuje textovou reprezentaci klíčového slova (např. pampeliška) $web – doména, jejíţ pozice se bude hledat (např. pampeliska.cz) $searcher – vyhledávač ve kterém se budou pozice určovat. Očekává se formát ve formě konstanty z třídy PositionModel (např. SEARCHER_SEZNAM_CZ) $pages – nepovinný parametr určující kolik stránek se bude prohledávat. Defaultně je zde nastavena hodnota deset a v takovém případě bude funkce vracet pozice do 100. Pokud je tedy slovo na 101. pozici, bude jiţ označeno jako nenalezené. $force – můţe nabývat hodnoty true nebo false. Právě tato proměnná říká, zda se má hledání zastavit po prvním nalezení pozice. Pokud nabývá hodnoty true, pak se po prvním nalezení pozic hledání zastaví a rovnou vrátí výsledek. Do proměnné proxy se nejprve uloţí aktuální instance ProxyModelu, který je společný pro všechny ostatní funkce. Poté se pro kaţdou stránku, kterou má vyhledávání projít, zavolá funkce getPosition(), která vrací pozice klíčového slova (jako pole) pro danou stránku vyhledávače, nebo vrací false, pokud nic nenalezla. Pokud jsou nalezeny nějaké pozice a má se přestat po prvním nalezení, jsou vráceny výsledky, v opačném případě se ověří, zda byly výsledky nalezeny, a pokud ano, přidají se do výsledku, který se vrací po průchodu všech stránek vyhledávače. Funkce vrací false, pokud nebyla nalezena ţádná pozice, nebo pole s pozicemi, pokud nalezena byla. 6.3.1.4.2 Funkce getPosition
Názvy a význam parametrů funkce getPosition() odpovídají funkci getPositions(). Funkce getPosition má za úkol vrátit pozice domény pro klíčové slovo. Podle vyhledávače nastaví 3 parametry: 1. $start – číslo stránky vyhledávače, na které se budou pozice hledat 2. $url – dotazovaná url adresa, která obsahuje úplnou cestu k vyhledávači, hledané slovo, stránku vyhledávání a případně další parametry specifické pro daný vyhledávač. 3. $check – kontrolní řetězec stránky. Jedná se o regulární zápis, který jednoznačně identifikuje, ţe přijatá stránka je opravdu stránkou s výsledky hledání. Tento regulární výraz se aplikuje na přijatý zdrojový kód a pokud je nalezena nějaká shoda, je výsledek povaţován za platný a je moţné ho parsovat. Jakmile jsou nastaveny všechny parametry, je moţné zavolat funkci getPageHtml(), které se předá $url a $check a vrací zdrojový kód stránky. Nakonec se vrátí výsledek funkce parseSeznamHtml(), nebo parseGoogleHtml(), které vracejí pozice domén pro klíčové slovo. 6.3.1.4.3 Funkce getPageHtml Tato funkce slouţí k získání obsahu stránky. Dostává url adresu stránky, kontrolní regulární výraz a příznak, zda se má pouţít proxy.
~ 36 ~
KAPITOLA: Popis implementace
function getPageHtml($url, $check, $useProxy = false) { if (!$useProxy){ try { $html = @file_get_contents($url); // umyslne potlaceni varovani if ($this->isValidSearchResult($html, $check)) return $html; } catch (Exception $e) { $this->getPageHtml($url, $check, true); } } // opakuj dokud nedostanes vysledek, // nebo nedojdou aktivni proxy servery (nikdy nedojdou) set_time_limit(0); while ( !empty($this->proxy->list) ) { $proxy = $this->proxy->random; $cc = new cURL(true,'cookie.txt',null, $proxy); $html = $cc->get($url); if (!$this->isValidSearchResult($html, $check)) { $this->proxy->disable($proxy); continue; } return $html; } }
Funkce standardně proxy server nepouţívá, protoţe nejjednodušší je napřímo stáhnout obsah stránky pomocí php funkce file_get_contents(). Pokud při volání této funkce dojde k chybě, je vyhozena výjimka, která závolá znovu funkci getPageHtml, tentokrát s parametrem, který říká, ţe se má pouţít proxy server. V případě, function isValidSearchResult($html, $check) ţe funkce file_get_contents úspěšně vrátila { if ($html === false) nějaký html kód, je ještě potřeba jej prověřit. return false; K prověření slouţí funkce preg_match($check, $html, $matches); isValidSearchResult, které se předá html a } return !empty($matches); kontrolní regulární výraz a vrátí buďto true, pokud je výsledek hledání validní, v opačném případě vrací false. Pokud by se stalo, ţe výsledek není validní, pokračuje se kódem níţe, stejně jako při pouţití proxy serveru. Pro pouţití proxy serveru je potřeba nastavit time_limit na „neomezeno“, čímţ se zajistí, ţe skript bude běţet tak dlouho, dokud nedostane nějaký výsledek. Poté se zkouší získat obsah stránky přes proxy server, a to tak dlouho, dokud není vrácený obsah stránky validní. Pokud není validní, proxy se deaktivuje a zkusí se jiná.
KAPITOLA: Popis implementace
~ 37 ~
6.3.1.4.4 Funkce parseSeznamHtml Tato funkce slouţí ke zpracování výsledků hledání. Vezme HTML kód a zjistí z něj pozice hledaných domén. function parseSeznamHtml($html, $web, $start, $keyword, $page) { preg_match_all('/\