PHP: Cum luăm conţinut de pe web?


Subiectul PHP a fost tratat anemic pe aici, dar măcar din când în când să vedem nişte subiecte ceva mai tehnice ce pot prezenta interes în special pentru începători. Ce vă propun în continuare poate fi înţeles greşit într-o primă fază, dar vă asigur că există utilizări… legale. Mai exact ne propunem să luăm conţinutul unei pagini web pentru a face diverse operaţii. Primul gând va fi: aha! aşa îşi fac unii situri luând conţinut de pe alte situri! adică furând munca altora! Treaba lor. Înainte să ne justificăm, pentru a nu mai prelungi introducerea, să vedem cum se face. Practic am putea dintr-o singură linie de cod folosind file_get_contents (vedeţi pentru mai multe documentaţia de pe PHP.net).

[PHP][/PHP]

Cu această funcţie luăm conţinutul unei pagini şi îl punem într-o variabilă tip text pe care apoi o putem parcurge pentru a lua ceva anume. În clipa în care ai pagina într-un string totul depinde de arta parcurgerii, cu funcţiile pe string-uri, precum strpos() sau substr(). Un exemplu cât de cât concret: avem o pagină pe web ce conţine un titlu indicat cu tagul H1. Vom căuta <h1> şi </h1>, extrăgând într-o variabilă ce este între aceste două taguri şi astfel am obţinut respectivul titlu.

Problema este că unele configuraţii de server PHP (depinde de la firmă – de hosting – la firmă, mai puţin în cazul în care faceţi testele pe un server local) funcţia file_get_contents ar putea fi blocată. O alternativă este atunci folosirea bibliotecii CURL. De regulă pe un anumit server lipseşte maxim una dintre acestea, astfel că dacă lipseşte una încerci cu cealaltă.

[PHP][/PHP]

Bun. La ce pot fi utile astfel de „alimentări”? În primul rând mai toate API-urile cer folosirea unor astfel de funcţii. De regulă un API furnizează un anumit răspuns la apelarea unei pagini cu anumiţi parametri. Drept urmare, dacă vrei să scrii o aplicaţie care să folosească respectivul API trebuie să apelezi o pagină web cu o cheie şi ceva parametri şi… să iei „răspunsul” paginii. Sunt tot felul de alte situaţii în care e util. Ai două situri pe servere diferite (să zicem) şi vrei o anumită bucată de pagină (ex: un DIV cu noutăţi din situl 1) să apară şi în celălalt sit (situl 2). E simplu: la acel DIV îi dai un nume unic şi clar (pentru tine) pe care să îl poţi „decupa” parcurgând string-ul cu conţinutul paginii.

Un ultim exemplu, din experienţa mea. E drept că e la limită cumva, e în gri (nici prea legal nici prea ilegal). Urmăresc o pagină ce se actualizează zilnic (nu dau nume, spun doar că e religioasă, pentru a nu se crede că e vorba de un furt tehnic). Sunt acolo nişte informaţii pentru mine importante dar doar în perspectivă. Adică nu astăzi, ci poate mâine sau peste o lună – atunci când pagina de astăzi nu mai este. De aceea mi-am făcut un sistem care zi de zi ia conţinutul paginii şi îl pune într-o bază de date. Astfel pot oricând să regăsesc un conţinut despre care îmi dau seama ulterior că mă interesa.

Şi un alt exemplu (acesta e chiar ultimul) de la un proiect web oarecare. Un anumit sit avea o bază de date de membri, cu nume de utilizator şi parolă. O secţiune trebuia dezvoltată cu identificarea membrilor dar fără accesarea bazei de date de membri. Ups… cum aşa? Simplu. Să zicem că era situl www.florariamagnolia.ro. Acolo punem o pagină ce are acces la baza de date şi care ia ca parametri numele de utilizator şi parola şi dacă există potrivire pagina va scrie sec şi simplu DA, dacă nu NU. Atunci subdomeniul să zicem felicitari.florariamagnolia.ro pentru identificare va apela www.florariamagnolia.ro/verifmembru.php?utiliz=ionescu.pop&parola=papucel şi dacă preluând conţinutul paginii găseşte DA înseamnă că a fost o identificare corectă. S-ar putea obiecta faptul că parola se trimite în curat. Se poate apela la MD5, dar ne îndepărtăm de subiect. Cred că ideea aţi prins-o. Succes!

PS1: PHP.net are un exemplu ce ar putea prezenta interes – Using PHP’s cURL module to fetch the example.com homepage

PS2: O funcţie ceva (puţin) mai elaborată găsiţi aici, cu explicaţiile de rigoare.

[PHP]/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don’t return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => „”, // handle all encodings
CURLOPT_USERAGENT => „spider”, // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);

$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );

$header[‘errno’] = $err;
$header[‘errmsg’] = $errmsg;
$header[‘content’] = $content;
return $header;
}[/PHP]


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (4 evaluări, media: 4,75 din 5)
Loading...Loading...

4 comentarii

  1. Eu am gasit site-uri care nu te lasa sa copiezi continutul cum faci tu.
    Ele detecteaza ca header-ele nu sunt trimise de browser-e si nu te lasa sa copii si astfel tu trebuie sa „simulezi” copierea continutul cu CURL. Codul care a functionat pentru mine este:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, „Mozilla 1.7”);
    curl_setopt($ch, CURLOPT_URL, $page_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $this->contents = curl_exec($ch);
    curl_close($ch);

    Deci curl_setopt($ch, CURLOPT_USERAGENT, „Mozilla 1.7”); simuleaza faptul ca tu vezi pagina cu Mozilla Firefox si te lasa sa copiezi.

  2. radu.capan spune:

    Dacă un sit se „protejează” la copiere… are motivele lui, nu? Oricum, este de reţinut completarea şi mulţumesc pentru ea.

  3. Dezmirean Florin spune:

    Multumesc Radu,

    Foarte bun articolul, eu chiar aveam nevoie.
    Eu folosesc acum pentru valuta. Dar daca se schimba valuta?
    Poti sa-mi spui ce trebuie sa fac? eu trebuie sa fiu la curent tot timpul cu valuta si vreau sa se reconecteze la fiecare trei minute, sa zicem?

    Inca ceva, cum pot sa iau de pe mai multe pagini?
    Alte valute.

    Multumesc anticipat,
    Florin

  4. radu.capan spune:

    Pentru a lua de pe mai multe pagini se multiplica codul de cate ori e nevoie. Pentru actualizare: la fiecare incarcare a paginii se va lua informatia din acea clipa. Daca se doreste o interogare cu o anumita frecventa se poate folosi o sarcina programata (cron job) care eventual sa puna intr-o baza de date valoarea cursului.


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *