Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

curl - uzimaj svaki dan sa strane podatke

[es] :: PHP :: curl - uzimaj svaki dan sa strane podatke

[ Pregleda: 3491 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

peca89bg
Beograd

Član broj: 202034
Poruke: 354
95.180.69.*



+6 Profil

icon curl - uzimaj svaki dan sa strane podatke18.04.2011. u 17:51 - pre 157 meseci
Pozdrav svima.

Jel moze objasnjenje kako sa ove stranice http://www.roadstar.rs/index.p...rticle&id=48&Itemid=12
uzmem podatke o radarskim patrolama koje dezuraju?

Ja bi to preko curla, ali kako i sta posle kad uzmem celu stranu? Da se igram sa regularnim izrazima?

ja sam ovako zamislio:

smestim celu stranu u neku promenljivu, regularnim izrazom nadjem div u kome se nalazi podaci i uzmem samo podatke iz tog diva...

Jel bi moglo to ovako ili ima neko drugo i bolje resenje?

Hvala unapred!
 
Odgovor na temu

Br@nkoR
http://localhost

Član broj: 2597
Poruke: 1603

Sajt: localhost


+23 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke18.04.2011. u 17:58 - pre 157 meseci
Da može tako.
A možeš koristiti i npr. DOM+XPath
Banned - Not available
 
Odgovor na temu

Skaarj
Novi Sad

Član broj: 21463
Poruke: 365
*.dynamic.isp.telekom.rs.



+3 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke18.04.2011. u 18:15 - pre 157 meseci
Najbolje je da odradis kako si predlozio. To je najbrze i najefikasnije resenje.
 
Odgovor na temu

ivan.a
PHP developer

Član broj: 83976
Poruke: 403
*.dynamic.isp.telekom.rs.



+44 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke18.04.2011. u 18:40 - pre 157 meseci
Ja sam se malo igrao i uradio nešto na brzinu:

Code:
<?php
    function get_data($url)
      {
    $ch = curl_init();
    $timeout = 8;
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)');
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
      }
      
      $gURL = "http://www.roadstar.rs/index.p...rticle&id=48&Itemid=12";
      $content = get_data($gURL);
      
      $re="<div\s+class=\"article-content\">??(.+)<\/div>";
           if (preg_match("/$re/siU", $content, $matches))
       $text = ($matches[1]); else $text = "";
      
      echo "$text";
?>


Mada je i ovo odlično rešenje:
Citat:
Br@nkoR: A možeš koristiti i npr. DOM+XPath


I hope I didn't brain my damage - Homer
if (wife.position == kitchen) {return sandwich};
 
Odgovor na temu

peca89bg
Beograd

Član broj: 202034
Poruke: 354
95.180.69.*



+6 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke18.04.2011. u 18:57 - pre 157 meseci
Hvala puno svima na odgovorima ;)

jel moze objasnjenje za ovo "curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)');" cemu sluzi ?

DOM+XPath ? nisam do sada koristio, jel moze neki example da vidim kako i sta radi?

Hvala vam ljudi jos jednom ;)
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-3.sezampro.rs.



+33 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke18.04.2011. u 19:05 - pre 157 meseci
DOM-based scrap-ovanje nudi dosta veću slobodu i mogućnosti, npr.:
Code:
$dom = new DOMDocument();
$dom->loadHTML($dohvaceniHTML);

$xpath = new DOMXPath($dom);

$entries = $xpath->query("//div[@class='article-content']");
$content = $entries->item(0); //posto postoji samo jedan takav div cija je klasa "article-content", a u njemu se nalaze ti podaci koji ti trebaju

//I sad npr. mozes da kupis sadrzaje svih onih "p" tag-ova u njemu, ili sta ti vec odgovara:
$pTagovi = $content->getElementsByTagName('p');
for ($i = 0; $i < $pTagovi->length; $i++) {
    echo $pTagovi->item($i)->textContent;
}

Pritom čak nisi ni morao da ideš sa XPath, već si mogao odma' nad tim $dom objektom da dohvatiš sve div-ove (getElementsByTagName('div')), pa da "trčiš" kroz sve njih dok ne stigneš do tog sa atributom class="article-content", ($item->attributes->getNamedItem('class')->value == 'article-content'), i onda posle ide isto ovo sa dohvatanjem tih "p" tagova, itd.
 
Odgovor na temu

ivan.a
PHP developer

Član broj: 83976
Poruke: 403
*.dynamic.isp.telekom.rs.



+44 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke18.04.2011. u 19:26 - pre 157 meseci
Da, ovo ti je super rešenje koje je napisao Nikola Poša.

Inače, CURLOPT_USERAGENT opcija služi da imitira browser odnosno User Agent


I hope I didn't brain my damage - Homer
if (wife.position == kitchen) {return sandwich};
 
Odgovor na temu

Br@nkoR
http://localhost

Član broj: 2597
Poruke: 1603

Sajt: localhost


+23 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke18.04.2011. u 19:28 - pre 157 meseci
@Nikola Poša Može odmah da "hvata" p elemente, nema potrebe za dodatnim getElementsByTagName
Code:
$entries = $xpath->query("//div[@class='article-content']//p");



