Ongelma:
Hakea RSS syötteet sekä h1 tagit halutuilta nettisivuilta, tallettaa taulukkoon tämä tieto ja sitten tulostaa sivulle ajan mukaan, kuten ampparit.com:issa.
Kuvaus:
Olen saanut neuvoja tämän haun toteuttamiseen joko Javascriptillä tai pelkästään PHP:llä. Mikä on mielestänne paras tapa toteuttaa tämä haku?
Omasta mielestäni paras tapa olisi PHP:llä, mutta en ole varma kuinka haku PHP:llä toimisi. Miten PHP:llä pystyy hakemaan tiettyjä termejä halutuilta sivustoilta?
Esimerkiksi mikä on PHP:llä tarvittava koodi, joka hakee sivustoilta: mbnet.fi ja MTV3.fi, urliset H1 tagit?
Kiitos vastauksistanne!
Tarkoitatko tuollaista kuin tuossa oikeassa reunassa.
http://62.44.216.148/linkit/testiu.php
Kyllä.
Samanlaista olen yrittänyt toteuttaa.
<?PHP class RSSReader implements Iterator { private $xmlObject; //simpleXML objekti private $resultSet; //tulostaulukko private $limit; //määrä private $iterator = 0; private $timestamps; private $meta; //tietoja uutisvirrasta const sortASC = SORT_ASC; const sortDESC = SORT_DESC; /* ottaa argumentikseen RSS virran osoitteen ja tarvittaessa halutun elementtien määrän */ public function __construct($url, $limit = 14) { $this->limit = $limit; $this->timestamps = array(); $this->resultSet = array(); $this->meta = array(); $this->xmlObject = @simplexml_load_file($url); if($this->xmlObject == false) { throw new Exception("Unable to get/parse data from $url"); //XML dataa ei kyetty jäsentämään } $this->parseData(); } private static function parseTime($timeStr) { $month = array('Jan'=>1,'Feb'=>2,'Mar'=>3,'Apr'=>4,'May'=>5,'Jun'=>6, 'Jul'=>7,'Aug'=>8,'Sep'=>9,'Oct'=>10,'Nov'=>11,'Dec'=>12); $temp = sscanf($timeStr,"%s %d %s %d %d:%d:%d"); $temp[2] = $month[$temp[2]]; return mktime($temp[4],$temp[5],$temp[6],$temp[2],$temp[1],$temp[3]); } private function parseData() { $current = 0; /* haetaan virran otsikko, kuvaus ja URL */ $this->meta[0] = utf8_decode($this->xmlObject->channel->title); // otsikko, esim HS uutiset $this->meta[1] = (string)$this->xmlObject->channel->link; $this->meta[2] = utf8_decode($this->xmlObject->channel->description); /* käydään virtaa läpi kunnes raja tulee vastaa tai kaikki elementit on käyty läpi */ foreach($this->xmlObject->channel->item as $feedItem) { $this->timestamps[] = $timestamp = self::parseTime($feedItem->pubDate); $url = (string)$feedItem->link; $title = utf8_decode((string)$feedItem->title); $this->resultSet[] = array($timestamp,$url,$title); if(++$current > $this->limit) break; } /* vapautetaan resursseja */ unset($this->xmlObject); } /* järjestää elementit kellonajan ja päivämäärän mukaan, joko nousevasti * (RSSReader::sortASC) tai laskevasti (RSSReader::sortDESC) */ public function sort($order = self::sortDESC) { array_multisort($this->timestamps,$order,$this->resultSet); } public function getLink() { return $this->meta[1]; } /* palauttaa RSS virran otsikon */ public function getTitle() { return $this->meta[0]; } /* palauttaa RSS virran kuvauksen */ public function getDescription() { return $this->meta[2]; } /* implementoidaan Iterator iteraattorissa määritelty metodin current() */ /* Palauttaa taulukon, joka sisältää data, johon iteraattori tällä hetkellä osoittaa */ public function current() { $res = array('timestamp' => $this->resultSet[$this->iterator][0], 'url' => $this->resultSet[$this->iterator][1], 'title' => $this->resultSet[$this->iterator][2]); return array_merge($res,$this->resultSet[$this->iterator]); } /* implementoidaan Iterator iteraattorissa määritelty metodin next() */ /* siirrytään seuraavaan elementtiin */ public function next() { $this->iterator++; } /* implementoidaan Iterator iteraattorissa määritelty metodin key() */ public function key() { return $this->iterator; } /* implementoidaan Iterator iteraattorissa määritelty metodin rewind() */ /* siirrytään ensimmäiseen elementtiin */ public function rewind() { $this->iterator = 0; } /* implementoidaan Iterator iteraattorissa määritelty metodin valid() */ /* tutkitaan onko uusia elementtejä vielä jäljellä */ public function valid() { return ((count($this->resultSet) > $this->iterator) ? true : false); } } ?> <?php $rss1a = new RSSReader("http://www.hs.fi/uutiset/rss/"); $rss1a->sort(RSSReader::sortDESC); foreach($rss1a as $item) { printf('%s | <a href="%s">%s</a> helsingin sanomat <br>'.("\n"),date($item['timestamp']).' | '.date(" H:i",$item['timestamp']),$item['url'],$item['title']); } $rss1b = new RSSReader("http://www.digitoday.fi/feeds/Digitoday.xml"); $rss1b->sort(RSSReader::sortDESC); foreach($rss1b as $item) { printf('%s | <a href="%s">%s</a> digitoday <br>'.("\n"),date($item['timestamp']).' | '.date(" H:i",$item['timestamp']),$item['url'],$item['title']); } $rss7 = new RSSReader("http://www.yle.fi/uutiset/rss/paauutiset.xml"); $rss7->sort(RSSReader::sortDESC); foreach($rss7 as $item) { printf('%s | <a href="%s">%s</a> yle <br>'.("\n"),date($item['timestamp']).' | '.date(" H:i",$item['timestamp']),$item['url'],$item['title']); } $rss2c = new RSSReader("http://www.iltalehti.fi/rss.xml"); $rss2c->sort(RSSReader::sortDESC); foreach($rss2c as $item) { printf('%s | <a href="%s">%s</a> iltalehti <br>'.("\n"),date($item['timestamp']).' | '.date(" H:i",$item['timestamp']),$item['url'],$item['title']); } $rss3a = new RSSReader("http://www.talentum.com/rss.xml"); $rss3a->sort(RSSReader::sortDESC); foreach($rss3a as $item) { printf('%s | <a href="%s">%s</a> talentum <br>'.("\n"),date($item['timestamp']).' | '.date(" H:i",$item['timestamp']),$item['url'],$item['title']); } ?>
Kiitos!
Miten onnistuisi haku MTV3.fi sivustolta, kun sivustolla ei ole RSS syötteitä?
Esimerkiksi olisiko mahdollista hakea h1 tagit ja niiden linkit ja tulostaa ne sivustolle, samaan tapaan kuin viittaamassasi sivustolla?
syöte on tuossa http://www.mtv3.fi/rss/uutiset.rss mutta eivät käytä aikaa,
joten muiden kanssa käyttö on hankalaa.
Mainiota!
Ihmettelen, kuinka ampparit.com on pystynyt järjestämään mtv3:n syötteet ajan mukaan. Miten sait selville, ettei mtv3 käytä aikaa, kokeilemalla tuota syötettä PHP:llä?
On maikkarillakin aika, mutta muodossa
Tue, 17 Jun 2008 16:49:28 +0300
ja pitäisi olla
17 Jun 2008 16:49:28 +0300
muodossa. Tuon voi korjata vaikka expressioneilla, jos haluat.
Eli tuo "Tue," voisi poistaa regexillä.
Toimisikohan tuo, jos tekisi if-else silmukan: jos mon-sun, poistaa; else jättää?
PHP:n funktio strtotime osaa melko hyvin muuntaa merkkijono-muotoisia aikoja helpommaksi käsiteltävään muotoon. Luokan parseTime muotoon:
Jep, juuri näin se onnistuu.
Kiitos vinkistä!
Kysymkseni koskee aivan ylhäällä olevaa koodia. Osa testaamistani sivuista ei näy, kun taas osa toimii. Seuraavaan olen kerännyt toimivia sivuja ja ei-toimivia sivuja. Ei näyttäisi olevan pääte vikana, mutta mikä sitten? Voivatko sivujen ylläpitäjät vaikuttaa toimivuuteen jotenkin?
####### FAILURE seuraavilla: ###########
http://newsrss.bbc.co.uk/rss/
http://downloads.bbc.co.uk/podcasts/
http://downloads.bbc.co.uk/podcasts/radio4/iot/
http://articles.moneycentral.msn.com/Feeds/RSS/
http://finance.yahoo.com/rss/topstories
Fatal error: Uncaught exception 'Exception' with message 'Unable to get/parse data from http://newsrss.bbc.co.uk/rss/
http://feeds.feedburner.com/typepad/
Warning: Invalid argument supplied for foreach() in C:\wamp\www\HONLINE\copy of h.php on line 46
########### SUCCESS seuraavilla: ############
http://rss.cnn.com/rss/money_topstories.rss
http://feeds.feedburner.com/CoolTools
http://cosmicvariance.com/feed/
http://www.engadget.com/rss.xml
http://lifehacker.com/index.xml
lainaus:
Ei näyttäisi olevan pääte vikana, mutta mikä sitten? Voivatko sivujen ylläpitäjät vaikuttaa toimivuuteen jotenkin?
En ole täysin varma, mistä tuo onglema johtuu.
Mutta ehkä se liittyy tuohon samaan ongelmaan, joka oli maikkarillakin, eli väärän muotoiseen aikaan. Peg ja Jarkkis kirjoittivat, kuinka ratkaista tuo väärän muotoinen aika.
Ehkä joku toinen tietää paremmin, miksi osa RSS syötteistä näkyy oikein ja toiset taas eivät?
Aihe on jo aika vanha, joten et voi enää vastata siihen.