Logo classes.scriptsphp.org PHP

go to nav bar

Rechercher sur le web grâce aux API Yahoo et Google

Date :: 2005-03-07
Last Updated :: 2005-03-09


Introduction

Dans cet article, nous allons voir comment interroger uniformément les API Google et Yahoo pour effectuer une recherche sur le web.
Dans un précédent article, nous avons déjà vu comment interroger le moteur de recherche de Google en utilisant son API basée sur SOAP et WSDL. Depuis mars 2005, Yahoo a lancé également son API, basée sur REST. Cette dernière s'avère à priori beaucoup plus complète que celle de Google, en proposant un accès à sa base de données d'images, de vidéos ou encore de news.

Description des classes utilisées

Nous allons donc commencer par créer deux classes. La première, YAHOOWebSearch, sera chargée d'interroger le serveur REST de Yahoo, la seconde, GoogleWebSearch, interrogera le serveur SOAP de Google. Les deux classes contiendront exactement les mêmes méthodes publiques et s'utiliseront de manière similaire afin de pouvoir factoriser leur utilisation. Voici leur description :

  • object GetInstance() :: Le singleton, cette méthode renvoie une instance unique de la classe courante. La classe n'est pas instanciable directement, le constructeur est privé, nous verrons pourquoi plus tard. C'est donc la seule méthode à utiliser pour récupérer une instance.
  • array search() :: Méthode qui effectue la recherche sur le moteur sélectionné. Elle accepte de 1 à 6 paramètres :
    • $query :: Seul paramètre obligatoire : votre recherche.
    • $start :: (optionnel) Index de départ. Ce paramètre permet de réaliser un affichage par page des résultats
    • $results :: (optionnel) Nombre de résultats retournés
    • $similar_ok :: (optionnel) Active le renvoi des contenus similaires
    • $adult_ok :: (optionnel) Active le filtrage des contenus pour adulte
    • $lang :: Langue

Chacune des classes contient également une méthode privée, toArray() chargée de transformer la réponse de chaque serveur en un tableau multidimensionnel identique pour chaque classe, ce tableau est de la forme :

array
	[Search] => votre recherche
	[TotalResults] => Nombre total de résultats retournés
	[Start] => Index de départ
	[Results] => array
		[0] => array
			[Title] => Titre de la page
			[URL] => URL
			[Summary] => Description du moteur
		[1] ...

Yahoo

Description de l'API Yahoo

Vous devez commencer par obtenir une licence (gratuite) pour utiliser les services de Yahoo.

Voici la description des paramètres à envoyer pour effectuer une recherche. A part les deux premiers paramètres, appid et query, tous les autres sont optionnels.

Recherche
Paramètre Type Description
appid String Le nom de votre licence Yahoo
query String Votre recherche. Elle doit impérativement être encodée au format UTF-8.
type String Type de recherche que vous souhaitez effectuer.
  • all : tous (valeur par défaut)
  • any
  • phrase
results Integer Nombre de résultats renvoyés par la requête.
De 10 par défaut à 50.
start Integer Index du début de votre recherche.
Ce paramètre vous permet, notamment, de réaliser un affichage par page des résultats. 1 par défaut.
format String Type de fichiers à rechercher.
  • all : tous (valeur par défaut)
  • html
  • msword
  • pdf
  • ppt
  • rss
  • txt
  • xls
similar_ok Boolean Ce paramètre permet de filtrer les résultats renvoyés en supprimant les contenus très similaires et/ou venant du même site. 0 par défaut.
adult_ok Boolean Ce paramètre permet de filtrer les contenus pour adulte. 0 par défaut.
language String Ce paramètre permet de restreindre la recherche à certaines langues. EN par défaut.
country String Localisation du site.

L'URL de base du serveur REST pour ce type de recherche est : http://api.search.yahoo.com/WebSearchService/V1/webSearch.
Donc, si vous souhaitez, par exemple, effectuer une recherche sur le mot clé PHP5, il vous suffit de parser le XML renvoyé par cette url : http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=votre_licence&query=PHP5

La classe Yahoo

