Un script PHP pour récuperer des milliers d’adresses mail automatiquement

Bientôt noël, voici un cadeau pour les lecteurs de reporting business qui travaillent dans le marketing et plus particulièrement pour celles et ceux chargés de la prospection commerciale. Toutes les personnes travaillant dans l'internet vous le diront, les emails sont le nerfs de la guerre. Vous pourrez lancer plus facilement une nouvelle fonctionnalité, un nouveau produit, un nouveau site si vous pouvez faire de l'emailing ciblé mais en quantité. Pour les non-techniciens, lisez cet article, cela vaut le coup d'y consacrer quelques minutes, cela vous donnera sûrement des idées. Récupérer des adresses mails opt-in coûte cher, très cher lorsqu'il s'agit de segments bien spécifiques. L'opt-in pour ceux qui ne seraient pas au courant signifie que l'utilisateur est d'accord pour recevoir des propositions commerciales ou pour que le site récupérant l'adresse mail puisse commercialiser (donc revendre) cette adresses à d'autres entités commerciales. Même si les réseaux sociaux sont partout, contacter directement quelqu'un par email permettra de le toucher de façon plus efficace. Il n'est pas question d'emails opt-in ici, désolé de vous décevoir. Comme traité dans cet article déjà publié sur le site, il existe des moyens pour récupérer des adresses emails directement depuis les sites internet. Certains de ces outils sont payants, des technologies spécifiques sont déployées pour littéralement "craler" ou "scraper" un site internet et récupérer les informations qui vous intéressent. Le script ci dessous est écrit en php et provient du site the digilife. Sa mécanique de fonctionnement pour résumer est la suivante: le script va partir d'une URL que vous allez saisir. Depuis cette URL de départ qui fait office d'url d'initialisation, le script va aller récupérer tout le contenu de la page en question, s'il existe des adresses mails, il va les ajouter automatiquement dans une table, il va extraire tous les liens hypertexte présents sur la page html, nettoyer ces liens et les ajouter dans une table d'URL à traiter pour le script. Une fois que la page est traitée, son url est écrite dans une table récapitulant toutes les URL déjà traitées et elle est effacée de la table des URL "à traiter". Il s'agit d'un robot crawler qui fonctionne parfaitement pour l'avoir testé. Il y a une fonction à modifier, celle concernant les extensions. Vous pourrez ajouter de nouvelles règles pour personnaliser ce script. Son gros avantage est que le script, une fois lancé, continue de crawler presque infiniment en fonction des nouvelles URL trouvées. A vous ou à votre service IT de bien personnaliser ce script pour vous éviter de crawler tout le site d'Amazon ou l'intégralité des profils Facebook. Le script en question se découpe en 3 sous-modules: un script qui est en fait une class php, un petit script pour permettre de créer les tables qui viendront enregistrer les emails et les URL dans votre base de données ainsi qu'un autre script qui sera lui à lancer pour l’exécution du script.   emailcrawler.php

