Google search parser

0/5 (13 avis)

Snippet vu 16 721 fois - Téléchargée 21 fois

Contenu du snippet

Un petit script qui permet d'intégrer le moteur de recherche google à son site sans passer par leur API... peut être très utile pour un intranet par exemple ;)

Source / Exemple :

<?php
/**
* Google search parser est un module permettant d'afficher les résultats de recherche google sans passer par leur api
* Réalisation : Nans Stefanini -> http://nans.stefanini.free.fr
* Blog : http://www.22h22.fr
*/


//renvoie une url longue raccourcie
function ShortDisplayURLggp($FullPath,$MaxLenght=65)
{
	If (strlen($FullPath) > $MaxLenght)
	{
		//Suppression des arguments et fragment si nécessaire
		if (strpos($FullPath,"#",0) > 0) $FullPath = substr($FullPath,0,strpos($FullPath,"#",0));
		if (strpos($FullPath,"?",0) > 0) $FullPath = substr($FullPath,0,strpos($FullPath,"?",0));

		If (strlen($FullPath) > $MaxLenght)
		{
			// Decompose l'URL
			$FullPathParsed=parse_url($FullPath);
			// Parties minimales
			$RootPath = $FullPathParsed['scheme'].'://'.$FullPathParsed['host'];
			// Slash de fin si dossier
			if (substr($FullPathParsed['path'],-1) == '/')
			{
				$FullPathParsed['path'] = substr($FullPathParsed['path'],0,-1);
				$isFolder = TRUE;
			}
			else
			{
				$isFolder = FALSE;
			}
			$PathBaseName = basename($FullPathParsed['path']);
			$FullPathParsed['path'] = substr($FullPathParsed['path'],0,-1*strlen($PathBaseName)-1);
			// Pas besoin de citer l'index
			if (($PathBaseName == 'index.html') OR ($PathBaseName == 'index.php') OR ($PathBaseName == 'index.php3'))
			{
				$FullPathParsed['path'] = substr($FullPathParsed['path'],0,-1*strlen($PathBaseName)-1);
				$PathBaseName = basename($FullPathParsed['path']);
				$isFolder = TRUE;
			}

			if ($PathBaseName == '')
			{
				if (strlen($RootPath) > $MaxLenght) $RootPath = $FullPathParsed['scheme'].'://'.ShortDisplayHostggp($FullPathParsed['host'],$MaxLenght - strlen($FullPathParsed['scheme']) - 3);

				return $RootPath;
			}
			else if ($FullPathParsed['path'] == '')
			{
				return $RootPath.'/?/'.$PathBaseName;
			}
			else if ((strlen($RootPath)+strlen($PathBaseName)+3) >= $MaxLenght)
			{
				return $RootPath.'/?/'.$PathBaseName;
			}
			else
			{
				// Reduction du chemin
				while ((strlen($RootPath)+strlen($PathBaseName)+strlen($FullPathParsed['path'])+3) > $MaxLenght)
				{
					$FullPathParsed['path'] = substr($FullPathParsed['path'],0,-1*strlen(basename($FullPathParsed['path']))-1);
				}

				if ($FullPathParsed['path'] == '')
				{
					return $RootPath.'/?/'.$PathBaseName;
				}
				else
				{
					return $RootPath.$FullPathParsed['path'].'/?/'.$PathBaseName;
				}
			}
		}
		Else
		{
			return $FullPath;
		}

	}
	Else
	{
		return $FullPath;
	}
}

function ShortDisplayHostggp($FullHost,$MaxLenght=80)
{
	If (strlen($FullHost) > $MaxLenght)
	{
		if (substr_count($FullHost,'.') >= 2)
		{
			return $FullHost;
		}
		else if (substr_count($FullHost,'.') == 1)
		{
			$extension = substr($FullHost,strpos($FullHost,".",0));
			$FullHost = substr($FullHost,0,strpos($FullHost,".",0));
			$FullHost = substr($FullHost,0,10).'(?)'.substr($FullHost,-1*(10+3+1+strlen($extension))).'.'.$extension;
		}
		else
		{
			$FullHost = substr($FullHost,0,$MaxLenght-3).'(?)';
		}
	}
	else
	{
		return $FullHost;
	}
}

