ARCHIV |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
Perl (65) - Projekt - získání datDnes v rámci našeho projektu stáhneme potřebná data z webu a pomocí regulárních výrazů z nich vyextrahujeme data o zápasech. Pojďme tedy začít se samotným programováním. Ovšem nejdříve si musíme vše naplánovat a rozhodnout se, kde začneme. Vzhledem k tomu, že jsme zvolili objektově-orientovanou koncepci, začneme určitě modulem Livescore.pm. Napíšeme konstruktor a potom můžeme klidně postupovat podle bodů, které jsme si vytýčili posledně. Nuže, dejme se do doho. KonstruktorNyní je třeba učinit ješte jedno rozhodnutí. Co bude uchovávat objekt? Určitě bude třeba v nějaké formě uložit stránku, ze které budeme stahovat data. Dnešní zápasy jsou k dispozici na http://www.livescore.com/default.dll?page=home, zápasy v rámci České republiky na http://www.livescore.com/default.dll?page=czechia apod. V první verzi konstruktoru tedy uchováme home, czechia apod., které přijde jako parametr konstruktoru od uživatele. Konstruktor zatím necháme být, protože se ještě může spousta věcí změnit a jméno soutěže je asi jediná jistota. Prozatím vypadá náš konstruktor takto.
Získání zdrojového kóduPrvním úkolem, který by měl modul Livescore učinit na základě požadavku od uživatele je získání dat. Data získáme na základě položky liga v objektu. Tato funkce nebude veřejná (resp. zdokumentovaná). Jejím úkolem bude vrátit data, o jejichž zpracování se postará zase někdo další. Jak ale stáhneme data z webu? Nejjednodušší je prohledat CPAN. Jedním z modulů, který to umí je WWW::Mechanize, jež obsahuje metodu get($url).
use WWW::Mechanize;
Nyní můžeme napsat poměrně jednoduchou metodu ziskej_zdrojovy_kod. Je třeba si uvědomit, že dříve nebo později ji budeme muset přepsat kvůli perzistenci. Zatím to však řešit nebudeme.
Extrakce datToto bude možná nejtvrdší oříšek celé aplikace. Co všechno budeme potřebovat za data? Nahlédněme do zdrojového kódu. Vidíme, že lze získat toto.
Úkolem je vytvořit na základě staženého zdrojového kódu pole hashů, které bude obsahovat zmíněné informace o jednotlivých zápasech. Bude to mechanická práce, ovšem i tu je dobré si ozkoušet. Tato metoda bude veřejná. To znamená, že uživatel bude nucen volat při použití modulu Livescore nejprve konstruktor a následně metodu ziskej_zapasy_dane_ligy, kterou právě píšeme. Díky tomu si sám uživatel bude řídit, kdy data aktualizovat. Pro jednoduchost metoda vrátí seznam vyhovujících zápasů, se kterým bude nakládat dle uvážení uživatel. Zápasy tak nebudou součástí objektu. Podíváme-li se na zdrojový kód, zjistíme, že to nebude vůbec tak jednoduché, protože každý zápas může být zobrazen v několika formátech. Pokud nejsou dostupné žádné podrobné informace k zápasu, nalezneme jako jeho reprezentaci ve zdrojovém kódu z livescore.com toto.
Pokud však již byla zaznamenána branka nebo jiná událost, vytvoří uvnitř odkaz a rázem se celý zdrojový kód pro zápas změní.
Nehledě na to, že k zápasu musíme přidávat další dvojici údajů, která je rozmístěna mezi zápasy. Jsou to datum a čas výkopu a soutěž. Čas výkopu získáme z tohoto úseku kódu. Navíc může být čas změnen lokálně u jednotlivých zápasů.
A nakonec jméno soutěže a stát získáme odtud.
Všechny tyto úseky se v podstatě náhodně vyskytují uvnitř staženého zdrojového kódu. Je tedy třeba postupně projít celý zdrojový kód a hledat výskyty zmíněných úseků. Přitom musíme dodržet jejich pořadí, protože jinak bychom nebyli schopni správně určit čas výkopu a soutěž. Všimněme si, že každý údaj - ať již datum konání, národní soutěž a zápas jsou vždy na jednom řádku. Tudy povede cesta. Alespoň pro naše řešení. Napišme si tedy podrobnější postup extrakce dat.
Nejprve získáme zdrojový kód pomocí již napsané metody.
Z něj odseparujeme veškeré úseky, které začínají <tr> a končí </tr>. Jsou to pro nás potenciální užitečné informace.
Další bod je úspěšně za námi. Teď ale přijde na řadu to nejhorší. Každý řádek budeme muset pečlivě prozkoumat.
Hlavním "work horse" tohoto problému budou regulární výrazy. Pomocí nich zajistíme veškerou extrakci. Předně budeme zjišťovat, zda řádek je pro nás cenná informace. Jak to poznáme? Vzpomeňme na úryvky ze zdrojového kódu na začátku tohoto oddílu. Budeme muset vytvořit pro každý úsek vzor a ten porovnat s řádkem. Bude to vypadat takto.
Musíme napsat následující tři regulární podvýrazy.
druhy řádků, ze kterých chceme získat data Tento regulární výraz tady nebudeme kompletně odvozovat, protože je to spíš manuální práce a popis by zabral několik stránek. Je třeba najít co nejvíc variant formátu těchtýž dat ve staženém zdrojovém kódu a pokusit se vytvořit regulární výraz, který je všechny zahrne. Každý řádek se zápasem na www.livescore.com má totiž trochu jiný formát a tento rozdíl musíme vyeliminovat. Úkol tedy zní: Nalezněme regulární výraz, kterému vyhoví, všechny řádky obsahující informaci o zápase. Stejně potom budeme postupovat i u získávání času a soutěže. Uveďme si několik obecných metod, kterými lze regulární výraz tvořit.
Pod nějaké době získáme tento nebo jemu podobný regulární výraz pro řádek se zápasem.
Podobně získáme další dva regulární výrazy, spojíme je alternací a vepíšeme do podmínky.
Poznámka - kvůli sazbě byly výše uvedené zdrojové kódy rozděleny do řádků. Znaky nových řádků ovšem do programu nepatří. Nyní máme jistotu, že data na řádku, jež vyhovuje výše uvedenému regulárnímu výrazu jsou pro nás cenná. Nyní bychom se měli zamyslet, jak je správně dostaneme do proměnných. Zde je tabulka extrahovaných hodnot.
Tyto informace uložíme do výsledného pole. Ještě předtím však několik údajů pozměníme. Jsou to většinou věci, které bychom dělali až během testování výsledného programu, ale protože je na to třeba delší zkušenost s daty na livescore.com, uveďme je pro lepší orientaci hned.
U proměnné $1, nahrazujeme původní hodnotu konstantou. Tyto konstanty je třeba definovat.
Nyní nám zbývá vytvořit z obou tabulek zdrojový kód. Pokud tedy narazíme na řádek s informacemi o soutěži (zjistíme to tak, že jsou definované proměnné $9 a $10), nastavíme proměnné $soutez a $zeme.
V případě řádku s informacemi o čase (jsou definované proměnné $11 až $13), nastavíme proměnné $cas, $den a $mesic. $mesic zkonvertujeme (ne příliš elegantně) na pořadové číslo příslušného měsíce.
A pak zde máme informace o zápase. Na tomto řádku nejen, že nastavíme proměnné, ale všechna data zaznamenáme. Navíc musíme udělat větší množství úprav v datech. Je třeba vyřešit ampérsandy a obsah proměnné $skore. Dále je třeba upravit obsah proměnné $minuta a $hraje_se.
A jsme hotovi. Nyní náš modul již umí získat informace o zápasech.
Související články
Předchozí Celou kategorii (seriál) Další
Perl (1) - Dávka teorie na úvod
Perl (2) - Úvod do syntaxe Perl (3) - Proměnné Perl (4) - Čísla a řetězce Perl (5) - Podmínky Perl (6) - Pravdivostní výrazy Perl (7) - Vstup poprvé Perl (8) - Některé základní vestavěné funkce Perl (9) - Cykly Perl (10) - Další řídící struktury Perl (11) - Pole - úvod Perl (12) - Pole - základní operace Perl (13) - Hashe Perl (14) - Další nástroje pro seznamy Perl (15) - Výchozí proměnná, heredoc, symbolické odkazy Perl (16) - Regulární výrazy - začínáme Perl (17) - Regulární výrazy - kotvy Perl (18) - Regulární výrazy - množiny znaků Perl (19) - Regulární výrazy - opakování a kvantifikátory Perl (20) - Regulární výrazy - magické závorky Perl (21) - Regulární výrazy - nahrazování Perl (22) - Regulární výrazy - přepínače Perl (23) - Regulární výrazy - rozšířené vzory Perl (24) - Regulární výrazy - příklady Perl (25) - Regulární výrazy - závěr Perl (26) - Podprogramy Perl (27) - Prototypy Perl (28) - Rozsahy platnosti proměnných Perl (29) - Úvod k práci se soubory Perl (30) - Práce se soubory Perl (31) - Testování souborů Perl (32) - Jiné typy souborů Perl (33) - Formátování výstupu - printf Perl (34) - Formátování výstupu - formáty Perl (35) - Vestavěný debugger Perl (36) - Grafické debuggery Perl (37) - Začínáme s moduly Perl (38) - Rozhraní modulu Perl (39) - Pragma Perl (40) - Dodatky k modulům Perl (41) - CPAN Perl (42) - Argumenty příkazového řádku Perl (43) - Přepínače Perl (44) - Dlouhé přepínače Perl (45) - Odkazy Perl (46) - Užití odkazů a anonymní data Perl (47) - Složitější datové struktury Perl (48) - Libovolně složité datové struktury Perl (49) - Tabulky symbolů a typegloby Perl (50) - Uzávěry a iterátory Perl (51) - Signály Perl (52) - Externí příkazy Perl (53) - Režim nakažení Perl (54) - Fork Perl (55) - Eval Perl (56) - Volby příkazu perl Perl (57) - Jednořádkové skripty Perl (58) - OOP - úvod Perl (59) - OOP - typické použití Perl (60) - OOP - dědičnost Perl (61) - OOP - přínos a užití dědičnosti Perl (62) - OOP - přetěžování Perl (63) - OOP - závěr Perl (64) - Projekt - čtečka sportovních výsledků Perl (66) - Projekt - výběr zápasů a podrobnosti Perl (67) - Projekt - dokončujeme modul Perl (68) - Projekt - zobrazení zápasů Perl (69) - Projekt - online přenos Perl (70) - Plain Old Documentation Perl (71) - Navazování proměnných Perl (72) - Navazování složitějších datových typů Perl (73) - DBM Perl (74) - Sockety Perl (75) - Obsluha více klientů Perl (76) - Síťová hra v kostky Perl (77) - Služby internetu Perl (78) - Databáze - úvod Perl (79) - Databáze - manipulace s daty Perl (80) - Databáze - závěrečné poznámky Perl (81) - CGI - příprava webového serveru Perl (82) - CGI - první skripty Perl (83) - CGI - získávání dat od uživatele Perl (84) - CGI - usnadnění tvorby skriptů pomocí modulu CGI Perl (85) - CGI - generování dokumentu modulem CGI Perl (86) - CGI - cookies Perl (87) - CGI - příklad aplikace Perl (88) - CGI - závěr Perl (89) - Mason - snadné psaní webů Perl (90) - Mason - speciální bloky Perl (91) - Mason - handlery Perl (92) - Mason - závěr Perl (93) - Catalyst - MVC framework pro Perl Perl (94) - Catalyst - základy pro psaní aplikace Perl (95) - Catalyst - šablony Perl (96) - Catalyst - spolupráce s databází Perl (97) - Curses - tvorba textových uživatelských rozhraní Perl (98) - Curses - pozicování a okna Perl (99) - Curses - měření rychlosti psaní Perl (100) - Curses - použití hotových widgetů Perl (101) - Curses - jednoduchý textový editor Perl (102) - Rozšiřování Perlu pomocí XS Perl (103) - Rozšiřování Perlu pomocí SWIG Perl (104) - Testování rychlosti Perl (105) - Testování programových jednotek Perl (106) - Debugování pomocí komentářů Perl (107) - Moose - moderní objektový systém Perl (108) - Moose - základní vlastnosti Perl (109) - Moose - role Perl (110) - Moose - meta API Perl (111) - Pokročilá práce se seznamy Perl (112) - Práce s PDF Perl (113) - Práce s archivy Perl (114) - Tk - úvod Perl (115) - Tk - umísťování widgetů Perl (116) - Tk - základní widgety Perl (117) - Tk - některé pokročilejší widgety Perl (118) - Tk - čas a události Perl (119) - Tk - CD man Perl (120) - Wx - základní práce s widgety Perl (121) - Wx - události Perl (122) - Gtk2 - úvod Perl (123) - Gtk2 - základní práce s obrázky Perl (124) - Gtk2 - události a čas Perl (125) - Gtk2 - vlastní widgety Perl (126) - Gtk2 - textové okno a práce s pozicemi Perl (127) - Gtk2 - hierarchické seznamy Perl (128) - Gtk2 - dialogy Perl (129) - Gtk2 - skládání widgetů Perl (130) - Gtk2 - menu a toolbary Perl (131) - Gtk2 - transparentní okna, tray ikona, výběr souborů Perl (132) - Gtk2 - drag&drop, druid Perl (133) - Gtk2 - úpravy vzhledu aplikací pomocí rc Perl (134) - Gtk2 - Glade Interface Designer Perl (135) - XML - čtení a zápis Perl (136) - XML - DOM a SAX přístupy Perl (137) - Vlákna Perl (138) - Memoizace - cachování podprogramů Perl (139) - Profilling - efektivní odhalování pomalých míst v programu Perl (140) - Profilling - píšeme si vlastní profiler / debugger Perl (141) - Formátování kódu, deparsování, perltidy Perl (142) - Způsoby konfigurování Perl (143) - Struktura datových typů, správa paměti Perl (144) - POE - událostmi řízené programování Perl (145) - POE - aplikace typu klient-server Perl (146) - Perl 6 - jazyk budoucnosti Perl (147) - Perl 6 - regulární výrazy, nové operátory Perl (148) - Perl Culture Perl (149) - Závěr Pozvánka na Český Perl Workshop Perl 5.22.0 a vše okolo Perl 5.24.0 a vše okolo Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |