DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   (X)HTML, JavaScript, DHTML, XML, CSS (http://www.devprotalk.com/forumdisplay.php?f=8)
-   -   fetch podataka sa drugih sajtova (http://www.devprotalk.com/showthread.php?t=10060)

AdriaMart 19. 05. 2011. 03:10

fetch podataka sa drugih sajtova
 
Ima li nacina da preuzmem pojedne podatke sa drugih sajtova i da ih postavim u xml fajl. npr. odredjeni div id ili naslov ili sliku pa da sve zajedno napravim xml fajl... kao sto funcionise agregatori vesti ali bez rss-a jer sajtovi sa kojih treba da preuzmem sadrzaj nemaju rss feed. HELP Hvala unapred!

jablan 19. 05. 2011. 08:26

http://en.wikipedia.org/wiki/Web_scraping

Npr. mi koristimo Mechanize (http://mechanize.rubyforge.org/mecha...UIDE_rdoc.html)

dinke 19. 05. 2011. 11:13

A mi koristimo custom scrapping: curl za fetchovanje i regular expression za parsiranje podataka :)

webarto 19. 05. 2011. 11:59

^ http://stackoverflow.com/questions/1...732454#1732454

Ako je validan HTML onda nije problem... Uglavnom cURL u svakom slučaju i RegEx i http://htmlpurifier.org/, da ekstraktuješ HTML... Pretpostavljam da je PHP u pitanju. Ako ti treba konkretan primjer, postavi konkretan link :)

Edit: Promašio si podforum.

Nemanja Avramović 19. 05. 2011. 13:24

Pogledaj i ovo: http://simplehtmldom.sourceforge.net/ [php]

webarto 19. 05. 2011. 14:35

^ kad smo kod toga... http://webarto.com/82/php-simple-html-dom-curl
Što je dinke spomenuo možeš ovako: http://www.dizajnzona.com/forums/ind...howtopic=82361

AdriaMart 19. 05. 2011. 16:02

Ono sto meni treba je da izvucem naslove i po jednu sliku (danasnje ponude) sa sajtova kupime.rs kolektiva.rs i sl.

Hvala svima na korisnim informnacijama.

webarto 19. 05. 2011. 17:27

Daj šta teže :1056:

PHP kôd:

$html curl('http://rs.kolektiva.net');

preg_match('#<div id="title">(.*?)</div>#is'$html$matches);
$data["naslov"] = strip_tags($matches[1]);

preg_match('#<div class="split_b intro">(.*?)</div>#is'$html$matches);
$data["opis"] = strip_tags($matches[1]);

preg_match('#/datastore/imagestore/naslovna_ponuda/(.*?)\.jpg#is'$html$matches);
$data["slika"] = strip_tags($matches[0]);

print_r($data); 

Citat:

Array (
[naslov] => Ponuda dana 60% popusta na vaučer za bilo koju stomatološku uslugu u ordinaciji "Dragon" - platite 990 din za vrednost vaučera od 2.500 din!

[opis] => Zubi su izuzetno koristan deo našeg organizma: ne samo da možemo na njih da stavljamo cirkone i da ih turpijamo tako da izgledaju kul kao vampirski, nego možemo i njima da se ujedemo za jezik kada treba da prećutimo nešto! Ali, nažalost, zubi su podložni kojekakvim karijesima i okruženi paradontozama i drugim grozama koje izazivaju patnju i bolove najširih slojeva stanovništva... Srećom, za sve to postoji lek - a lek je vaučer za 60% popusta na bilo koju stomatološku uslugu u ordinaciji "Dragon" koji vam danas donosi vaša Kolektiva!

[slika] => /datastore/imagestore/naslovna_ponuda/naslovna_ponuda_1305723314shutterstock_31170838.jp g
)

AdriaMart 19. 05. 2011. 18:02

Ocigledno server na kome hostujem nema instaliran curl:
Fatal error: Call to undefined function curl() in /home/untitled-1.php on line 2

ali ok ... snacicu se ... znas li mozda kako da izvucem lan i lgt kordinate koje se nalaze na toj strani na google mapi i da to sve stavim u jedan xml fajl...

Hvala na pomoci.

webarto 19. 05. 2011. 18:10

Imaš vjerovantno ovo je samo helper funkcija, dodaj pa pokuašaj opet...

PHP kôd:

function curl($url){
        
$ch curl_init();
        
curl_setopt($chCURLOPT_URL$url);
        
curl_setopt($chCURLOPT_ENCODING"gzip");
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$data curl_exec($ch);
        
curl_close($ch);
        return 
$data;
}

$html curl('http://rs.kolektiva.net');

preg_match('#<div id="title">(.*?)</div>#is'$html$matches);
$data["naslov"] = strip_tags($matches[1]);

preg_match('#<div class="split_b intro">(.*?)</div>#is'$html$matches);
$data["opis"] = strip_tags($matches[1]);

preg_match('#/datastore/imagestore/naslovna_ponuda/(.*?)\.jpg#is'$html$matches);
$data["slika"] = strip_tags($matches[0]);

preg_match('#lat=(.*?);#is'$html$matches);
$data["lat"] = strip_tags($matches[1]);

preg_match('#lng=(.*?);#is'$html$matches);
$data["lng"] = strip_tags($matches[1]);

print_r($data); 


AdriaMart 19. 05. 2011. 21:09

Hvala druze, dugujem pivo :) !

svlada 20. 05. 2011. 08:20

Ako koristiš python probaj http://scrapy.org/ isto tako postoji i Mech za python http://wwwsearch.sourceforge.net/mechanize/

Isto tako ako koristiš javu baci pogled ovde http://htmlunit.sourceforge.net/gettingStarted.html

AdriaMart 21. 05. 2011. 22:04

Uradio sam sve i poprilicno je dobro medjutim primetio sam da neki sajtovi kao sto je npr. kupime.com imaju i vise od 10 aktivnih ponuda. www.kupime.com/aktivne-ponude/ E sad zelim da pratim sve linkove(sve ponude) sa adrese www.kupime.com/aktivne-ponude/ ne samo glavnu stranu pa me interesuje da li je moguce to izvesti. tj. nesto kao indeksiranje... da se najpre preuzmu linkovi sa navedene URL adrese pa da se zatim svaka strana posebno obradi... HELP!

mileusna 22. 05. 2011. 02:51

^ Pa sve si sam lepo objasnio šta treba. :)

