Lze pomocí PHP naprogramovat, aby se data na webu automaticky měnily na základě jiného webu? Konkrétně například výsledky zápasů.
Fórum › PHP
Automatická aktualizace dat
#1 Shark
Jde to celkem snadno i bez cronu, když místo hodin použiješ aktivitu uživatele a trochu ji omezíš, aby ses druhého serveru neptal častěji než třeba 1× za minutu. Výsledky si uložíš do nějaké cache a pokud se někdo dotáže dřív, pošleš mu data z té cache.
Pokud to však chceš jen pro sebe, cache i omezování můžeš klidně vypustit a udělat si z toho jednoduchou proxy. Přesně tak sleduji tohle (a nejen tohle) fórum. Skript si natáhne stránku z webu, vybere z ní jen to, co mě zajímá a to zobrazí.
#6 Shark
Pokud chceš získávat data z nějakého webu, máš vpodstatě dvě možnosti jak to udělat:
1) Pomocí tzv. API, neboli Aplikačního Rozhraní. To funguje tak, že se webu zeptáš na informace které potřebuješ a web ti to více čí méně ochotně sdělí. Bohužel né všechny weby API mají. Pro více info o API se podívej například na Wikipedii, myslím, že je to tam vysvětlené docela pěkně, i když dost odborně.
2) Pomocí WebCrawleru/HTMLCrawleru. To je knihovna (existuje jich spousta pro různé jazyky včetně PHP), která dokáže pomocí bežných CSS selektorů (class, ID, tag apod.) najít specifický element ve stránce (případně seznam několika stejných) a vypsat je. To se používá v případě, že web ze kterého potřebuješ tahat data API nemá.
Jde to pomerne jednoduse. Resi se tak kurzovni listek nebo vysledky fotbaloveho zapasu, pocasi, treba. Nepritel poskytuje txt soubor a ty si jej stahnes a prepises na html pomoci php. Soubor ulozis a kontrolujes si jeho stari. Kdyz je moc stary, vygenerujes novy. Netahas to online, protoze bys zatezoval jejich server, coz se jim libit urcite nebude.
#10 peter
"Nepřítel"???
Proč přepisovat na HTML? Stačí soubor například jednou za hodinu stáhnout a v původním TXT formátu si ho uložit k sobě (případně převést do JSONu). Potom si buď nastavit CRON, aby každou např. hodinu kontroloval, jestli je soubor stále aktuální (např. pomocí MD5 checksumu) a případně ho aktualizoval. Místo cronu se to dá invokovat i aktivitou uživatele a omezit akci tak, aby ji se spustila max. 1x za hodinu, vždy na popud uživatele.
Ten kurzovni listek zobrazujes jako html. Tudiz logicky je lepsi to hned preformatovat.. Samozrejme to zalezi na konkretni aplikaci, ktera cesta bude vyhodnejsi.
Kontrolovat cronem kazdou hodinu od 22 do 6 rano, kdy neni na strance temer nikdo, no nevim :) Mozna vyhledavace tam slidi.
#14 peter
Formátovat to rovnou do HTML je s prominutím stupidní. Co když budeš potřebovat vytáhnout jen jeden údaj? Nebo třeba něco spočítat. Budeš to potom lovit v tom HTMLku? A co je špatného na tom, stahovat data i když uživatel není aktivní? Vadí to snad něčemu?
#15 JacobCZ
Ono je stupidní i to ukládání do textového souboru. Je lepší to rovnou rozparsovat a uložit do databáze.
Kurzovní lístky se stejně mění jen kolem 14:30, ale Shark se ptal za výsledky zápasů. Takový výsledek se aktualizuje jen jednou...
#16 Kit
Vysledky zapasu se aktualizuji, kdyz je nekdo aktualizuje :) Cili, treba prvni den se hraji 3 zapasy, druhy 0, protoze prselo, treti 5. A ted zalezi, ve kterem case to kdo aktualizuje.
V pripade skolniho turnaje se to zmakne vsechno behem dne a aktualizuje se to vetsinou hned po zapase.
Takze ten interval je tez podle okolnosti.
#15 JacobCZ
Ale obvykle se nehraje po tme, takze po 22 to nema obvykle zmysl, pokud nejde o olympiadu nebo cizi zeme s posunem casu.
#18 peter
Řekněme, že při prvním pokusu nejsou žádná data. Každý dotaz je přeposlán na server. Aktualizace se však stále nekoná, protože není co aktualizovat. Zápas je dohrán, jsou zveřejněny výsledky. Některý klient si obnoví stránku, data jsou zjištěna jako nová a uložena do cache řekněme s platností 10 minut. Všichni ostatní klienti dostanou tuto informaci. Po deseti minutách však už není platná a proto je znovu odeslán požadavek na server.
Ahoj. Tak něco jsem si zjistil z PHP apod. a vrátil jsem se k tomuto problému. Chtěl bych se prosím ještě na něco zeptat.
Pomocí file_get_contects získám obsah stránky, ale teď jsem se zasekl na tom získat pouze potřebné data. Ať hledám jak hledám, bohužel na to pořád nemůžu přijít, tak abych to nějak rozumně chápal. Mohl by mě prosím někdo trochu nasměrovat? Díky :)
#21 Shark
Zřejmě jsi stáhl HTML a chceš z něj vyzobnout jen některá data. Používají se na to různé parsery od regulárních výrazů až po DOM nebo SAX. Záleží na tobě, který si vybereš.
Upřímně, ještě nevím z kama to budu tahat, zatím jsem pouze hledal na netu způsob jak to vyřešit. Ale dejme tomu, že to budu tahat výsledky NHL z nějaké stránky s výsledkama, např. onlajny, nebo něco podobného.
#26 Shark
Tak v tom případě si vygoogli něco ve stylu "PHP DOM Crawler" a nauč se s tím. DOM Crawler je vpodstatě nástroj, pomocí kterého můžeš procházet strukturu stránky pomocí DOM selektorů (jako v CSS nebo JS: element.třída.další-třída#id) a následně z takto vybraných elementů tahat data jako text apod...
#41 JacobCZ
Je to dost podivná knihovna. Používá globální konstanty, nedodržuje konvence, nepoužívá standardní parser - PHP má několik rychlých parserů napsaných v C. Delší soubory bych v tom tedy parsovat nechtěl - stejně je to omezeno jen do 600 kB.
#43 JacobCZ
Zde je ukázka, jak si mohu z této stránky vytáhnout pouze tvoji odpověď pomocí standardních nástrojů PHP:
<?php
$url = "http://programujte.com/forum/vlakno/29963-automaticka-aktualizace-dat/";
$content = file_get_contents($url);
$dom = new \DOMDocument('1.0');
@$dom->loadHTML($content);
$hodnoceni = $dom->getElementById('hodnoceni_popis_206080');
echo $hodnoceni->textContent;
Žádná externí knihovna není potřebná.
#45 JacobCZ
PHP má několik DOM parserů, ale pro parsování HTML se mi osvědčil DomDocument. Má své mouchy, například má problém se zpracováním stránky, na které chybí definice charset. Taková stránka se mu pak musí trochu "předžvýkat". Pro většinu stránek však funguje bezvadně.
Tak, ono se to da orezat i pres strpos, kdyz je kod duveryhodny. To delam tady
http://www.slu.cz/fpf/cz/veda - vpravo Nase publikace, vede na stranku http://nora.fpf.slu.cz/…rame-fpf.php, ktera kopiruje vzhled z predchozi :) Je to sice trochu na houby, ale aspon to klonuje realnou stranku a nemusim to porad opravovat.
$data = file_get_contents('http://www.slu.cz/fpf/cz/veda');
$pos = strpos($data,'<div class="main_content">') + 26;
$pos = strpos($data,'</div>',$pos) + 6;
$pos = strpos($data,'</div>',$pos) + 6; // h1buttons
$pos = strpos($data,'</div>',$pos) + 6; // main_navpathbar
$pos = strpos($data,'<div',$pos) + 4; // div body
$pos = strpos($data,'>',$pos) + 1; // body start
$posstart = $pos;
$pos = strpos($data,'</div><!-- //main_content -->',$pos); // body near end
$posend = $pos;
$data = substr_replace($data, $insert_code . "\n".'</div>',$posstart,$posend-$posstart);
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Automatická aktualizace programu - HOWTO — založil Aigor
Aktualizace dat z db v JTable — založil Rikimara
ADO - aktualizace dat spojených tabulek — založil lukas
Aktualizace dat PHP pomocí JQuery — založil omorok
Automatická serializace a výkon — založil Honza Jebavý
Moderátoři diskuze