Crawler de manière anonyme

WRInaute accro
Coucou les WRinautes...

Je suis en train de développer un crawler pour récupérer des prix sur plusieurs sites e-commerce que je dois surveiller.
Le crawler est développé, il récupère bien les infos que je lui demande.

Il me manque juste une chose : l'anonymat.
J'utilise la librairie cURL en PHP (tout est développé en PHP). Je me fait bien passé pour un utilisateur lamba (Mozilla), etc...
Le problème, c'est que j'utilise toujours la même IP.

J'ai testé avec plusieurs proxys anonymes trouvés sur le net mais généralement, soit c'est hyper lent, soit le proxy ne fonctionne pas.
Sinon, je pourrais, à l'avenir, redémarrer automatiquement le modem (zone non dégroupé) pour obtenir un changement d'IP. Mais, je sens que cette solution n'est pas adapté à long terme...

Donc voici mes questions :
- passer par des proxys anonymes vous semble-t-il être la meilleure solution ? Si non, que choisiriez-vous ? Avez vous un webService (même payant) à me recommander ?
- avez-vous déjà développé ce type d'outil et peut-être pourriez-vous partagez quelques retours avec moi (en MP si il faut) ?

Merci d'avance pour vos réponses.
 
WRInaute impliqué
Tu peux tenter le scrape de proxy à la volée mais c'est pas très performant. Je te conseilles les privés.

Hide my ass c'est sur utilisé, aucun intérêt.
 
WRInaute accro
@zeb : si bien sûr. Je fais tourner le truc en local sur un easyPhp pour le moment. Quand il sera en prod, il tournera sur une machine en local, avec sa propre connexion internet. Le problème, c'est qu'avec une IP fixe, je me fais grillé hyper facilement par les sites que je crawl, l'objectif étant de crawler en furtif.

@Spout : merci pour le lien, je vais aller voir ça de plus près

@_Soul : Oui, j'ai vu que ce n'était pas très performant. Merci en tout cas, de me l'avoir confirmer. Aurais-tu des privés à me conseiller ?
 
WRInaute accro
Merci Spout pour la piste de Tor Project, que je ne connaissais pas du tout. Ca me parait être une très bonne solution d'après les tests que j'ai pu faire. Je peux maintenant changer d'IP autant de fois que je le désire, et de manière automatique. Et en plus, ce n'est pas si lent que ça.

Pour ceux que ça pourrait interresser :
- j'ai téléchargé le bundle Vidalia (Tor + proxy Polipo + quelques autres trucs), installer et configurer le tout.
- j'ai configuré mon script PHP Curl pour qu'il passe par le proxy Polipo ( tuto ici : http://www.andrehonsberg.com/article/php-anonymous-curl-requests-using-tor que j'ai adapté à mes besoins )
- et ensuite un script qui demande automatiquement une "nouvelle identité" toutes les X minutes ( http://w-shadow.com/blog/2008/06/20/tor-how-to-new-identity-with-php/ trouvé tout fait sur le net... Du bonheur ! )

Voila, pour le moment, ça fonctionne parfaitement mais je dois encore faire des tests à plus grande échelle car j'ai des milliers de prix à scanner tous les jours.

Merci encore pour votre aide ;)
 
Nouveau WRInaute
bonjour,
je suis débutant mais je souhaite créer un crawler dans le meme type que le tiens pourrais tu m'aider, désolé de ré-ouvrir un topic vieux d'un ans
Merci de vos réponse et bonne journée
 
WRInaute accro
La dernière fois que j'ai testé TOR pr accéder au SERPs Google, l'IP était bannie d'office (c'est facile, la liste des IPs TOR est publique).
P-e que blman contredira, il a plus testé que moi.
 
WRInaute accro
Salut WENKZ,
c'est vrai que beaucoup d'IP Tor sont bannies, ça dépend ce que tu veux crawlé. Mais dans mon cas, ça convient tout à fait. J'utilise d'autres proxys en plus de Tor.

Sinon le projet fonctionne depuis pas mal de temps déjà. Le temps passe vite ;)
 
Nouveau WRInaute
En fait je souhaite créer un crawler pour analyser des prix de produits afin de me réguler par rapport a ma concurrence,
je voudrais le faire de A-z mais ne connaissant pas parfaitement le php je ne peux me permettre de me lancer seul la dedans, j'ai déjà vue différent crawler, j'arrive a comprendre le processus en lisant le script mais le hic c'est que je ne connais pas toutes les commande possible, je suis tombé sur ton topic par hasard, je ne veux pas faire un copier coller, juste avoir des explication et de l'aide dans la façon de proceder,
 