AdriaMart 22. 05. 2011. 04:26

Znam ja sta treba al ne bas i sintaksu za pisanje ... potrazicu na netu sigurno ima nesto o tome.

Br@nkoR 22. 05. 2011. 10:53

Npr. na brzinu preuzimenje linkova:
Kôd:

$dom = new DOMDocument();
@$dom->loadHTMLFile('http://www.kupime.com/aktivne-ponude/');
$xpath = new DOMXPath($dom);
$entries = $xpath->query("//ul[@id='list_offers']//table//a/@href");
foreach($entries as $e) {
  echo 'http://www.kupime.com' . $e->textContent . '<br />';
}

Preuzimanje određenog sadržaja sa neke od stranica:
Kôd:

$dom = new DOMDocument();
@$dom->loadHTMLFile('http://www.kupime.com/ponuda/4299-din-umesto-10000-din-za-brazilsko-fenirane-kose-u-salonu-beauty-studio-hot/366');
$xpath = new DOMXPath($dom);
echo $xpath->query("//h1[@id='offer_title']")->item(0)->textContent;
echo '<hr />';
echo $xpath->query("//div[@id='description']")->item(0)->textContent;
echo '<hr />';
echo $xpath->query("//div[@id='img_border']/img/@src")->item(0)->textContent;

Zgodan alat za ovako nešto:
https://addons.mozilla.org/en-us/fir...ddon/firepath/

Pozdrav.