EDIT: evo ceo primer
Code:

$dom = new DOMDocument();
@$dom->loadHTMLFile('http://www.roadstar.rs/index.p...rticle&id=48&Itemid=12');
$xpath = new DOMXPath($dom);
$entries = $xpath->query("//div[@class='article-content']//p");
foreach($entries as $e)
  echo $e->textContent . '<br />';

Banned - Not available
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-3.sezampro.rs.



+33 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke18.04.2011. u 20:26 - pre 157 meseci
Citat:
Br@nkoR: @Nikola Poša Može odmah da "hvata" p elemente, nema potrebe za dodatnim getElementsByTagName

Da, naravno, nego nisam hteo odmah da odemo na "p" tagove, jer možda je npr. hteo da uzme textContent celog tog parent div-a. A i nije mi cilj bio da mu napišem ceo primer kôda, već da malo sâm stekne jasniji uvid na koje sve načine može da se radi sa DOMDocument-om, itd.
 
Odgovor na temu

Br@nkoR
http://localhost

Član broj: 2597
Poruke: 1603

Sajt: localhost


+23 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke18.04.2011. u 20:38 - pre 157 meseci
Ok, sorry :)
Pozdrav.
Banned - Not available
 
Odgovor na temu

peca89bg
Beograd

Član broj: 202034
Poruke: 354
95.180.69.*



+6 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke19.04.2011. u 02:47 - pre 157 meseci
Ljudi hvala vam puno! Sad dodjoh kuci pa nisam stigao da isprobam sve i da malo eksperimentisem :)

Sad skrecem malo sa teme al' ajd' da pitam: zasto echo "$text"; zasto ne echo $text; ?? jel neki standard ili stvar navike? :)

Inace,
od kada postoji ovaj DOM+XPath? :) zaista izvandredna stvar....

Ovo $dom->loadHTML($dohvaceniHTML); dovlacimo html stranu(preko loadHTML kazemo mu da je html strana u pitanju) gde je $dohvaceniHTML url?
pretpostavljam da ima i za xml, rss? :)

getElementsByTagName('p') hvata sve sto se nalazi u p tagu? Moje zapazanje je da upravo ovo menja regularni izraz?

ovaj red: $entries = $xpath->query("//div[@class='article-content']"); zasto // na pocetku i cemu sluzi? potom @? ali na kraju nema nista?
Jel ovo hvata sve sto se nalazi u divu class='article-content' ?? znaci ako se u njemu nalazi <p>paragraf<p><br /><h1>elitesecurity</h1> ...
i to smestim u neku promenljivu i kazem echo sta dobijam? array? :) ili sa print_r dobijam niz? :)


getElementsByTagName hvata class a da li ima i za id? :)

izvinite na ovolikim pitanjima, znam da sve trebam da probam pa da pitam,
ali lakse mi je kada znam sa cim radim i kako se i gde smesta i sta se dobija i tako...
znaci onsnova, lako cu posle a i ova tema ce verovatno pubo znaciti drugima ;) :)
 
Odgovor na temu

ivan.a
PHP developer

Član broj: 83976
Poruke: 403
*.dynamic.isp.telekom.rs.



+44 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke19.04.2011. u 05:57 - pre 157 meseci
U ovom slučaju nije bitno da li je "$text" ili $text.
Citat:
Ovo $dom->loadHTML($dohvaceniHTML); dovlacimo html stranu(preko loadHTML kazemo mu da je html strana u pitanju) gde je $dohvaceniHTML url?
To je jednostavno link i zapravo treba biti @$dom->loadHTMLFile($dohvaceniHTML) kao što je Br@nkoR napisao (ovo @ ispred služi da se ignorišu greške ili HTML koji nije validan, što verovatno znaš).
Ako koristiš loadHTML potrebno je da "učitaš" sadržaj putem file_get_contents ($dohvaceniHTML = file_get_contents($URL) ) ili cURL metodom ...
Na isti način parsiraš i xml i rss.

Citat:
getElementsByTagName('p') hvata sve sto se nalazi u p tagu? Moje zapazanje je da upravo ovo menja regularni izraz?

ovaj red: $entries = $xpath->query("//div[@class='article-content']"); zasto // na pocetku i cemu sluzi? potom @? ali na kraju nema nista?
Jel ovo hvata sve sto se nalazi u divu class='article-content' ?? znaci ako se u njemu nalazi <p>paragraf<p><br /><h1>elitesecurity</h1> ...
i to smestim u neku promenljivu i kazem echo sta dobijam? array? :) ili sa print_r dobijam niz? :)

$xpath->query - je upit ili putanja. Ovaj upit: //div[@class='article-content'] bukvalno znači da se traži putanja odnosno elementi između <div> i </div> tagova koji imaju class 'article-content'.
Jedan banalan primer kako bi ovo izgledalo kada bi govorili o MySql: SELECT div WHERE class = 'article-content'...ako se ne varam. xD

Mislim da je najbolje da pogledaš ovaj link gde je opisana funkcija DOMXPath:
http://php.net/manual/en/class.domxpath.php
Citat:
getElementsByTagName hvata class a da li ima i za id? :)

