3. 5. 2014

PHP spracovanie - sťahovanie a parsovanie

Pri dynamicky generovaných stránkach je možné použiť iné stránky ako zdroj údajov.
Stiahnutie údajov z inej stránky je vlastne proces zložený z dvoch krokov:
  1. stiahnutie stránky do textového reťazca
  2. 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ý.

$f = fopen("http://www.example.com/","rb");

$data=''; 
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.

function get_content($url)
{
$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:

function get_cont3($url1,$url2,$url3)
{
$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);
}

Funkcia sa zavolá s 3 adresami ako parametrami a stránky sa načítajú ako výstup do poľa:
$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);

$nad = strip_tags($tit[1]);
$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