function ShortDisplayNameggp($FullName,$MaxLenght=50)
{
	If (strlen($FullName) > $MaxLenght)
	{
		$FullName = substr($FullName,0,$MaxLenght-3).'(?)';
		return $FullName;
	}
	else
	{
		return $FullName;
	}
}

?>
<?php




function googlesearch($req, $start='0',$lg='fr') {

$index = @file_get_contents('http://www.google.fr/search?q='.urlencode($req).'&hl='.$lg.'&start='.$start);
//echo 'http://www.google.fr/search?q='.urlencode($req).'&hl='.$lg.'&start='.$start;
$index = str_replace ('<b>', '', $index);
$index = str_replace ('</b>', '', $index);

/*
Résultats <b>1</b> - <b>10</b> sur un total d'environ <b>1 780</b> pour <b>cogestar</b>  (<b>0,15</b> second
Résultats <b>61</b> - <b>66</b> sur <b>66</b> pour <b>cogestar</b>.  (<b>0,79</b> secondes) */
  // nombre de liens trouvés
   preg_match_all('%sur[\s]*(un total d\'environ)* (([0-9 ]*)*) pour%si', $index, $nbliens);
 
 /*
   echo '<pre>';
   print_r($nbliens);
   echo '</pre>';

*/
$nblien = $nbliens[2][0];
$nblien = str_replace (' ', '', $nblien);


// si la requette ne retourne rien on quite la fonction
if (!isset($nblien)) {
  return 'false';
  break;
}

 preg_match_all('%\<div class=g\>(.*?)(\</div\>)%si', $index, $out);
            
 
 /*
 echo '<pre>';
 print_r($out);
 echo '</pre>';
*/

$tabfin = array();
foreach ($out[1] as $key => $value) {
  
  /*
     preg_match_all('%(\<h2 class=r.*\>)?(.*)?\</h2\>%si', $value, $out2);
   
    echo '<pre>';
    print_r($out2);
    echo '</pre>';
*/

  // description
  $q = '\<td class="j"\>.*(\>)(..*)\<br';
   // preg_match_all('%%si', $value, $out3);
  
  
  // liens et titre
  $p = '\<h2 class=r\>\<a href="(.*?)".*\>(..*)\</h2\>';
  
  // lien titre + description
  preg_match_all('%'.$p.'.*'.$q.'%si', $value, $out2);
  
  /*
  echo '<pre>';
    print_r($out2[1]);
    print_r($out2[2]);
    print_r($out2[4]);
    echo '</pre>';
  echo '<br /><br /><br />';
  */
  
  $tabfin[$key]['lien'] = $out2[1][0];
  $tabfin[$key]['titre'] = $out2[2][0];
  $tabfin[$key]['description'] = $out2[4][0];
  $tabfin[$key]['nbliens'] = $nblien;
  
  /*
  // pour rechercher les liens verts
   preg_match_all('%\<span class=a\s*\>\s*([-A-Z0-9+&@#/=~_|!:,.;\%]*)?.*(\</span\>)%si', $value, $out3);
 echo '<pre>';
    print_r($out3);
    echo '</pre>';
    */
    
 
}
/*

      */ 
   
   /*
    echo '<pre>';
    print_r($tabfin);

    echo '</pre>';
  echo '<br /><br /><br />';
  */
  
  

   
   
return $tabfin ;
 
  
}




/* exemple de fonctionnement */


?>
<form action="" method="get" >
<input type="text" size="40" name="req" id="req" value="<?php if (isset ($_GET['req']) ){ echo $_GET['req'] ; }?>">
<input type="submit" name="submit" value="Rechercher google"  >
</form>
<script>
  document.getElementById("req").focus();
</script>
<?php
if (!isset ($_GET['pagestartgg']) ){
$_GET['pagestartgg'] = 0;
}