Možeš koristiti bilo koji atribut ili tag:
Code:
$entries = $xpath->query("//div[@id='neki_ID']");


[Ovu poruku je menjao ivan.a dana 19.04.2011. u 07:22 GMT+1]
I hope I didn't brain my damage - Homer
if (wife.position == kitchen) {return sandwich};
 
Odgovor na temu

Br@nkoR
http://localhost

Član broj: 2597
Poruke: 1603

Sajt: localhost


+23 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke19.04.2011. u 09:12 - pre 157 meseci
Samo da dodam pošto je verovatno @ivan.a zaboravio oznaka @ unutar query je oznaka za atrubut.
Npr. ovo //div[@class='article-content']//p bi značilo: Selektuj sve p elemente koji su "deca" div elementa, pri čemu taj div elemenat sadrži atribut class i čija je vrednost article-content, bez obzira gde se oni nalazili u dokumentu.

Možda ja ne objašnjavam tako lepo, ali više o Xpath-u na: http://www.w3schools.com/xpath/default.asp

Pozdrav.
Banned - Not available
 
Odgovor na temu

peca89bg
Beograd

Član broj: 202034
Poruke: 354
95.180.69.*



+6 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke21.04.2011. u 01:44 - pre 157 meseci
Pozdrav,

evo linka gde se nalazi tabela sa gradovima srbije: http://www.fileserve.com/file/yzpNAkv

Ima mozda negde neka greska, malo veliko slovo ali nije strasno :)
vrlo korisna stvar ako vam treba npr za select korisnika iz kog je grada i tome slicno :)


Hvala puno! ;)
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-4.sezampro.rs.



+33 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke21.04.2011. u 20:24 - pre 157 meseci
Naleteh danas na ovaj članak vezan baš za parsiranje neke stranice pomoću XPath-a, pa možda nekome bude od koristi.
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke28.07.2011. u 22:33 - pre 154 meseci
Pozdrav ekipi, sjajna tema. Ono sto mene buni ilustrovacu na sledecem primeru:

Code:
header('Content-Type: text/html; charset=utf-8');
$dom = new DOMDocument();
@$dom->loadHTMLFile('http://www.mondo.rs/Sport');
$xpath = new DOMXPath($dom);
$entries = $xpath->query("//ul[@id='featured-nav']");
foreach($entries as $e)
  echo $e->textContent . '<br />';


Pogledajte ovu liniju:
Code:
$entries = $xpath->query("//ul[@id='featured-nav']");


Iskren da budem slucajno sam potrefio sintaksu pregledajuci html kod od ovog linka mondo.rs/sport.
Dakle ja sam uspeo da preuzmem vesti iz diva sa id='featured-nav' medjutim ja zelim da preuzmem linkove i da ih ispisujem jedan ispod drugog ali nema sanse da to odradim :) Kad bi neko malo pojasnio ovu liniju uz neke primere, recimo kako se preuzima sadrzaj ako imamo tabelu sa tr i td poljima, zatim ako imamo kao u ovom slucaju listu sa ul i li elementima itd itd. Ne znam jesam bio jasan, valjda jesam.
 
Odgovor na temu

ManInTheBox
Beograd

Član broj: 272293
Poruke: 26
*.dynamic.sbb.rs.



Profil

icon Re: curl - uzimaj svaki dan sa strane podatke30.07.2011. u 15:18 - pre 154 meseci
Code (php):
$entries = $xpath->query("//ul[@id='featured-nav']");


Ovo ti je XPath upit (veoma ocigledno ) koji ti vraca objekat tipa DOMNodeList
DOMNodeList kao sto vidis ima jedno polje (length) i jednu metodu (item ( int $index )).
Kad pozoves neki item dobijas objekat tipa DOMNode
DOMNode je ono sto tebe interesuje i na manualu imas sve informacije kako da pristupis specificnom item-u i manipulises njime.
Generalno DOM ovde ti se nalaze sve informacije tebi bitne.

btw upit za sve linkove u okviru ovog diva

Code (php):
$entries = $xpath->query(".//ul[@id='featured-nav']//a/@href");


// posle id diva znace da se u okviru tog diva negde nalaze linkovi (a) a da taj div ne mora da bude prvi parent tih linkova:
primer:
Code (html):

<div id="featured-nav">
   <div id="novi-div">
       <div id="najnoviji-div">
          <a href="#">evo me ovde</a>
       </div>
   </div>
   <a href="#">i ovde</a>
</div>
 


sa // ti ces pokupiti sve linkove iz ovog 'featured-nav'

Jos jedan tutorial generalno za XPath http://www.w3schools.com/xpath/

poZz
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: curl - uzimaj svaki dan sa strane podatke31.07.2011. u 23:14 - pre 154 meseci
sad mi je malo jasnije ;) hvala. Prostudiracu malo i ovaj manual pa se javljam sa biserima heheheh :)
 
Odgovor na temu

[es] :: PHP :: curl - uzimaj svaki dan sa strane podatke

[ Pregleda: 3491 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.