Hack SEO pour un Crawl hyper Custom… Merci Mac Gyver


J’ai trouvé ce cas d’utilisation vraiment intéressant, alors pour gérer la question j’ai voulu vous proposer une astuce de beau gosse et le code PHP qui va avec 😎

Hack SEO pour un Crawl hyper Custom… Merci Mac Gyver, Devis couvreur

Pour remettre un peu de contexte voici le tweet d’où est parti le hack SEO que je vous propose aujourd’hui.

La problématique est aussi intéressante pour d’autres cas d’utilisation.

Si j’ai bien compris Mathieu songe à faire sauter un ou plusieurs menus, et veut d’abord mesurer l’impact. Mais on pourrait aussi avoir besoin d’analyser un mailing interne en tenant compte uniquement des liens situés dans le contenu principal de la page. Si on considère que Google ne donne pas la même importance aux liens du site qu’aux liens situés dans le « Main Content », c’est intéressant.

On peut avoir besoin d’identifier par exemple les articles qui ne sont pas assez poussés par d’autres articles ou identifier une nouvelle race de pages orphelines.

Mais comment scanner un site en empêchant le crawler de suivre les liens de la navigation principale et du footer ?

Les crawlers nous permettent d’inclure et d’exclure des URL en fonction des modèles présents dans l’URL mais ne nous permettent pas d’inclure ou d’exclure des URL en fonction de leur emplacement dans le code. Commentaire décrit à ce problème ?

Il y a bien cette proposition, intéressante techniquement, mais franchement, un poil compliquée à proposer sur une version en production.

On ne peut pas modifier le site en production, mais at-on besoin de crawler le site sujet de l’analyse ? Non.

On peut en revanche crawler un script qui fera office de miroir du site (généré à la volée). Dessus on peut se permettre de faire sauter du HTML toutes les zones du code qui ne nous intéressent pas.

Par exemple on fait sauter toutes les balises

et la section

. Selon le cas d’utilisation on peut aussi tout faire sauter et ne pas garder que ce qui se trouve dans

ou encore dans

.

La solution s’inspire en partie de l’astuce proposée il y a quelques mois pour forcer ScreamingFrog à suivre les liens externes et continuer le crawl indéfiniment. Il y a cependant deux choses majeures qui changent dans le présent cas de figure :

  1. Modification du code HTML à la volée pour supprimer les zones du code qui nous posent problème (ou garder uniquement celles qui nous intéressent)
  2. On ne réécrit plus les URLs externes pour forcer un crawl infini. Sur reste sur le même site.

Le hack SEO concrètement

Supposez que nous devions travailler sur le site leptidigital.fr de @VincentBroussas. Le site en production se présente comme suit et nous voulons nous débarrasser de ce qui est encadré en rouge ici.

Hack SEO pour un Crawl hyper Custom… Merci Mac Gyver, Devis couvreur

En passant par un simple script PHP qui nous servira de proxy et en manipulant légèrement le HTML, sur l’instantané le résultat dont Mathieu a besoin, à savoir un site dépourvu de menu de navigation, et de pied de page. Nous suggérons qu’aussi faire disparaître la barre latérale, mais c’est un détail.

Hack SEO pour un Crawl hyper Custom… Merci Mac Gyver, Devis couvreur

Place maintenant au code. Dans le dossier /www/ de notre serveur (ici local), sur un dossier appelé /custom-crawl/. Dans ce dossier sur place 3 fichiers php.

  1. simple_html_dom.php que vous trouverez en ligne ici
  2. index.php (copiez et le code ci-dessous)
  3. mirror.php (copiez et le code ci-après)

Code à coller dans index.php

<?php
	/*
		How it Works ? Easy.
		You just need to change the custom parameters section of this file to tell the script :
		
			1- The URL of website do you want to crawl 
			2- The tags you want to exclude from the HTML or include in the HTML.
			3- The behaviour you want to work with: Exclusion behaviour ? or Inclusion behaviour ? 
		
		Example 1
		Let's says you want to INCLUDE in the HTML only what is inside the <article> tag, just use :
			$website = "https://www.www.example.com";
			$selectors = array("article");
			$behaviour("include");
		
		Example 2
		Let's says you want to EXCLUDE from the HTML all what is inside the <nav> and <footer> tags 
		but also you want to exclude a <div> tag by its ID, just use
			$website = "https://www.www.example.com";
			$selectors = array("nav,footer","div[id=secondary-nav]");
			$behaviour("exclude");
	*/
	
	// Custom Parameters
		$website = "https://www.example.com";
		$behaviour = "exclude"; //remember if you need an inclusion behaviour use $behaviour = "include";
		$selectors = array("nav","footer","aside");
	// End of Custom Parameters
	
	// Do not change the following!
	include ('mirror.php');
	include ('simple_html_dom.php');
	$crawl = new mirror();	
	if(isset($_GET["uxx"])){
		echo $crawl->getCont($_GET["uxx"],$selectors,$behaviour,$_SERVER['HTTP_USER_AGENT']);
	}
	else {
		echo $crawl->getCont($website,$selectors,$behaviour,$_SERVER['HTTP_USER_AGENT']);
	}
?>

Code à coller dans mirror.php

<?php
class mirror {
 
    function __construct(){
    }
     
    private function getIt($url,$ua){
     
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_USERAGENT,$ua);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_REFERER, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        $response = array();
        $response["html"] = curl_exec($ch);
        $response["info"] = curl_getinfo($ch);
        curl_close($ch);
        return $response;
    }
     
    public function getCont($url,$selectors="",$behaviour,$ua){

        $parts = parse_url($url);
        $response = $this->getIt($url,$ua);
        if($response["info"]["http_code"]!==0){
			$html = str_get_html($response["html"]);
			if($selectors!=""){
				$html = $this->customHTML($html,$selectors,$behaviour);
			}
            $html = $this->updateHref($html,$parts["scheme"],$parts["host"]);
			$html->save();
			return $html;
        }
		return $response["html"];
    }
    
	private function customHTML($html,$selectors,$behaviour){
		if($behaviour=="exclude"){
			foreach($selectors as $tag){
				foreach($html->find($tag) as $tag){
					$tag->outertext = "";
				}
			}
		}
		else if($behaviour=="include"){
			$output = "";
			array_push($selectors,"script");
			foreach($selectors as $tag){
				foreach($html->find($tag) as $tag){
					$output.= $tag->outertext;
				}
			}
			$head = $html->find("head",0)->outertext;
			$output = "<html>".$head."<body>".$output."</body></html>";
			$html = str_get_html($output);
		}
		return $html;
	}
	
    private function updateHref($html,$scheme,$host){
         
        foreach ($html->find('a') as $link){
             
            $link->href = preg_replace("#^/.*#",$scheme."://".$host."/",$link->href);
			$link->href = preg_replace("#^".$scheme."://".$host."/.*#","?uxx=".$link->href,$link->href);
        }
        return $html;
    }
}
?>

Une fois les fichiers installés dans le dossier custom-crawl il ne reste plus qu’à ouvrir ScreamingFrog et à crawler le site http://localhost/custom-crawl (je voulais dire leptidigital).

Voilà pour ce petit hack référencement, j’espère que vous avez trouvé cela intéressant et que vous me ferez un petit coucou en commentaire.