La classe suivante se décompose donc en deux étapes. Tout d'abord, la construction de l'URL contenant tous les paramètres passés à la méthode search(). Ensuite, le contenu XML renvoyé par le serveur REST est chargé dans un objet simpleXML (utilisation de la fonction simplexml_load_file( $URL_du_serveur_REST )). La suite consiste uniquement en la construction du tableau dont nous avons vu la structure plus haut.

On notera également le singleton : le constructeur est privé et ne peut donc être instancié que par la méthode GetInstance().

<?php 

class YahooWebSearch  {

    private 
$APIURL 'http://api.search.yahoo.com/WebSearchService/V1/webSearch';
    private 
$LicenceKey '';
    static 
$Instance false;
    
    private function 
__construct() {
        
$this->LicenceKey YAHOO_LICENCE_KEY;
    }
    
    static function 
GetInstance() {
        if(empty(
self::$Instance)) {
            
self::$Instance = new YahooWebSearch();
        }
        return 
self::$Instance;
    }

    public function 
search($query$start=0$results=10$similar_ok=false$adult_ok=false$lang='fr') {
        
// ----------------------------------
        // paramètres non pris en compte :
        
$type 'all';
        
$format 'all';
        
$country '';
        
// ----------------------------------
        
        
$s['appid'] = $this->LicenceKey;
        
$s['query'] = urlencode(utf8_encode($query));
        
        
// ------------------------------------------------------------
        // Non utilisé
        
if($type == 'any' || $type == 'phrase' || $type == 'all') {
            
$s['type'] = $type;
        }
        
$formats_ok = array('html''msword''pdf''rss''ppt''xls''txt');
        if(
in_array($format$formats_ok)) {
            
$s['format'] = $format;
        }
        
// ------------------------------------------------------------
        
if($results || $results <= 50) {
            
$s['results'] = $results;
        }
        
// Google démarre à 0, Yahoo à 1
        
if($start >= 0) {
            
$s['start'] = $start+1;
        }
        if(
$adult_ok == 1) {
            
$s['adult_ok'] = 1;
        }
        if(
$similar_ok == 1) {
            
$s['similar_ok'] = 1;
        }
        
$s['language'] = $lang;

        foreach(
$s as $param => $value) {
            
$search[] = $param.'='.$value;
        }

        
$xml = @simplexml_load_file($this->APIURL.'?'implode('&'$search));
        if(!
is_object($xml)) {        
            throw new 
Exception('REST error : unable to load XML file');
            return 
false;
        }
        return 
$this->toArray($xml$query);
    }

    private function 
toArray($XMLObject$search) {
        
$ret['Search'] = $search;
        foreach(
$XMLObject->attributes() as $key => $val) {
            if(
$key == 'totalResultsAvailable') {
                
$ret['TotalResults'] = (int)$val;
            } elseif(
$key == 'firstResultPosition') {
                
$ret['Start'] = (int)$val;
            }
        }
        
$i 1;
        foreach(
$XMLObject->Result as $val) {
            
$ret['Results'][$i = ++$i+1] = array(
            
'Title' => (string)utf8_decode($val->Title),
            
'URL' => (string)$val->Url,
            
'Summary' => (string)utf8_decode($val->Summary)
            );
        }
        return 
$ret;
    }

}
?>

Google

Description de l'API Google

Un article spécifique a déjà été publié sur ce site, je vous laisse vous y reporter.

La classe Google

La classe ci-dessous diffère peu de celle de l'article, l'extension SOAP est également utilisée pour interroger le serveur de Google.

<?php
class GoogleWebSearch {
    
    private 
$WsdlUri 'http://api.google.com/GoogleSearch.wsdl';
    private 
$LicenceKey '';
    static 
$Instance false;
    
    private function 
__construct() {
        
$this->LicenceKey GOOGLE_LICENCE_KEY;
    }
    
    static function 
GetInstance() {
        if(empty(
self::$Instance)) {
            
self::$Instance = new GoogleWebSearch();
        }
        return 
self::$Instance;
    }
    