Nouveau WRInaute
Je pense t'en demander trop, mais pourrais tu créer un tutoriel, ou même me rediriger vers un tuto ou info, qui t'ont permis de faire ton crawler..
 
WRInaute accro
En fait, je ne comprend pas bien tes demandes.

Pour faire un crawler :
- tu indique à ton script une URL qu'il doit crawler
- tu te connecte à cette URL via CURL (si tu veux, ici, tu peux passer par un proxy pour être anonyme)
- tu récupère le contenu de l'URL (du html si c'est une page Web)

Voila, c'est fini !

Une fois le contenu récupéré, tu le parse de manière à récupérer les informations qui t'interressent et tu les stockent dans ta base de données.


Ce qui est décrit là, c'est la manière la plus simple de voir la chose.
Mais si tu veux autre chose, il va falloir être plus précis dans tes questions.
 
Nouveau WRInaute
Merci de ta réponse,

En fait, j'ai trouvé un script (sur buzut.fr) qui permet de récupérer des adresse email sur une page web,je souhaite changer ce script pour qu'il m'index le nom de produit ainsi que leur prix, le petit soucis c'est que je ne sais pas trop quoi changer dans c'est différentes commandes...
 
Nouveau WRInaute
Bon j'ai trouvais un site mais je ne comprends pas grand grand grand chose

Code:
<?php
	if(!$fp = fopen("http://www.zappos.com/nike-free-run-black-victory-green-anthracite-white?zlfid=111" ,"r" )) {
		return false;
	} //our fopen is right, so let's go
	$content = "";

	while(!feof($fp)) { //while it is not the last line, we will add the current line to our $content
		$content .= fgets($fp, 1024);
	}
	fclose($fp); //we are done here, don't need the main source anymore
?>

Code:
<?php
//our fopen, fgets here

//our magic regex here
	preg_match_all("/([$][0-9]*[,]*[.][0-9]{2})/", $content, $prices, PREG_SET_ORDER);
	echo $prices[0][0]."<br />";
?>

pour la mysql

