Utilisation des APIs Google sans javascript
Par CrazyCat le 02/06/2009, 11:08 - PHP - Lien permanent
Google permet aux webmasters d'intégrer des résultats de recherche sur leur site en utilisant des fonctions Ajax, mais il peut être utile de récupérer les résultats autrement, par exemple pour les stocker en base.
Heureusement, Google fournit un moyen d'interroger son moteur de recherche directement (par une requète GET) qui renvoie un résultat en JSON[1]
Notes
[1] JSON (JavaScript Object Notation) est un format de données textuel qui permet de représenter de l'information structurée.
Ainsi, il est possible d'appeler directement l'url http://ajax.googleapis.com/ajax/services/search/web en lui passant une série de paramètres afin d'effectuer une recherche, et l'on récupère un objet facilement exploitable.
Les paramètres
Ici sont listé les paramètres les plus communs pour effectuer une recherche basique.
Paramètres obligatoires
- v : Numéro de version de l'API (1.0 actuellement)
- q : Les critères de recherche (le contenu de votre champ de recherche). Ce paramètre doit être url-encodé
Paramètres optionnels
- hl : la langue de recherche (fr, en, ...). Si la langue n'est pas renseignée, Google essayera de déterminer la langue du demandeur (navigateur)
- rsz : la taille des éléments renvoyés (small = 4, large = 8)
- start : l'indice du premier résultat renvoyé
L'objet résultat
Google retourne donc un objet JSON appelé responseData qui contient deux sections intéressantes: les résultats (results) proprement dit et un curseur (cursor).
results
L'objet qui nous intéresse le plus, il est composé de 4 ou 8 items qui se composent chacun des champs suivants:
- url : l'url du site (par exemple http://www.g33k-zone.org/test-de-google.php)
- visibleUrl : l'url affichée (par exemple www.g33k-zone.org)
- title : le titre de la page, avec les mots-clés mis en gras
- titleNoFormatting : le titre de la page sans mise en forme
- content : un extrait de la page
cursor
Le curseur donne des indications sur les pages de résultats, il contient deux éléments intéressants:
- label: le numéro de la page
- start: le numéro du premier résultat de la page concerné.
Avec le curseur, vous pouvez donc générer les liens vers les pages suivantes.
Exploitation en PHP5
Le système fonctionnant en JSON, il faut avoir PHP5 ou bien une classe permettant de transformer une chaîne JSON en objet. Le script suivant utilise cURL pour les accès à Google, mais il est aussi possible d'utiliser un file_get_contents ou fsock.
<?php // Il faut un referer à Google, il s'agit de la page qui lance la recherche define('REFERER', 'http://www.g33k-zone.org/index.php'); // Le paramètre start est celui qui défini la page Google que l'on veut atteindre $start = intval($_GET['start']); // Le paramètre q est le contenu du champs de recherche if (isset($_GET['q']) && $_GET['q']!='') { $url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=large&q=".rawurlencode($_GET['q'])."&start=".$start."&hl=fr"; // Exécution de la recherche $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_REFERER, REFERER); $body = curl_exec($ch); curl_close($ch); // Analyse de la réponse $json = json_decode($body); // Affichage des résultats $res = $json->responseData->results; foreach ($res as $k => $myres) { echo '<p><a href="'.$myres->url.'" title="'.$myres->titleNoFormatting.'">'.$myres->title.'</a><br />'; echo $myres->content.'<br />'; echo '<a href="'.$myres->url.'" title="'.$myres->titleNoFormatting.'">'.$myres->visibleUrl.'</a></p><hr />'; } // Affichage des liens pour les autres pages de recherche $lpages = $json->responseData->cursor->pages; foreach($lpages as $k => $myp) { echo '<a href="'.REFERER.'?q='.urlencode($_GET['q']).'&start='.$myp->start.'">'.$myp->label.'</a> '; } } ?>
Conclusion
Ce code est extrèmement simple à mettre en oeuvre et peut être adapté dans beaucoup de langages.
Je prépare actuellement une version bien plus élaborée qui pourra gérer les diverses recherches de Google (images, vidéos, livres, cartes, blogs, actualités).
Commentaires
Bonjour et merci pour ce code très intéressant.
J'ai remarqué qu'une erreur est retournée lorsque la requête ne renvoie aucun résultat.
Le message est "Invalid argument supplied for foreach()"
Serait-il possible de tester ce cas ?