Les derniers articles
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.
| 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.
|
| 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.
|
| 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().
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 > 0 || $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;
}
}
?>
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.
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é.
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
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