Stiahnutie údajov z inej stránky je vlastne proces zložený z dvoch krokov:
- stiahnutie stránky do textového reťazca
- parsovanie a vytiahnutie potrebných údajov
Stiahnutie stránky
Pre stiahnutie obsahu stránky sa dajú použiť možnosti
- fopen
- curl
FOPEN je síce jednoduchší na manipuláciu (čítať stránku je rovnaké ako čítať lokálny súbor), ale väčšinou z bezpečnostných dôvodov poskytovateľom hostingu blokovaný.
while(!feof($f))
$data.=fread($f,$size);
fclose($f);
CURL je väčšinou poskytovateľmi povolený. Je to knižnica špecializovaná na prenos dát cez rôzne online protokoly (http/https/ftp/ a iné), podporuje aj POST, PUT a posielanie dát formulármi.
{
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
ob_start();
curl_exec ($ch);
curl_close ($ch);
$string = ob_get_contents();
ob_end_clean();
return $string;
}
CURL obsahuje širokú škálu nastavení cez curl_setopt, viz manuál php.
Každé sťahovanie spomalí vygenerovanie našej stránky, preto je dobré si rozmyslieť, či sťahovať naozaj potrebujeme, prípadne použiť lokálne cache súbory.
Keď je však sťahovanie naozaj potrebné, navyše z viacerých stránok naraz, je lepšie použiť paralelné sťahovanie cez curl_multi, skráti sa tým podstatne doba odozvy.
Príklad funkcie pre stiahnutie 3 stránok súčasne:
{
$ch1 = curl_init(); $ch2 = curl_init(); $ch3 = curl_init();
curl_setopt ($ch1, CURLOPT_URL, $url1);
curl_setopt ($ch1, CURLOPT_HEADER, 0);
curl_setopt ($ch1, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt ($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch2, CURLOPT_URL, $url2);
curl_setopt ($ch2, CURLOPT_HEADER, 0);
curl_setopt ($ch2, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt ($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch3, CURLOPT_URL, $url3);
curl_setopt ($ch3, CURLOPT_HEADER, 0);
curl_setopt ($ch3, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt ($ch3, CURLOPT_RETURNTRANSFER, true);
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
curl_multi_add_handle($mh, $ch3);
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running);
$resp1 = curl_multi_getcontent($ch1);
$resp2 = curl_multi_getcontent($ch2);
$resp3 = curl_multi_getcontent($ch3);
curl_close ($ch1); curl_close ($ch2); curl_close ($ch3);
return array($resp1,$resp2,$resp3);
}
$multi = get_cont3 ('http://www.dsl.sk','http://www.zive.sk','http://www.pc.sk');
$dsl = $multi[0];
Parsovanie stránky
Po stiahnutí obsahu stránky je potrebné z html kódu vytiahnuť informácie ktoré chceme. Obsah stránky, teda html kód vrátane formátovania a textu je v jednom dlhom textovom reťazci. Pre vytiahnutie je preto potrebné použiť funkcie pre prácu s reťazcami, alebo regulárne výrazy.
Veľmi jednoduché na použitie sú funkcie:
- preg_match - nájde jeden výskyt daného podreťazca (ako wildcards je hľadaný a vrátený reťazec označený v oblých zátvorkách, obklopený okolitými reťazcami)
- preg_match_all - vráti viac výskytov daného podreťazca
- str_replace - zamení prvý reťazec za druhý, ak ho nájde v treťom reťazci a vráti ako výstup, prvý a druhý parameter môžu byť polia
Príklad jednoduchého parsovania RSS:
$poc = preg_match_all("/<item.*?>(.*?)<\/item>/s", $rss, $itm) - 1;
if ( $poc > 20 ) { $poc = 20; }
// PRECHADZAME PRISPEVKY
for ($x = 0; $x <= $poc; $x++) {
preg_match("/<title>(.*?)<\/title>/s", $itm[1][$x], $tit);
preg_match("/<description>(.*?)<\//s", $itm[1][$x], $des);
$pop = strip_tags($des[1]);
echo '<b>'.$nad.'</b><br>'.$pop."<br>\n<br>\n";}
Pre spracovanie výstupov z iných stránok je teda potrebné najskôr analyzovať ich zdrojový kód a následne si prichystať šablónu (prípadne aj cyklus) ktorá bude filtrovať požadované dáta.
Žiadne komentáre:
Zverejnenie komentára