if (isset($_GET['req'])) {

$tabgg =  googlesearch($_GET['req'],$_GET['pagestartgg']);

echo 'Résultats de votre recherche : ';
echo '<a href="http://www.google.fr/search?q='.urlencode($_GET['req']).'&start='.$_GET['pagestartgg'].'" target="_blank">Voir sur google</a><br /><br />';

foreach ($tabgg as $key => $value) {
  echo '<strong><a href="'.$value['lien'].'">'.$value['titre'].'</a></strong><br />'.$value['description'].'<br /><a href="'.$value['lien'].'">'.ShortDisplayURLggp($value['lien']).'</a><br /><br />';
}

$nbliens = $tabgg[0]['nbliens'];
echo '<br />';

// mise en place des pages
$nbpage = round($nbliens/10);
echo '<strong>'.$nbpage. ' pages </strong><br />';

$ideb = ($_GET['pagestartgg']/10)-10 ;
$ideb < 0 ? $ideb = 0: '';
$page = ($_GET['pagestartgg']/10);
//echo 'page '.($_GET['pagestartgg']/10).'<br />';


$nbpage < $ideb ? $ideb = $nbpage : '';
//echo 'ideb '.$ideb.'<br />';

$ifin = $ideb + 15 ;
$ifin > $nbpage ? $ifin = $nbpage : '';

echo '<a href="?pagestartgg=0"><<</a>   ';
  for ($i = $ideb; $i<=$ifin; $i++) {
    if ($page == $i)  echo '<strong>  ' ;
    echo '<a href="?pagestartgg='.($i*10).'&req='.urlencode($_GET['req']).'">'.($i+1).'</a> ';
      if ($page == $i)  echo '  </strong>' ;
  }
echo '   <a href="?pagestartgg='.$nbpage.'">>></a> ';

}
?>

Conclusion :

Ce code parse le code html des résultats renvoyés par google sur une requette... donc le jour ou ils changeront radicalement de mise en page ça risque de ne plus fonctionner ... m'enfin je pense que c'est pas demain la veille :)
Au debut du code deux trois fonctions qui ne sont pas de mo mais qui sont utiles pour la mise en page des url trop longues ;)

A voir également

Ajouter un commentaire Commentaires
cs_badoux Messages postés 137 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 16 décembre 2008
16 déc. 2008 à 14:15
Je confirme il existe bien un flux pour les résultats de google, mais le problème est que ceux-ci sont limité à environ 20 résultats.
De mon côté je vais devoir également passer par un parser pour la récupération des résultats, ravis de ton commentaire "ordiman85", seulement 3sec, c'est pour toute les pages de tous les moteurs, ou pour une seule d'un moteur ?.
Une question persiste dans ma petite tête: Est-ce que Google, Yahoo, etc, ne finiront pas, par nous mettre en black-list, à force de leur rendre visite constament ?
Utilisateur anonyme
2 juil. 2008 à 20:09
je vous propose ça:

<form action="http://www.google.fr/cse" id="cse-search-box" target="_blank">
  

    
    
    
    
  

</form>
<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=fr"></script>
koutb Messages postés 21 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 17 mai 2008
17 mai 2008 à 23:46
1001 merci c'est ce que je cherche
R3dDragon Messages postés 62 Date d'inscription dimanche 30 juillet 2006 Statut Membre Dernière intervention 14 avril 2009
28 janv. 2008 à 16:27
Les résultats via Google et les API sont différents...
Il est donc mieux (en parlant qualité des résultats) de passer par un perseur, mais d'un autre côté les APIs utilise moins de ressource ...

C'est toujours à voir, chacun fait ce qu'il veut...
ordiman85 Messages postés 41 Date d'inscription samedi 4 mars 2006 Statut Membre Dernière intervention 19 mars 2010
15 juin 2007 à 19:44
J'ai fait ça pour des moteurs de recherche de mp3 (radioblog, eSpew, AOL audio, ...) et ça fonctionne super bien. J'ai créé une fonction pour chaque moteur au début mais ensuite j'ai fini par faire une fonction générale du style "searchAudio($engines, $search, $page, $nbperpage...)" avec des fichiers de configuration xml personnalisables basés sur les fichiers xml OpenSearch de firefox. Aujourd'hui mon script gère 11 moteurs et affiche les résultats des moteurs sélectionnés en 1 page. Avec 3 moteurs activés la réponse est d'environ 3 secondes, sauf si les résultats sont déjà dans le cache.

Je confirme que l'inconvénient de parser du html c'est lorsque la page change, mais un petit coup de patch au niveau des expressions régulières, et ça repart :) d'autant plus qu'il est facile de savoir si les résultats sont anormaux par une fonction (longueur de la réponse, balises dans la réponse, etc).
@+
Afficher les 13 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.