Pegando notícias de outros sites
Sunday, December 30th, 2007Galera vou postar aqui um pequeno código que eu fiz para pegar
notícias a partir do RSS de outros sites e gravar em sua base de dados.
Sempre lembrando que é importante dizer qual foi a fonte da informação, pois assim você não violará nenhum direito autoral.
Bom, vamos ao que interessa, o código.
Listagem 1: Classe responsável por pegar o RSS e transformar em um array com os dados
-
<?php
-
/*
-
======================================================================
-
lastRSS 0.9.1
-
Simple yet powerfull PHP class to parse RSS files.
-
by Vojtech Semecky, webmaster @ webdot . cz
-
Latest version, features, manual and examples:
-
http://lastrss.webdot.cz/
-
———————————————————————-
-
LICENSE
-
This program is free software; you can redistribute it and/or
-
modify it under the terms of the GNU General Public License (GPL)
-
as published by the Free Software Foundation; either version 2
-
of the License, or (at your option) any later version.
-
This program is distributed in the hope that it will be useful,
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-
GNU General Public License for more details.
-
To read the license please visit http://www.gnu.org/copyleft/gpl.html
-
======================================================================
-
*/
-
-
/**
-
* lastRSS
-
* Simple yet powerfull PHP class to parse RSS files.
-
*/
-
class xmlWeb {
-
// ——————————————————————-
-
// Public properties
-
// ——————————————————————-
-
var $default_cp = ‘UTF-8′;
-
var $CDATA = ‘nochange’;
-
var $cp = ”;
-
var $items_limit = 0;
-
var $stripHTML = False;
-
var $date_format = ”;
-
-
// ——————————————————————-
-
// Private variables
-
// ——————————————————————-
-
var $channeltags = array (‘title’, ‘link’, ‘description’, ‘language’, ‘copyright’, ‘managingEditor’, ‘webMaster’, ‘lastBuildDate’, ‘rating’, ‘docs’);
-
var $itemtags = array(‘title’, ‘link’, ‘description’, ‘author’, ‘category’, ‘comments’, ‘enclosure’, ‘guid’, ‘pubDate’, ’source’);
-
-
// ——————————————————————-
-
// Parse RSS file and returns associative array.
-
// ——————————————————————-
-
function Get ($rss_url) {
-
// If CACHE ENABLED
-
if ($this->cache_dir != ”) {
-
if ($timedif <$this->cache_time) {
-
// cached file is fresh enough, return cached array
-
// set ‘cached’ to 1 only if cached file is correct
-
if ($result) $result[‘cached’] = 1;
-
} else {
-
// cached file is too old, create new
-
$result = $this->Parse($rss_url);
-
}
-
if ($result) $result[‘cached’] = 0;
-
}
-
}
-
// If CACHE DISABLED>> load and parse the file directly
-
else {
-
$result = $this->Parse($rss_url);
-
if ($result) $result[‘cached’] = 0;
-
}
-
// return result
-
return $result;
-
}
-
-
// ——————————————————————-
-
// Modification of preg_match(); return trimed field with index 1
-
// from ‘classic’ preg_match() array output
-
// ——————————————————————-
-
function my_preg_match ($pattern, $subject) {
-
// start regullar expression
-
-
// if there is some result… process it and return it
-
// Process CDATA (if present)
-
if ($this->CDATA == ‘content’) { // Get CDATA content (without CDATA tag)
-
} elseif ($this->CDATA == ’strip’) { // Strip CDATA
-
}
-
-
// If code page is set convert character encoding to required
-
if ($this->cp != ”)
-
//$out[1] = $this->MyConvertEncoding($this->rsscp, $this->cp, $out[1]);
-
// Return result
-
} else {
-
// if there is NO result, return empty string
-
return ”;
-
}
-
}
-
-
// ——————————————————————-
-
// Replace HTML entities &something; by real characters
-
// ——————————————————————-
-
function unhtmlentities ($string) {
-
// Get HTML entities table
-
// Flip keys<==>values
-
// Add support for ‘ entity (missing in HTML_ENTITIES)
-
// Replace entities by values
-
return strtr ($string, $trans_tbl);
-
}
-
// ——————————————————————-
-
// Parse() is private method used by Get() to load and parse RSS file.
-
// Don’t use Parse() in your scripts - use Get($rss_file) instead.
-
// ——————————————————————-
-
function Parse ($rss_url) {
-
// Open and load RSS file
-
if ($f = @fopen($rss_url, ‘r’)) {
-
$rss_content = ”;
-
while (!feof($f)) {
-
$rss_content .= fgets($f, 4096);
-
}
-
fclose($f);
-
// Parse document encoding
-
$result['encoding'] = $this->my_preg_match(”‘encoding=[\'\"](.*?)[\'\"]‘si“, $rss_content);
-
// if document codepage is specified, use it
-
if ($result['encoding'] != ”)
-
{ $this->rsscp = $result['encoding']; } // This is used in my_preg_match()
-
// otherwise use the default codepage
-
else
-
{ $this->rsscp = $this->default_cp; } // This is used in my_preg_match()
-
// Parse CHANNEL info
-
preg_match(”‘<channel.*?>(.*?)</channel>’si“, $rss_content, $out_channel);
-
foreach($this->channeltags as $channeltag)
-
{
-
$temp = $this->my_preg_match(”‘<$channeltag.*?>(.*?)</$channeltag>’si“, $out_channel[1]);
-
if ($temp != ”) $result[$channeltag] = $temp; // Set only if not empty
-
}
-
// If date_format is specified and lastBuildDate is valid
-
if ($this->date_format != ” && ($timestamp = strtotime($result['lastBuildDate'])) !==-1) {
-
// convert lastBuildDate to specified date format
-
$result['lastBuildDate'] = date($this->date_format, $timestamp);
-
}
-
// Parse TEXTINPUT info
-
preg_match(”‘<textinput(|[^>]*[^/])>(.*?)</textinput>’si“, $rss_content, $out_textinfo);
-
// This a little strange regexp means:
-
// Look for tag <textinput> with or without any attributes, but skip truncated version <textinput /> (it’s not beggining tag)
-
if (isset($out_textinfo[2])) {
-
foreach($this->textinputtags as $textinputtag) {
-
$temp = $this->my_preg_match(”‘<$textinputtag.*?>(.*?)</$textinputtag>’si“, $out_textinfo[2]);
-
if ($temp != ”) $result['textinput_'.$textinputtag] = $temp; // Set only if not empty
-
}
-
}
-
// Parse IMAGE info
-
preg_match(”‘<image.*?>(.*?)</image>’si“, $rss_content, $out_imageinfo);
-
if (isset($out_imageinfo[1])) {
-
foreach($this->imagetags as $imagetag) {
-
$temp = $this->my_preg_match(”‘<$imagetag.*?>(.*?)</$imagetag>’si“, $out_imageinfo[1]);
-
if ($temp != ”) $result['image_'.$imagetag] = $temp; // Set only if not empty
-
}
-
}
-
// Parse ITEMS
-
preg_match_all(”‘<item(| .*?)>(.*?)</item>’si“, $rss_content, $items);
-
$rss_items = $items[2];
-
$i = 0;
-
$result['items'] = array(); // create array even if there are no items
-
foreach($rss_items as $rss_item) {
-
// If number of items is lower then limit: Parse one item
-
if ($i <$this->items_limit || $this->items_limit == 0) {
-
foreach($this->itemtags as $itemtag) {
-
$temp = $this->my_preg_match(”‘<$itemtag.*?>(.*?)</$itemtag>’si“, $rss_item);
-
if ($temp != ”) $result['items'][$i][$itemtag] = $temp; // Set only if not empty
-
}
-
// Strip HTML tags and other bullshit from DESCRIPTION
-
if ($this->stripHTML && $result['items'][$i]['description'])
-
$result['items'][$i]['description'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['description'])));
-
// Strip HTML tags and other bullshit from TITLE
-
if ($this->stripHTML && $result['items'][$i]['title'])
-
$result['items'][$i]['title'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['title'])));
-
// If date_format is specified and pubDate is valid
-
if ($this->date_format != ” && ($timestamp = strtotime($result['items'][$i]['pubDate'])) !==-1) {
-
// convert pubDate to specified date format
-
$result['items'][$i]['pubDate'] = date($this->date_format, $timestamp);
-
}
-
// Item counter
-
$i++;
-
}
-
}
-
$result['items_count'] = $i;
-
return $result;
-
}
-
else // Error in opening return False
-
{
-
return False;
-
}
-
}
-
}
-
?>
Listagem 2: Exemplo de uso da classe do RSS
-
<?
-
require_once “xmlWeb.php”;
-
-
//abre a classe responsavel por ler o rss diretamente na web
-
$rss = new xmlWeb();
-
-
//url de onde serao pegas as noticias
-
//caso queira outro local é só trocar a url, isso se o site estiver no padrao rss de noticias
-
$site = $rss->Get(“http://idgnow.uol.com.br/internet/RSS2″);
-
-
//pega o nome da fonte
-
$fonte = $site[‘title’];
-
-
//faz um loop no array e grava as noticias dentro do mysql
-
foreach ($site[‘items’] as $xml ) {
-
-
//pega o título da noticia
-
$titulo = $xml[‘title’];
-
-
//pega o link para abrir a noticia dentro do site fonte
-
$link = $xml[‘link’];
-
-
//pega a data em que a noticia foi publicada
-
-
//pega o texto da noticia
-
$noticia = $xml[‘description’];
-
-
//conexão com o banco de dados
-
-
//inserindo os dados dentro do banco de dados
-
$sql = “insert into noticia (fonte, titulo, link, data, noticia) values (”;
-
$sql .= “‘” . $fonte . “‘,”;
-
$sql .= “‘” . $titulo . “‘,”;
-
$sql .= “‘” . $link . “‘,”;
-
$sql .= “‘” . $data . “‘,”;
-
$sql .= “‘” . $noticia . “‘)”;
-
-
-
//pronto desta forma vc terá a noticia dentro do seu banco de dados simples não
-
}
-
-
echo “Fim do programa”;
-
-
?>
Valew galera, que todos tenham um ótimo fim de ano, tenham muita paz, muita saúde e é claro, muito dinheiro no bolso.
Powered by ScribeFire.



