Vous n'êtes pas identifié(e).

  • Contributions :
  • Vos boîtes de messages privés sont vides.

🟣 Crawler pour generer un sitemap


#1 2019-04-09 14:07:53

Mention PierreG
🥉 Grade : Scout

AuxiliaireIngénieur web
Lieu : Paris
Inscription : 2018-03-10
Messages : 179
Likes : 2

Développement PHP
Data Base Admin

Crawler pour generer un sitemap

Un jour on se rend compte que les generateurs de sitemaps ne marchent pas comme il faudrait...

Alors j'ai codé le mien vite fait. Il est pas parfait mais il marche très bien chez moi alors je partage.

Il marche aussi très bien pour generer le site map d'un autre site wink
Comme tous les crawler il est un peu long (scan de 2 à 3 page par seconde en local chez moi)
Le page contenant le mot "noindex" sont ecartées (peut importe ou se trouve le mot dans le html.
Le sitemap est mis dans le dossier Logs (pensés à le créer à la racine du site depuis lequel vous executé le script).
Le sitemap est en format txt, pensez à l'editer pour en faire un vrai xml.


<?php
set_time_limit (10000);

$Site = 'https://www.mon-site.com';
$NbPage = 1000000; //Le nombre de page max à scanner (pratique pour faire des test)

//PageBase contient url - visitée bool - resultat crawl text - Indexable bool
$PageBase = array('url' => $Site."/", 'visite' => false, 'resultat_visite' => '', 'indexable' => '');

//Tableau général qui contient toutes les pages
$Tab = array('/' => $PageBase);

//Variable qui arrete le crawl
$ContinueCrawl = true;

while($ContinueCrawl)
  {
  $i = 0;
  foreach($Tab as $LigneCle => $LigneValeur)
    {
    if($i < $NbPage)
      {
      $ContinueCrawl = false;
      if(empty($LigneValeur['visite'])) //Si toutes les url ont été visitées alors stop les crawl
        {
        $ContinueCrawl = true; 
        }
       
      if(!$LigneValeur['visite'])
        {
        $Tab[$LigneCle]['visite'] = true;
        @$html = file_get_contents($Site.$LigneCle);
       
        if($html) //si la page est accessible
          {
          $Tab[$LigneCle]['resultat_visite'] = true; //Marque la page comme visitée
         
          if(preg_match('#noindex#',$html)) //Verifie qu'elle ne contient pas de noindex
            {
            $Tab[$LigneCle]['indexable'] = false;
            }
          else
            {
            $Tab[$LigneCle]['indexable'] = true;
            }
           
          //Extrait les liens
          $Matches = array();
           
          //recupère tous ce qui est entre <a et a> et les mets dans le tableau Matches
          $Pattern = '#<a.*href="(/[a-zA-Z0-9/-]*\.*[a-zA-Z0-9/-]*)".*>#';
          preg_match_all($Pattern,$html,$Matches);
          $LiensTrouveSurPage = $Matches[1];
           
          foreach($LiensTrouveSurPage as $UnLienTrouve) //pour chaque lien trouve, on verifie qu il est pas deja dans $Tab
            {
            if(!isset($Tab[$UnLienTrouve]))
              {
              $Tab[$UnLienTrouve] = array('url' => $Site.$UnLienTrouve, 'visite' => false, 'resultat_visite' => '', 'indexable' => '');
              $ContinueCrawl = true; 
              }
            }
          }
        else
          {
          $Tab[$LigneCle]['resultat_visite'] = false;
          }
        }
        $i++;
      }
    }
  }
echo count($Tab)." liens trouvés";
//var_dump($Tab);

$Debut = <<<TEXT
<?xml version="1.0" encoding="UTF-8"?>
<urlset
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
      xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
      xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n
TEXT;

$monfichier = fopen('Crawl.xml', 'w');
fputs($monfichier, $Debut);
fclose($monfichier);

foreach($Tab as $UneLigne)
  {
  $Phrase = '';
  if($UneLigne['indexable'])
    {
    $Phrase .= "<url>";
    $Phrase .= "\n";
    $Phrase .= "\t<loc>";
    $Phrase .= $UneLigne['url'];
    $Phrase .= "</loc>";
    $Phrase .= "\n";
    $Phrase .= "\t<lastmod>".date('Y-m-d')."T00:00:00+00:00</lastmod>";
    $Phrase .= "\n";
    $Phrase .= "\t<changefreq>weekly</changefreq>";
    $Phrase .= "\n";
    $Phrase .= "\t<priority>1.0000</priority>";
    $Phrase .= "\n";
    $Phrase .= "</url>";
    $Phrase .= "\n";
    echo $Phrase.'<br />';
    }

  //Enregitre tans un fichier
  $monfichier = fopen('Crawl.xml', 'a');
  fputs($monfichier, $Phrase);
  fclose($monfichier);

  }

$monfichier = fopen('Crawl.xml', 'a');
fputs($monfichier, "</urlset>");
fclose($monfichier);
?>

Dernière modification par PierreG (2020-07-12 13:36:13)


-----------------------
Tu fais du SEO dans le secteur du service à la personne ? (ou tu connais quelqu'un qui le fait) envoi moi un MP

0
J'aime ❤️

🔴 Hors ligne

Pied de page des forums