AdriaMart 22. 05. 2011. 15:26

Ok, super. Da li bi moglo da se nekom petljom foreach ili sl. za loadhtmlfile tj. da kada se linkovi preuzmu da se automatski obradjuju strane jedna po jedna. Da li da se napise if petljom. Neznam bas xml dom sintaksu pa me zanima kako da dodam promenjlive za ove vrednosti ''description'' ''img'' i ostale... moze li ovako
$data["slika"] => $xpath->query("//div[@id='description']")->item(0)->textContent;
kako bi zatim $data vrednost unela u mysql bazu... Hvala svima na pomoci.

Takodje sta da postavim kako bi resio problem sa slovim sa kvacicama... npr. evo sta izadje: "promeniće Vaš look i spasiti Vas dugotrajnih feniranja. Kažu da žene uvek hoće ono što nemaju"

Br@nkoR 22. 05. 2011. 15:54

npr.
PHP kôd:

$dom = new DOMDocument();
@
$dom->loadHTMLFile('http://www.kupime.com/aktivne-ponude/');
$xpath = new DOMXPath($dom);
$entries $xpath->query("//ul[@id='list_offers']//table//a/@href");
$output = array();
foreach(
$entries as $e) {  
  
$dom2 = new DOMDocument();
  @
$dom2->loadHTMLFile('http://www.kupime.com' $e->textContent);
  
$xpath2 = new DOMXPath($dom2);
  
$data = array();
  
$data['naslov'] = trim($xpath2->query("//h1[@id='offer_title']")->item(0)->textContent);
  
$data['opis'] = trim($xpath2->query("//div[@id='description']")->item(0)->textContent);
  
$data['slika'] = trim($xpath2->query("//div[@id='img_border']/img/@src")->item(0)->textContent);
  
$output[] = $data;
}

echo 
'<pre>' print_r($outputtrue) . '</pre>'

E sada da li je pametno ovako raditi jer se vrši dovlaćenje 10 stranica, nisam siguran, odgovoriće neko sa većim iskustvom. Mada pošto si napisao da upisuješ u bazu, verovatno ne vršiš prečesto "dovlačenje" sadržaja.

A za problem sa enkodingom proveri da li je enkoding php stranice uft8.

AdriaMart 22. 05. 2011. 16:08

Svaka cast... extra. Probao sam na razne nacine da izvucen lng= , i lang= , iz coda ali bez uspeha... da li je to uopste moguce s obzirom da su lng i lang koordinate u javascript-u na strani.

Sto se tice dovlacenja nije problem jer dovlacenje vrsim preko cron-a na nekoliko sati i upisujem u bazu.

Pozdrav!

Br@nkoR 22. 05. 2011. 16:22

PHP kôd:

$dom = new DOMDocument();
@
$dom->loadHTMLFile('http://www.kupime.com/ponuda/4299-din-umesto-10000-din-za-brazilsko-fenirane-kose-u-salonu-beauty-studio-hot/366');
$xpath = new DOMXPath($dom);

$location $xpath->query("//div[@id='location']//script")->item(1)->textContent;
preg_match('/var\s+lat\s+=\s+(\d{2}\.\d{6});/'$location$lat);
preg_match('/var\s+lang\s+=\s+(\d{2}\.\d{6});/'$location$lang);

echo 
$lat[1];
echo 
'<br />';
echo 
$lang[1]; 

Pa ti ukombinuj u skriptu.

Br@nkoR 22. 05. 2011. 16:53

Sada sam isprobao ovaj gore kod da ukombinujem sa ostatkom i video da ima malih problema, evo malo izmenjen kod:
PHP kôd:

