Zápočtová úloha z předmětu KIV/ZSWI OBJEKTOVÝ NÁVRH APLIKACE pro
(LIKS/2010-03) Robot pro tvorbu webového korpusu
13. 4. 2010
Tým: IT deviants Členové: Lukáš Gemela
[email protected]
Michal Karfiol
[email protected]
Jan Řeřicha
[email protected]
Michal Šmolík
[email protected]
Ondřej Trhoň
[email protected]
Obsah 1
ÚVOD..........................................................................................................................................3 1.1 1.2 1.3 1.4
2
KONTEXT A ARCHITEKTURA SYSTÉMU .......................................................................4 2.1 2.2 2.3 2.4
3
ÚČEL SYSTÉMU .....................................................................................................................3 TYPOGRAFICKÉ KONVENCE...................................................................................................3 SLOVNÍČEK DEFINIC, POJMŮ A ZKRATEK ...............................................................................3 ODKAZY NA DALŠÍ DOKUMENTY ...........................................................................................3 KONTEXTOVÝ DIAGRAM .......................................................................................................4 USE-CASE DIAGRAM ............................................................................................................4 ARCHITEKTURA SYSTÉMU, PŘEHLED PODSYSTÉMŮ...............................................................5 ZVOLENÁ TECHNOLOGIE, PROGRAMOVACÍ JAZYK AD., DŮVODY...........................................5
TYPY INFORMACÍ ZPRACOVÁVANÉ SYSTÉMEM.......................................................6 3.1 VSTUPNÍ A VÝSTUPNÍ SOUBORY ............................................................................................6 3.1.1 Vstupní inicializační soubor ............................................................................................6 3.1.2 Výstupní soubory .............................................................................................................6 3.2 DATABÁZE ............................................................................................................................6
4
PODSYSTÉMY..........................................................................................................................8 4.1 CRAWLER .............................................................................................................................8 4.1.1 UML pro Crawler ............................................................................................................8 4.1.2 Přehled tříd z Crawler ...................................................................................................11 4.1.3 Třídy z Crawler ..............................................................................................................11 4.2 KONZOLE ............................................................................................................................16 4.2.1 UML pro Konzole ..........................................................................................................16 4.2.2 Přehled tříd z Konzole ...................................................................................................16 4.2.3 Třídy z Konzole ..............................................................................................................17 4.3 IO_OUTPUT ........................................................................................................................18 4.3.1 UML pro IO_Output ......................................................................................................18 4.3.2 Přehled tříd IO_Output..................................................................................................18 4.3.3 Třídy z IO_Output ..........................................................................................................18
5
PŘIŘAZENÍ TŘÍD/MODULŮ PROGRAMÁTORŮM ......................................................19
2
Úvod
1
Tento dokument má popisovat návrh softwarového systému. Nejprve bude popsán účel systému, kontext systému a celková architektura. Poslední oddíl dokumentu obsahuje přidělení jednotlivých částí (tříd nebo modulů) programátorům. Návrh systému slouží jako kostra pro implementaci a jako dokumentace pro jeho pozdější údržbu.
1.1 Účel systému Jedná se o nově vyvíjený software v rámci KIV na ZČU, jehož funkcionalita vychází z potřeb vývojového týmu LIKS*. Software slouží k vytváření webového korpusu. Korpus je tvořen databází textů stažených z internetových stránek. Stránky jsou postupně procházeny na základě vzájemných odkazů. Takto jsou procházeny od zadaných počátečních stránek do doby, kdy budou navštíveny všechny stránky českého internetu (s předem zadanými doménami – např: „.cz“ dále významné české stránky z mezinárodních domén „cs.“. Výsledkem činnosti programu jsou množiny tří formátů textových souborů, zařazených do nadefinovaných složek.
1.2 Typografické konvence
V dokumentu je pro standardní text použito písmo Times New Roman. Webové odkazy jsou písmem Courier New. Text využitý k popisu příkladů, metod či zdrojového kódu je psán fontem Calibri. Odborná pojmenování jsou psána kurzívou. Slova označená symbolem * jsou vysvětlena v kapitole 1.3 Dokument je členěn do kapitol prvního až čtvrtého řádu. U popisu jednotlivých metod je pro lepší orientaci využito id čísel– nejprve očíslovaný seznam jednotlivých metod, následně ta samá čísla užita u tabulek konkrétních metod.
1.3 Slovníček definic, pojmů a zkratek LIKS - laboratoř inteligentních komunikačních systémů - http://liks.fav.zcu.cz/ Crawler – počítačový program, určený k automatickému navštěvování webových adres
1.4 Odkazy na další dokumenty Bakalářská práce zabývající se problematikou webového robota: Martin Damek, Masarykova univerzita, Brno 2009, http://is.muni.cz/th/208149/fi_b Stránky webového robota WebSphinx http://www.cs.cmu.edu/~rcm/websphinx/
3
2 Kontext a architektura systému 2.1 Kontextový diagram
2.2 Use-Case Diagram Diagram – znázornění možných interakcí systému s uživatelem:
4
2.3 Architektura systému, přehled podsystémů
Podsystémy: Crawler – primární funkce systému, procházení webu, zpracovávání obsahů webů IO_Output – ukládání výsledných dat, přenos dat s databází Konzole – uživatelské interakce, načtení configuračního souboru Systém byl rozdělen do znázorněných modulů, na základě třívrstvé architektury. Dále systém spolupracuje s MySQL databází. Při implementaci byl využit existující webový crawler* WebSphinx.
2.4 Zvolená technologie, programovací jazyk ad., důvody Program je kódován v jazyce Java. Zadavatel netrval na žádném specifickém jazyce. Byla vybrána Java - je to jediný jazyk, kterému rozumí všichni členové týmu a svými vlastnostmi vyhovuje potřebám projektu. Databáze MySQL bude použita z důvodu vysoké paměťové (RAM) náročnosti, pro odkládání dočasných dat. OS Linux je součástí konfugurace serveru poskytnutého zadavatelem.
5
3 Typy informací zpracovávané systémem 3.1 Vstupní a výstupní soubory 3.1.1 Vstupní inicializační soubor Inicializační soubor bude obsahovat nastavovací direktivy pro běh webového robota. Jeho struktura bude odpovídat následujícímu XML schématu:
Cesta k výstupním souborům programu výčet počátečních URL adres robota regulární výrazy odkazů, které bude rotob akceptovat pro další procházení <MySQLDirectives> direktivy pro připojení robota k MySQL databázi uživ. jméno připojení k MySQL, subdoména <MySQLDirectives> <password> připojení k MySQL, subdoména <MySQLDirectives> Jméno databáze, subdoména <MySQLDirectives> <server> cesta k serveru, subdoména <MySQLDirectives>
3.1.2 Výstupní soubory Výstupní soubory budou organizovány do 3 složek (ODFILTROVANO, ORIGINAL, INFO). V každé bude jeden typ formátu textového souboru(.txt) s výsledným textem. Každý soubor bude pojmenován podle názvu adresáře a doplněn pořadovým trojčíslím (např. odfiltrovano001.txt). Velikosti jednotlivých souborů budou cca. 300MB – velikost bude uzpůsobena tak, aby nedošlo k rozdělení ukládaného textu. Schematický obsah souborů dle jednotlivých adresářů:
ODFILTROVANO
ORIGINAL
CtrlD+URL
CtrlD+URL
obsah tagu
kompletní textový obsah stažené stránky
INFO URL zdroje textu+cesta k souborům s texty z URL adresy+datum uložení textu
čistý text
3.2 Databáze Databáze v projektu slouží k ukládání mezivýsledků procházení a bude implementována z důvodu vysoké náročnosti robota na paměť RAM. Databáze bude reprezentovat frontu odkazů, které jsou určeny k procházení (tabulka LinkToVisitQueue) a databázi stránek, které již byly navštíveny a zpracovány (tabulky Domain a SubDomains). Tabulka LinkToVisitQueue Reprezentuje frontu stránek k projití. Linky uložené ve sloupci LinkToVisit jsou seřazeny podle pořadí přidání linku do databáze (ID), jenž je současně primárním klíčem tabulky. Robot načte vždy link s nejnižším ID v tabulce, provede zpracování linku, přidá na konec tabulky (fronty) nově nalezené odkazy, aktuálně zpracovávaný řádek smaže a přesune se na další iteraci. 6
Tabulky Domain a Subdomains Slouží k co nejrychlejšímu porovnání nalezených nových odkazů s databází již prošlých. V tabulce Domain bude uložen název hostitele „serveru“ stránky, v tabulce Subdomains poté všechny relativní cesty ke stránkám náležejícím serveru. Jednomu hostiteli může příslušet více relativních cest. S databází bude komunikovat rozhraní DBInterface.
7
4 Podsystémy
4.1 Crawler 4.1.1 UML pro Crawler
8
9
10
4.1.2 Přehled tříd z Crawler modul: id 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Crawler název třídy Crawler CrawlEvent DBComunicator LinkPredicate RobotExlusion Link URLPredicate DownloadParameters LinkEvent Page HTMLParser PageOutput Regexp RegexpMatcher Tagexp TagexpMatcher Wildcard
4.1.3 Třídy z Crawler 1
Crawler robot pro procházení webu void init() void run() void clear() void pause() void stop() visit(Page page) boolean shouldVisit (Link l) void expand(Page page) String toString() Link[] getRoots() Link[] getCrawledRoots() void submit(Link link) void submit (Link[] links) void sendCrawlEvent (int id) void sendLinkEvent (Link l, int id) boolean visited(Link link) void markVisited (Link link) void clearVisited() void fetch(Worm v)
inicializace robota spuštění robota zastaví robota a připraví ho k novému běhu pozastavení činnosti robota zastavení robota() navštíví stránku vrací true pokud může být link následován testuje všechny linky na stránce použitím shouldVisit() vrací jméno robota jako String vrací pole počátečních adres vrací kořeny aktuálního prohledávání vloží nový odkaz do fronty vloží pole odkazů do fronty zašle zprávu o události procházení všem posluchačům CrawlEventListener zašle zprávu o události procházení všem posluchačům LinkEvent true pokud byla stránka navštívena nastaví true pokud byla stránka navštívena smaže pole navštívených linků nastavení paralelního zpracování
11
2
CrawlEvent datová třída, uchovává typy událostí robota při procházení webu CrawlEvent (Crawler crawler, int id)
vytvoří novou instanci pro robota typu Crawler
3
DBComunicator třída pro komunikaci s databází DBComunicator(String server, String jmeno, vytvoří nový komunikátor a nastaví jeho String heslo) connectionString bool findVisited(Link link) vrátí, zda byl link už navštívený nebo ne Link getNextLink() vrátí další adresu k navštívení vloží link mezi navštívené a vrátí informaci o tom, zda se boolean insertVisited(Link link) to povedlo boolean insertNextPage(Link link) vloží link do "fronty" a informuje, zda se to povedlo String[] getStatistika() vrátí statistická data
4
LinkPredicate rozhraní, které implementují třídy pracující s odkazy robota void connected(Crawler crawler) void disconnected(Crawler crawler) boolean shouldVisit (Link link);
5
6
napojení na robota odpojení od robota
RobotExclusion kontroluje, zdali je na procházené adrese zapnuta ochrana robots.txt vrací true pokud je stránka chráněna boolean disallowed (URL url) robots.txt void clear () Vymaže cache položek robots.txt String website(URL url) Vytáhne název domény z URL odkazu String[] getRobotsTxt (String website, String userAgent) Stáhne robots.txt ze zadané domény boolean readField (PushbackInputStream in) Parseruje robots.txt
Link reprezentuje URL odkaz Link(Tag startTag, Tag endTag, URL base) Link(URL url) Link(File file) Link(String href) void discardContent() void disconnect() String toURL() String toDescription() void parseURL() URL urlFromHref(Tag tag, URL base) Tag replaceHref(String newHref)
vytvoří link na základě start,end HTML tagu a URL adresy vytvoří link na základě URL adresy vytvoří link na základě File vytvoří link na základě URL zadané jako String eliminuje všechny reference na obsah stránky odpojí link od stažené stránky vrací URL linku jako String vrací popis linku parseruje URL vytvoří URL na základě HTML tagu kopíruje start tag linku přesunutím URL
12
7
URLPredicate na základě regulárního výrazu kontroluje nalezené odkazy boolean shouldActOn (Page page)
vrací true pokud odkaz na Page odpovídá reg. Výrazu
8
DownloadParameters datová třída, ukládá nastavení robota
9
LinkEvent vypisuje události z robota vznikající při procházení webu LinkEvent (Crawler crawler, int id, Link link) String toString ()
vytvoří posluchače pro konkrétní link konvertuje událost na vypsatelný String
10
Page reprezentuje webovou stránku, kterou okamžitě parsuje vytvoří stránku stáhnutím a Page (Link link) zparserováním linku vytvoří stránku stáhnutím a Page (Link link, DownloadParameters dp) zparserováním linku Page (Link link, DownloadParameters dp, HTMLParser vytvoří stránku stáhnutím a parser) zparserováním linku vytvoří stránku zadáním její URL a HTML Page (URL url, String html) obsahu Page (String content) vytvoří stránku zadáním HTML obsahu void download (DownloadParameters dp, HTMLParser parser) stáhne stránku a zparseruje jí void parse (HTMLParser parser) zparseruje stránku void keepContent () zamkne obsah stránky void discardContent () odemkne obsah stránky boolean hasContent () testuje jestli je obsah dostupný Text[] getWords () vrací ze stránky pouze smysluplný obsah Element[] getElements () vrací ze stránky pouze HTML tagy Element getRootElement () vrací hlavní tag stránky Link[] getLinks() vrací linky na stránce
11
HTMLParser slouží k rozparserování obsahu HTML stránky HTMLParser() void tokenize(Page page) boolean isWhiteSpace(char c) void buildParseTree(Page page) Element makeElement(URL base, Tag tag)
vytvoří nový parser provede lexikální analýzu stránky vrací true, pokud se jedná o bílý znak rozloží stránku jednotlivé elementy v tazích a najde všechny odkazy
vytvoří element stromu vrací znak zvláštního HTML "znaku" (např. nedělitelné Character lookupEntityRef (String name) mezery "nbsp", ...)
13
12
PageOutput stahuje ze zpracovávaných stránek jejich obsah a připravuje jej na zápis do souborů PageOutput(Page page) String getTitle() String getURL() String getStranka() String getText() void write()
vytvoří nový stahovač k dané stránce vytáhne z Page obsah tagu title vytáhne z Page její URL vytáhne z Page její obsah včetně tagů vytáhne z Page její smysluplný obsah zapíše výstup do souboru
13
Regexp pracuje s regulárnímy výrazy public Regexp (String pattern) public boolean equals (Object object) void readObject (ObjectInputStream in) void init () public static String escape (String s) String translateFields (String s) public String toString () public PatternMatcher match (Region region)
14
15
vytvoří Regexp s regulárním výrazem porovnání dvou objektů s regulárnímy výrazy načte regulární výraz inicializuje regulární výraz odebere určité znaky z regulárního výrazu převe regulární výraz do určité formy vrátí řetězec regulárního výrazu vrátí nově vytvořený objekt RegexpMatcher
RegexpMatcher hledání shody regulárního výrazu vytvoří objekt s regulárním výrazem a public RegexpMatcher (Regexp regexp, Region source) regionem protected Region findNext () nalezne další objekt Region Tagexp využívá regulární výrazy uvnitř stránky public Tagexp (String pattern) public String toRegexp (String tagexp) void canonicalizeTag (StringBuffer output, Tag tag, int j) void canonicalizeTagPattern (StringBuffer output, Tag tag) void sortAttrs (String[] attrs) String encodeAttrValue (String value) String translatePattern (StringBuffer output, String s, String d) void translateText (StringBuffer output, String s) public boolean equals (Object object) public String toString () public PatternMatcher match (Region region)
14
regulární výraz pro hledání vytvoří z řetězce regulární výraz upravení regulárního výrazu upravení regulárního výrazu seřadí řetězce do určitého pořadí převedení do jiného kódování převede regulární výraz do určitého tvaru nahradí rité znaky v řetězci vrátí true, pokud jsou dva objekty shodné vrátí řetězc regulárního výrazu vrátí nově vytvořený objekt TagexMatcher
16
17
TagexpMatcher hledání shody regulárního výrazu vytvoří objekt s regulárním výrazem a public TagexpMatcher (Tagexp tagexp, Region source) regionem Region mapCanonical2Region (Page p, String s, int start, nalezne region uvnitř stránky shodný s int end) regulárním výrazem int nextTag (String canon, int p) vrátí pozici dalšího tagu int prevTag (String canon, int p) vrátí pozici předchozího tagu int indexOfTag (String canon, int p) vrátí pozici nalezeného tagu Wildcard třída pro zpracování vstupu na regulární výraz public Wildcard (String pattern) public String toRegexp (String wildcard) public static String escape (String s) public boolean equals (Object object) public String toString ()
vytvoření objektu se vstupním regulárním řetězcem převedení řetězce na regulární výraz odstranění určitých znaků z řetězce vrátí true, pokud jsou dva objekty shodné vrátí řetězc regulárního výrazu
15
4.2 Konzole 4.2.1 UML pro Konzole
4.2.2 Přehled tříd z Konzole modul: id 1 2 3
Konzole název třídy NactiConfig Konzole Statistika
16
4.2.3 Třídy z Konzole 1
NactiConfig získává vstupní parametry pro program ze souboru NactiConfig() void nactiData() String ParsujConfig(String nezpracovano)
2
Konzole spravuje konzoly a ovládá aplikaci vytvoření instance třídy Konzole spuštění nové relace pokračování v předchozí relaci výpis právě procházených URL adres výpis statistiky procházení na webu ukončení aplikace
Konzole() void novaRelace() void pokracovaniVRelaci() void vypis() void statistika() void konec() 3
vytvoření instance třídy NactiConfig načte data ze souboru rozparsuje načtená data na vstupní parametry
Statistika vypíše informace o procházení webových stránek Statistika() long pocetNavstivenychAdres() long velikostKorpusu() void vypisStatistiky() void ulozeniStatistiky()
vytvoření instance třídy Statistika zjistí počet navštívených webových adres zjistí velikost paměti uložených dat (=korpusu) vypíše počet navštívených URL adres a velikost paměti uložených dat uložení výpisu statistiky do souboru
17
4.3 IO_Output 4.3.1 UML pro IO_Output
4.3.2 Přehled tříd IO_Output modul: id 1 2
IO_Output název třídy IOWriter DBInterfeace
4.3.3 Třídy z IO_Output 1
IOWriter zajišťuje zápis dat do souboru IOWriter(String filepath, String data) IOWriter(String filepath) IOWriter(String data)
2
vytvoří nový soubor a zapíše do něj data vytvoří nový soubor zapíše data do souboru
DBInterfeace třída pro samotnou práci s databází vytvoří nové rozhranní pro komunikaci s DB a DBInterface(String server, String jmeno, String heslo) nastaví jeho connectionString Link nextLink() vytáhne z databáze další link k navštívení boolean wasVisited(Link link) zjistí, zda byl link už navštívený nebo ne vloží link do databáze a informuje, zda se to boolean addLink(Link link) povedlo
18
5 Přiřazení tříd/modulů programátorům Znázornění významné práce programátorů (při vytváření/zásadním-přetváření tříd programu): Třída Modul Programátor(ři) HTMLParser.java Crawler Gemela, Šmolík PageOutput.java Crawler Gemela, Šmolík IOWriter.java IO_Output Gemela, Šmolík Crawler.java Crawler Gemela, Šmolík Page.java Crawler Gemela, Šmolík DBInterface.java IO_Output Trhoň DBComunicator.java Crawler Trhoň NactiConfig.java Konzole Karfiol, Řeřicha Konzole.java Konzole Karfiol, Řeřicha Statistika.java Konzole Karfiol, Řeřicha
19