Script anti duplicate content avec les sous-domaines

écrit par Aymeric

Contenu dupliquéLes sous-domaines peuvent dans certains cas être des générateurs de contenu dupliqué. Si votre homepage a des prédispositions pour ressortir sur une requête, avoir la même homepage présente dans l'index de Google avec une autre URL ne va pas aider l'ami Algo à trier correctement ces pages dans les SERP, vous n'allez pas ranker comme il faut.
Je ne vais pas vous refaire un laïus sur le Duplicate content mais plutôt vous présenter un script qui va vous permettre de lister tous les sous-domaines indexés sur Google pour un nom de domaine donné, afin de détecter d'éventuelles erreurs et/ou sous-domaines inattendus.

Pourquoi?

L'idée m'est venu entre autre quand j'ai constaté que j'avais un sous-domaine dupliqué à cause d'un site en version beta/dev qui avait été indexé (oui, Google la fouine lit les liens texte hors href, utilise les données de la Toolbar Google, et crawl le tout). Si vous êtes consultant/Chef de projet SEO (ce n'est pas encore mon cas, mais j'y aspire fortement, alors pensez à moi 😉 ), ce script pourrait être un passage obligatoire lors d'un audit si vous n'avez pas accès au zonefile de votre client.
Avec ce script SEO, j'ai ainsi pu trouver par exemple un sous-domaine étrange de webrankinfo.com http://forum.webrankinfo.comforum.webrankinfo.com/ qui générait 4 pages dupliquées (dont la homepage) de Webrankinfo: Olivier Duffez, si tu passes par là;)

Comment?

Le script va parcourir 1000 résultats (ce qui semble suffisant pour la plupart des sites) pour ensuite extraire les sous-domaine présents grâce à une petite expression régulière. Je ne peux pas finir cet article sans remercier @percub qui m'a bien aidé puisque j'étais parti dans une boucle un peu étrange et complexe dans laquelle je bouclais sur la requête modifiée au fur et à mesure (genre site:domaine.com -site:sd1.domain.com -site:sd2.domain.com -site:sd3.domain.com etc...) jusqu'à arriver au message "error 414, request is too long" (et oui, j'avais testé sur yahoo.com avec plus de 230 sous-domaines...). Il a su me remettre dans le droit chemin et me conseiller après pas mal d'échanges mails. Merci à lui. Du coup ce script est un doux mélange de différents bouts de code.

Script anti-duplicate avec des sous-domaines

Enjoy!

<?php
function scrapounet ($domaine)
{
        $schema = '`<cite>(.*?)\.'.$domaine.'\/(.*?)<\/cite>`i';
        $requete = '';$subs = '';$subdomaines = '';$output = '';$i=0;$j=0;
        $useragent='Opera/9.63 (Windows NT 5.1; U; fr) Presto/2.1.1';
        for ($i=0; $i<901; $i+=100) {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
                curl_setopt($ch, CURLOPT_URL,'http://www.google.fr/search?q=site:*.'.$domaine.'&hl=fr&ie=utf-8&oe=utf-8&aq=t&num=100&start='.$i);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
                $result .= curl_exec ($ch);
                curl_close ($ch);
                sleep(5);
        }
        preg_match_all($schema, $result, $matches);
        $matches = array_unique($matches[1]);
        sort($matches);
        foreach (($matches) as $key => $subs) {
        $j++;
        $subs = str_replace('https://','',$subs);
        $requete .= '-site:'.$subs.'.'.$domaine;
        $subdomaines .= '<tr><td>'.$subs.'</td><td>'.gethostbyname($subs.'.'.$domaine).'</td></tr>';
        $export .= $subs."\n";
        }
        file_put_contents($domaine.'.txt',$export);
        $output = 'T&eacute;l&eacutecharger l\'export (clic droit): <a href="'.$domaine.'.txt">'.$domaine.'.txt</a><br /><hr>';
        $output .= 'Liste des '.$j.' sous-domaines index&eacutees:<br /><br /><table border="1"><tr><td><b>Sous-domaine</b></td><td><b>Adresse IP</b></td></tr>'.$subdomaines.'</table><hr>';
        $output .= '<u>Equivalent de la requ&ecirc;te Google effectu&eacute;e avec la version pr&eacute;c&eacute;dente du script:</u> site:'.$domaine.$requete.'<br /><hr>';
        return $output;
}

if (isset($_GET["domaine"]) && $_GET["domaine"]!='')
{
$dom = $_GET["domaine"];
print $output =  scrapounet ($_GET["domaine"]);
}
?>

Appelez ensuite le script de cette manière: http://www.votresite.com/sousdomaines.php?domaine=abondance.com

Voici un screenshot d'une sortie:

Edité le 04/11:

Je vous mets malgré tout l'ancien script car dans certains cas et après de nombreux tests, les 1000 premiers résultats ne suffisent pas forcément pour faire apparaître tous les sous-domaines. Tant que la requête n'est pas trop longue (et que l'erreur 414 n'arrive pas), ce script extrait plus de sous-domaines. Essayez les deux!

<?php

function scrapounet ($domaine)
{
        $schema = '`<cite>(.*?)\.'.$domaine.'\/(.*?)<\/cite>`i';
        $requete = '';$subs = '';$i=0;$j=0;
        $useragent='Opera/9.63 (Windows NT 5.1; U; fr) Presto/2.1.1';
        do {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
                curl_setopt($ch, CURLOPT_URL,'http://www.google.fr/search?q=site:'.$domaine.$requete.'&hl=fr&ie=utf-8&oe=utf-8&aq=t&num=100');
                curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
                $result = curl_exec ($ch);
                preg_match_all($schema, $result, $matches);
                $matches = array_unique($matches[1]);
                        foreach (($matches) as $key => $subs) {
                        $subs = str_replace('https://','',$subs);
                        if (!eregi('\+\-site:'.$subs.'.'.$domaine,$requete)) {
                        $j++;
                        $requete .= '+-site:'.$subs.'.'.$domaine;
                        $subdomaines .= '<tr><td>'.$subs.'</td><td>'.gethostbyname($subs.'.'.$domaine).'</td></tr>';
                        $export .= $subs."\n";}
                        }
                sleep(5);
                $i++;
        }
        while ($i<10) ;
        file_put_contents($domaine.'.txt',$export);
        $output = 'T&eacute;l&eacutecharger l\'export (clic droit): <a href="'.$domaine.'.txt">'.$domaine.'.txt</a><br /><hr>';
        $output .= 'Liste des '.$j.' sous-domaines index&eacutees:<br /><br /><table border="1"><tr><td><b>Sous-domaine</b></td><td><b>Adresse IP</b></td></tr>'.$subdomaines.'</table><hr>';
        $output .= '<u>R&ecirc;quete Google effectu&eacute;e:</u> site:'.$domaine.$requete.'<br /><hr>';
        return $output;
}

if (isset($_GET["domaine"]) && $_GET["domaine"]!='')
{
$dom = $_GET["domaine"];
print $output =  scrapounet ($_GET["domaine"]);
}
?>

Crédit photo : Girafes dupliquées lors de mon voyage en Tanzanie.

écrit dans Scripts SEO par Aymeric | 18 commentaires

18 commentaires "Script anti duplicate content avec les sous-domaines"