    public function 
search($query $start=0$results=10$similar_ok=false$adult_ok=false $lang='fr') {
        
// ----------------------------------
        // paramètres non pris en compte :
        
$restrict '';
        
// ----------------------------------
        
        // Limitation due a l API
        
if($results 10) {
            
$results 10;
        }
             
        
$params = array(
        
'key' => $this->LicenceKey,
        
'q' => utf8_encode($query),
        
'start' => (int)$start,
        
'maxResults' => (int)$results,
        
'filter' => (boolean)$similar_ok,
        
'restrict' => $restrict,
        
'safeSearch' => (boolean)$adult_ok,
        
'lr' => $lang,
        
'ie' => '',
        
'oe' => ''
        
);
        if(! @ 
$Client = new SoapClient($this->WsdlUri)) {
            throw new 
Exception('SOAP error''....');
            return 
false;
        }
         if(! @ 
$O =  $Client->__call("DoGoogleSearch"$params)) {
            throw new 
Exception('SOAP error''....');
            return 
false;
        }
        
        return 
$this->toArray($O$query);
    }
    
    private function 
toArray($r$search) {
        
$ret['Search'] = $search;
        
$ret['TotalResults'] = $r->estimatedTotalResultsCount;
        
$ret['Start'] = $r->startIndex;
        
$i 0;
        foreach(
$r->resultElements as $key => $val) {
            
$ret['Results'][$i = ++$i+1] = array(
            
'Title' => strip_tags(utf8_decode($val->title)),
            
'URL' => $val->URL,
            
'Summary' => strip_tags(utf8_decode($val->snippet))
            );
        }
        
        return 
$ret;
    }

}
?>

La classe de factorisation

Nous pourrions en rester là et utiliser directement les classes GoogleWebSearch et YahooWebSearch, mais pour « la beauté du geste », je vous propose une autre méthode, que je trouve assez élégante : Nous allons donc créer une troisième classe qui contiendra uniquement la méthode __call(). Cette dernière sera chargée de récupérer les appels à deux méthodes virtuelles, YahooSearch() et GoogleSearch() et de les rediriger vers l'objet correspondant en utilisant le singleton propre à chaque classe, ce qui permet de n'instancier l'objet que lorsque nous en avons besoin et d'en assurer l'unicité.

<?php 

class WebSearch {

    public function 
__call($method$arguments) {
        switch(
$method) {
            case 
'GoogleSearch' :
                
$Instance GoogleWebSearch::GetInstance();
            break;
            case 
'YahooSearch' :
                
$Instance YahooWebSearch::GetInstance();
            break;
            default :
                echo 
'Cette méthode n existe pas !!!';
                return 
false;
        }
        return @
call_user_func_array(array($Instance'search'), $arguments);
    }
}
?>

Utilisation

Tout d'abord, il vous faut définir deux constantes, YAHOO_LICENCE_KEY et GOOGLE_LICENCE_KEY qui contiendront vos licences respectives (et gratuites) pour utiliser les services.
A ce stade vous devez disposer de trois fichiers contenants chacun une classe. Afin de n'inclure que les classes nécessaires, le mécanisme de chargement automatique des classes, la fonction __autoload(), sera utilisé.
Les fichiers :

  • YahooWebSearch.class.php
  • GoogleWebSearch.class.php
  • WebSearch.class.php
<?php 
error_reporting
(E_ALL);

include 
'licence.php';
/*
define('YAHOO_LICENCE_KEY' , ' .... ');
define('GOOGLE_LICENCE_KEY', ' .... ');
*/

// chargement automatique des classes
function __autoload($class) {
    @require_once 
$class '.class.php';
}

// Nouvelle instance de la classe WebSearch
$Y = new WebSearch();


// Recherche avec le mot clé PHP5 avec Yahoo puis google
echo '<pre>';
print_r($Y->YahooSearch('PHP5'), true);
print_r($Y->GoogleSearch('PHP5'), true);
echo 
'</pre>';
?>

Liens utiles

Trackback

Il n'y a pas de trackback recensé pour cet article.

Faire un trackback sur cet article http://classes.scriptsphp.org/Trackbackserver.Rechercher-sur-le-web-avec-les-API-Yahoo-et-Google, récupérer les trackback sur cet article

Merci de ne pas suivre ce lien emails.

0.1316s | «»
PHP powered