/*
Email address scraper based on a URL.
*/class scraper
{
 // URL that stores first URL to start
 var $startURL; 

 // List of allowed page extensions
 var $allowedExtensions = array('.css','.xml','.rss','.ico','.js','.gif','.jpg','.jpeg','.png','.bmp','.wmv'
 ,'.avi','.mp3','.flash','.swf','.css'); 

 // Which URL to scrape
 var $useURL; 

 // Start path, for links that are relative
 var $startPath; 

 // Set start path
 function setStartPath($path = NULL){
 if($path != NULL)
 {
 $this->startPath = $path;
 } else {
 $temp = explode('/',$this->startURL);
 $this->startPath = $temp[0].'//'.$temp[2];
 }
 } 

 // Add the start URL
 function startURL($theURL){
 // Set start URL
 $this->startURL = $theURL;
 } 

 // Function to get URL contents
 function getContents($url)
 {
 $ch = curl_init(); // initialize curl handle
 curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_VERBOSE, 0);
 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
 curl_setopt($ch, CURLOPT_AUTOREFERER, false);
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,7);
 curl_setopt($ch, CURLOPT_REFERER, 'http://'.$this->useURL);
 curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
 curl_setopt($ch, CURLOPT_FAILONERROR, 1);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
 curl_setopt($ch, CURLOPT_TIMEOUT, 50); // times out after 50s
 curl_setopt($ch, CURLOPT_POST, 0); // set POST method
 $buffer = curl_exec($ch); // run the whole process
 curl_close($ch);
 return $buffer;
 } 

 // Actually do the URLS
 function startScraping()
 {
 // Get page content
 $pageContent = $this->getContents($this->startURL);
 echo 'Scraping URL: '.$this->startURL.PHP_EOL; 

 // Get list of all emails on page
 preg_match_all('/([\w+\.]*\w+@[\w+\.]*\w+[\w+\-\w+]*\.\w+)/is',$pageContent,$results);
 // Add the email to the email list array
 $insertCount=0;
 foreach($results[1] as $curEmail)
 {
 $insert = mysql_query("INSERT INTO `emaillist` (`emailadd`) VALUES ('$curEmail')");
 if($insert){$insertCount++;}
 } 

 echo 'Emails found: '.number_format($insertCount).PHP_EOL; 

 // Mark the page done
 $insert = mysql_query("INSERT INTO `finishedurls` (`urlname`) VALUES ('".$this->startURL."')"); 

 // Get list of new page URLS is emails were found on previous page
 preg_match_all('/href="([^"]+)"/Umis',$pageContent,$results);
 $currentList = $this->cleanListURLs($results[1]); 

 $insertURLCount=0;
 // Add the list to the array
 foreach($currentList as $curURL)
 {
 $insert = mysql_query("INSERT INTO `workingurls` (`urlname`) VALUES ('$curURL')");
 if($insert){$insertURLCount++;}
 } 

 echo 'URLs found: '.number_format($insertURLCount).PHP_EOL;
$getURL = mysql_fetch_assoc(mysql_query("SELECT `urlname` FROM `workingurls` ORDER BY RAND() LIMIT 1"));
 $remove = mysql_query("DELETE FROM `workingurls` WHERE `urlname`='$getURL[urlname]' LIMIT 1"); 

 // Get the new page ready
 $this->startURL = $getURL['urlname'];
 $this->setStartPath(); 

 // If no more pages, return
 if($this->startURL == NULL){ return;}
 // Clean vars
 unset($results,$pageContent);
 // If more pages, loop again
 $this->startScraping();
 } 

 // Function to clean input URLS
 function cleanListURLs($linkList)
 {
 foreach($linkList as $sub => $url)
 {
 // Check if only 1 character - there must exist at least / character
 if(strlen($url) allowedExtensions,'',$url,$count);
 if($count > 0){ unset($linkList[$sub]);}
 // If URL starts with #, ignore
 if(substr($url,0,1) == '#'){unset($linkList[$sub]);} 

 // If everything is OK and path is relative, add starting path
 if(substr($url,0,1) == '/' || substr($url,0,1) == '?' || substr($url,0,1) == '='){
 $linkList[$sub] = $this->startPath.$url;
 }
 }
 return $linkList;
 } 

}
création des tables nécessaires à l'execution du crawl
CREATE TABLE IF NOT EXISTS `emaillist` (
 `emailadd` varchar(255) NOT NULL,
 PRIMARY KEY (`emailadd`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='List of all gotten emails';

CREATE TABLE IF NOT EXISTS `finishedurls` (
 `urlname` varchar(255) NOT NULL,
 PRIMARY KEY (`urlname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='List of finished urls';

CREATE TABLE IF NOT EXISTS `workingurls` (
 `urlname` varchar(255) NOT NULL,
 PRIMARY KEY (`urlname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='List of current working urls';
execute.php -> permet l'execution du script