Code:
CREATE TABLE IF NOT EXISTS `zappos` (
  `ID` int(5) NOT NULL AUTO_INCREMENT,
  `Date` date NOT NULL,
  `Value` float NOT NULL,
  `Other_Values` char(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

Code:
<?php

//preparing to save all other prices that isn't our "official" price
	$otherValues = "";
	foreach ($prices as $price) {
		$otherValues .= str_replace( array("$", ",", " "), '', $price[0]); //we need to save it as "float" value, without string stuff like spaces, commas and anything else you have just remove here
		$otherValues .= ","; //so we can separate each value via explode when we need
	}

//if someday Zappos changes his order (or you change the site you want to spy), just change here
	$mainPrice = str_replace( array("$", ",", " "), '', $prices[0][0]);

//lets save our date in format YYYY-MM-DD
	$date = date('Y\-m\-d');

	$dbhost  = 'localhost';
	$dbuser  = 'root';
	$dbpass  = '';
	$dbname  = "spy";
	$dbtable = "zappos";

	$conn = mysql_connect($dbhost, $dbuser, $dbpass)
		or die ('Error connecting to mysql');
		echo "<br />Connected to MySQL<br />";

		$selected = mysql_select_db($dbname)
			or die( mysql_error() );
			echo "Connected to Database<br />";

			//save data
			$insert = mysql_query("
						INSERT INTO `$dbname`.`$dbtable` (
							`ID` ,
							`Date` ,
							`Value` ,
							`Other_values`
						)
						VALUES (
							NULL , '$date', '$mainPrice', '$otherValues'
						);
					");
			//get data
			$results = mysql_query("SELECT * FROM $dbtable");

	mysql_close($conn);

//all data comes as MYSQL resources, so we need to prepare it to be shown
	while($row = mysql_fetch_array($results, MYSQL_ASSOC)) {
		echo "ID :{$row['ID']} " .
			 "Date : {$row['Date']} " .
			 "Value : {$row['Value']}";
		echo "<br />";
	}

?>

si quelqu'un veut bien ce dévouer pour m'expliquer le code et son fonctionnement...

Source du code sur le site de 1stwebdesigner
 
WRInaute accro
WENKZ, non, mon script n'est pas Open Source.

Le script :
- récupère le contenu HTML (mais pas avec CURL, sans passer par un proxy)
- avec une regex, tente de récupérer des prix
- insère dans une bdd

A mon avis, c'est pas gagner ton projet.
Renseigne toi déjà sur Curl déjà (plutôt que d'utiliser fopen comme dans le script que tu a trouvé). Tape "curl php" dans Google, il y a pleins d'exemples.
Une fois que tu arrivera à récupérer le contenu HTML d'une page, parse le avec des regex pour trouver le prix
Déjà tu aura fait un grand pas.

Ensuite :
- il faudra lancer le ou les crawlers (j'éxécute une tache CRON quotidienne à minuit qui me crée et me lance des batch DOS, qui eux mêmes appellent mon crawler en PHP), ceux-ci tournent en boucle jusqu'à 23h59. Ca tourne donc 24h/24, 7j/7 sans intervention humaine (sauf si Apache plante). Personnellement, je dois avoir entre 50 et 100 crawlers qui tournent en parrallèles.
- mettre des temporisations entre chaque crawl (sinon, tu va flooder et te faire blacklister => vécu) : Ne pas hésitez à espacer chaque crawl sinon tu va surcharger le site crawlé qui ne va forcément pas apprécié. 10 à 20 secondes entre chaque crawl, voir beaucoup plus si tu a peu de prix à crawlé.
- passer par des proxys (avec CURL) pour ne pas te faire griller et blacklister (=> vécu aussi, les marchands n'aiment pas trop qu'on les surveillent, normal)

Voila, je ne peut pas t'en dire plus, sinon ça deviendrait de la prestation de service ;)

Bon courage.
 
WRInaute accro
un conseil : pour commencer, effectue les crawls et regex sur tes propres sites. Quand tout sera ok tu pourras essayer sur les vrais sites cible
 
Nouveau WRInaute
Rebonjour!

j'ai commencé a voir comment fonctionné curl mais j'ai un petit soucis... en fait je n'arrive pas a récupérer une seul partie qui m’intéresse

Code:
<?php

$testURL = 'jeffrey0709.magix.net/'
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $testURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Bonjour (www.roger.roger)');
$resultat = curl_exec ($ch);
echo $resultat;
curl_close($ch);

$cookies = "foo=bar";
curl_setopt($ch, CURLOPT_COOKIE, $cookies);

$testPage = new DOMDocument();
$testPage->loadHTML($resultat);

?>

je suis bloqué a ça j'ai suivis le tutoriel de dinduks que vous pouvez trouver en tapant dans google PHP: Récupérer Le Contenu D'une Page Web Avec cURL je bloque a la partie ou l'on explore la balise bodycontent et que l'on prend notre balise P j'ai essayé de modifier en mettant les balise du site que je veux check mais rien j'ai le contenu entier du site qui s'affiche, pouvez vous m'aider ????


merci de vos reponse d'avance et bonne journée
 
WRInaute accro
Tu sais c'est pas pour dénigrer mais si tu bloque la dessus avec le code que tu montre qui comprend des trucs totalement inutiles faut peut être penser a sous-traiter vue la globalité du problème :wink:
 
WRInaute accro
Bon bah ta page est dans "$resultat" les lignes après le curl close ne servent a rien et penche toi sur les expressions régulières pour extraire des motifs qui contiennent ce que tu veux.
 
Nouveau WRInaute
Excuse moi 'jai oublié une partie du code

Code:
<?php

$testURL = 'jeffrey0709.magix.net/'
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $testURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Bonjour (www.roger.roger)');
$resultat = curl_exec ($ch);
echo $resultat;
curl_close($ch);

$cookies = "foo=bar";
curl_setopt($ch, CURLOPT_COOKIE, $cookies);

$testPage = new DOMDocument();
$testPage->loadHTML($resultat);


foreach($testPage->getElementsByTagName('div') as $div){
    
    if($div->getAttribute('id') == "content"){
 
        
        $premierH2 = trim($div->getElementsByTagName('h2')->item(0)->nodeValue);
        
        while($premierH2 == '<br>' || $premierP == '<br />' || $premierH2 == ''){
            
            $div->removeChild($div->getElementsByTagName('h2')->item(0));
            
            $premierP = trim($div->getElementsByTagName('h2')->item(0)->nodeValue);
        };
 
       
        try{
            
            foreach( $div->getElementsByTagName('table') as $table ){
                
                $div->removeChild($table);
            }
        } catch(Exception $e){
            
        }
 
        
        $description = '<h2>' . $div->getElementsByTagName('h2')tem(0)->nodeValue. '</h2>;
    }
}
 

$description = preg_replace('/\[[0-9]*\][,]|\[[0-9]*\]/', '', $description);
 

echo $description;
 
?>
 
Nouveau WRInaute
bon j'arrive a récupérer le contenu d'un page, grâce au regex je peux récupérer seulement ce qui m’intéresse, maintenant comment faut il faire pour enregistré le contenu que je récupère dans une base de donnée ?

désolé pour les messages précédents j'ai un peu dis n'importe quoi sans faire attention a sque je pouvais trouver sur le web ^^
bweff comment save sque je recup dans une BDD ? et si possible automatique a chaque raffraichissement du script
 
Discussions similaires
Haut