$dom = new DOMDocument();
@
$dom->loadHTMLFile('http://www.kupime.com/aktivne-ponude/');
$xpath = new DOMXPath($dom);
$entries $xpath->query("//ul[@id='list_offers']//table//a/@href");
$output = array();
foreach(
$entries as $e) {  
  
$dom2 = new DOMDocument();
  @
$dom2->loadHTMLFile('http://www.kupime.com' $e->textContent);
  
$xpath2 = new DOMXPath($dom2);
  
$data = array();
  
$data['naslov'] = trim($xpath2->query("//h1[@id='offer_title']")->item(0)->textContent);
  
$data['opis'] = trim($xpath2->query("//div[@id='description']")->item(0)->textContent);
  
$data['slika'] = trim($xpath2->query("//div[@id='img_border']/img/@src")->item(0)->textContent);
  
$location $xpath2->query("//div[@id='location']//script")->item(1)->textContent;
  
preg_match('/var\s+lat\s+=\s+(\d+\.\d+)\s*;/'$location$lat);
  
preg_match('/var\s+lang\s+=\s+(\d+\.\d+)\s*;/'$location$lang);
  
$data['lat'] = $lat[1];
  
$data['lang'] = $lang[1];
  
  
$output[] = $data;
}

echo 
'<pre>' print_r($outputtrue) . '</pre>'


AdriaMart 22. 05. 2011. 18:19

Kod je dobar i cini mi se da je ovo bolje resenje nego upotreba cURL-a ... Hvala na pomoci!

AdriaMart 22. 05. 2011. 18:31

Kod je dobar i cini mi se da je ovo bolje resenje nego upotreba cURL-a ... Hvala na pomoci!

Br@nkoR 22. 05. 2011. 18:32

Nema na čemu. :)
Možeš i ovde koristiti cURL umesto $dom->loadHTMLFile() za "dovlačenje" sadržaja, pa posle umesto navedenog metoda koristiti:
$dom->loadHTML($sadrzaj_dobijen_pomocu_curl);

Samo obrati pažnju i na:
http://rs.kolektiva.net/o-kolektivi/uslovi-koriscenja

AdriaMart 22. 05. 2011. 18:46

Neznam sto bi se oni protivili kad ja samo hocu da napravim agregator ponuda samo bi dobili reklamu plus ali kontaktiracu ih...

Ej kako da izvucem iz div id-a samo jednu klasu npr. klasu "value" ili sl. treba mi samo sintaksa za pisanje

Br@nkoR 22. 05. 2011. 19:02

Citat:

Originalno napisao AdriaMart (Napišite 99096)
Ej kako da izvucem iz div id-a samo jednu klasu npr. klasu "value" ili sl. treba mi samo sintaksa za pisanje

Postavi primer nisam siguran da li razumem problem.
Kôd:

elemenat[@class='value']
Za detalje oko upotrebe XPath-a pogledaj
http://www.w3schools.com/xpath/default.asp
http://www.w3.org/TR/xpath/

AdriaMart 22. 05. 2011. 19:08

Hvala na informacijama, znas li neki softver za pomoc pri radu sa xml-om xpath-om

Br@nkoR 22. 05. 2011. 19:22

Iskreno, ne bih znao da ti preporučim neki jer ne koristim nijedan, jedino ovo
https://addons.mozilla.org/en-us/fir...ddon/firepath/
što sam bio napisao u jednoj od prethodnih poruka, čak i na ovo zaboravim da imam kada isprobavam neke stvari :).

Pozdrav.

AdriaMart 22. 05. 2011. 20:57

E jesam malo naporna ali nisam nasao na netu odgovor na pitanje ... kako u mysql bazu koju imam uneti sliku a ne njenu adresu kao sto je izvuceno xml-om. Postoji li neka posebna funcija u xpath. Znaci treba mi slika da se unese u mysql a ne njena adresa na sajtu. Pozdrav!

Br@nkoR 22. 05. 2011. 21:59

Da bi se slika unela u bazu ili neki folder (file sistem) potrebno je da na osnovu njene adrese, koje je dobijena iz HTML koda, "dovuče" pomoću npr. cURL, file_get_contents ... i zatim snimi u bazu/folder. XPath ne služi za to.

Pozdrav.

webarto 22. 05. 2011. 22:06

Mislim da si mislio na Regular Expressions, cURL je u svakom pogledu bolji od file_get_contents :)

AdriaMart 22. 05. 2011. 23:48

Koriscenjem funcije file_get_contents dobijam neki kod:

%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz� �������������������������������������������������� ����������������������� ?��(��(��(��(��(�t����f�YMș�� 觍�=O`8�k�u��Ӵ{��9�XS�~u ...

jel to moja greska ili se tako upisuje kod u bazu

AdriaMart 23. 05. 2011. 00:40

U najboljem slucaju izadje mi: Resource id #20

Imam ovo:
$data2['img'] = file_get_contents('http://www.kupime.com'."/". $data['slika']);
$im = imagecreatefromstring($data2['img']);
print ($im);

Gde gresim?

Miroslav Ćurčić 23. 05. 2011. 02:28

Na grešiš još.
Tako i treba da izgleda, to je binarni sadržaj slike.
To treba da snimiš u bazu.
Pogrešićeš ako budeš pokušao da je snimiš u 'varchar' ili 'text' polje, jer ti tipovi nisu binary-safe. Treba to polje tipa 'blob'.

AdriaMart 24. 05. 2011. 16:28

Da li postoji mogucnost da se za sve sajtove koji sadrze dnevne ponude napise neki univerzalni kod ... neko indeksiranje ili je to tesko izvodljivo...

AdriaMart 24. 05. 2011. 22:20

E sad da bih izvukao podatke iz baze imam sledeci kod:

<?php

header("Content-type: text/xml");

$host = "localhost";
$user = "root";
$pass = "";
$database = "test";

$linkID = mysql_connect($host, $user, $pass) or die("Could not connect to host.");
mysql_select_db($database, $linkID) or die("Could not find database.");

$query = "SELECT * FROM tabela ORDER BY ID DESC";
$resultID = mysql_query($query, $linkID) or die("Data not found.");

$xml_output = "<?xml version=\"1.0\"?>\n";
$xml_output .= "<entries>\n";

for($x = 0 ; $x < mysql_num_rows($resultID) ; $x++){
$row = mysql_fetch_assoc($resultID);
$xml_output .= "\t<entry>\n";
$xml_output .= "\t\t<ID>" . $row['ID'] . "</ID>\n";
// Escaping illegal characters
$row['text'] = str_replace("&", "&", $row['text']);
$row['text'] = str_replace("<", "<", $row['text']);
$row['text'] = str_replace(">", "&gt;", $row['text']);
$row['text'] = str_replace("\"", "&quot;", $row['text']);
$xml_output .= "\t\t<text>" . $row['text'] . "</text>\n";
$xml_output .= "\t</entry>\n";
}

$xml_output .= "</entries>";

echo $xml_output;

?>

Medjutim izadje mi greska: error on line 16 at column 39: Document is empty

Zna li neko sta je u pitanju?

srdjan 24. 05. 2011. 22:41

Ovaj ?> ti zatvori <?php sa početka, a ne ono što si ti hteo.

Možda ima lepše, ja ovako radim:

$xml_output = '<' . '?' . 'xml version="1.0" ' . '?' . '>';

AdriaMart 24. 05. 2011. 23:45

E to je reseno, medjutim sad prikazuje gresku na 36 redu kolona 3... to je poslednja linija kod... a nevidim iznad gde je pre toga zatvoren php


Probao sam inekoliko drugih nacina medjutim svuda izadje da je greska na poslendjoj liniji i to:
error on line 50 at column 3: Extra content at the end of the document

ivanhoe 25. 05. 2011. 02:03

kako izgleda xml koji se otprinta? Neki tag ti nije dobro zatvoren

AdriaMart 25. 05. 2011. 02:23

Kao xml kod koji sam gore naveo s tim sto sam uneo predlog srdjana da promenim jednu liniju koda...


Vreme je GMT +2. Trenutno vreme je 20:27.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.