IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Un script d'extraction


Sujet :

EDI, CMS, Outils, Scripts et API PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Par défaut Un script d'extraction
    Bonjour à vous,

    je me confronte à un nouveau sujet et j'ai pas vraiment de piste à explorer alors si vous pouvez m'aider je vous serais très reconnaissant.
    je m'explique:
    je veux créer un script qui parse des pages web d'un site spécifié au départ (type site d'annonces par exemple), me parcours ses pages et m'extrait les données qui s'y trouve et me les injecte dans un une base MySQL.
    Est ce qu'une âme charitable peut m'aider à résoudre ce problème: est ce que quelqu'un a déjà rencontré ce problème? y'a t il des scripts en open source qui abordent le sujet? y'a t il des pistes à explorer en prioritaire?

    Milles merci par avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Hello

    Coincidence, j'ai réalisé un script qui fait globalement la même chose pour extraire des données d'un site qui références toutes les auto-écoles française.
    J'ai pondu rapidos un algo en 1h mais ça peut te donner des idées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    <?php
    set_time_limit(0);
    error_reporting(0);
    echo "<pre>";
     
    $url = 'http://www.permisecole.com/annuaire-auto-ecoles/';
    echo "Process Started: $url\n"; flush();
     
    $doc = new DOMDocument('1.0', 'iso-8859-15');
    $doc->strictErrorChecking = false;
    if (!$doc->loadHTMLFile($url))
    	die("Cannot open $url");
     
    $xpath = new DOMXPath($doc);
     
    $departments = array();
    foreach ($xpath->query('//td[@width="33%"]') as $node) {
    	$anchor = $node->firstChild;
    	if ($anchor->hasAttributes())
    		$departments[$anchor->nodeValue] = $anchor->getAttribute('href');
    }
     
    echo "Department List Created\n"; flush();
     
    foreach ($departments as $department_name => $department_url) {
     
    	echo "> Processing department $department_name... "; flush();
     
    	$department_doc = new DOMDocument('1.0', 'iso-8859-15');
    	$department_doc->strictErrorChecking = false;
    	if ($department_doc->loadHTMLFile("http://www.permisecole.com" . $department_url)) {
    		$department_xpath = new DOMXpath($department_doc);
     
    		$towns = array();
    		foreach ($department_xpath->query('//td[@width="33%"]') as $node) {
    			$dpt_anchor = $node->firstChild;
    			if ($dpt_anchor->hasAttributes())
    				$towns[$dpt_anchor->nodeValue] = $dpt_anchor->getAttribute('href');
    		}
     
    		echo count($towns) . " towns found\n"; flush();
     
    		foreach ($towns as $town_name => $town_url) {
     
    			echo ">> Processing town $town_name... "; flush();
     
    			$town_doc = new DOMDocument('1.0', 'iso-8859-15');
    			$town_doc->strictErrorChecking = false;
    			if ($town_doc->loadHTMLFile("http://www.permisecole.com" . $town_url)) {
    				$town_xpath = new DOMXpath($town_doc);
     
    				$agencies = array();
    				foreach ($town_xpath->query('//td[@width="33%"]') as $node) {
    					$list = $node->childNodes;
    					$name = trim($town_xpath->query('a/b', $node)->item(0)->nodeValue);
    					$address = trim(($list->item(2) ? $list->item(2)->wholeText : '') . ' ' . ($list->item(4) ? $list->item(4)->wholeText : ''));
    					$address = str_replace(array("\r","\n","\t"), '', $address);
    					$tel = trim($list->item(6) ? $list->item(6)->wholeText : '');
    					if (!empty($tel))
    						$agencies[] = array('name' => $name, 'address' => $address, 'tel' => $tel);
    				}
     
    				echo count($agencies) . " agencies found\n"; flush();
    				foreach ($agencies as $a) { echo ">>> {$a['name']} - {$a['address']} - {$a['tel']}\n"; } 
     
    				$towns[$town_name] = $agencies;
    			}
    		}
     
    		$departments[$department_name] = $towns;
    	}
    }
     
    $filename = "auto_ecoles." . date('Ymd') . '.json';
    echo "Writing $filename ...";
    file_put_contents($filename, json_encode($departments));
     
    echo "--------------------------------------------------\n";
    echo "DONE"; flush();
    echo "<pre>";
    ça génère un fichier JSon une fois que tout le site à été exploré.
    La solution que j'ai utilisé consiste à utiliser DOMDocument pour parser les pages du site, trouver les liens et explorer reccursivement toutes les sections qui m'intéresse.

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Par défaut
    Milles merci Benjamin, tu es magique. j'essaerais avec ça.
    Encore merci.

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Gaffe quand même, je l'ai mis à titre d'exemple mais les XPath que j'utilise pour lire / extraire les informations sont spécifiques au site en question. A toi de trouver la logique qui va bien dans ton cas.

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Par défaut
    Oui j'ai bien pris note de ça, je te tiens de l'avancement de mon travail.
    tu m'épargne un temps fous, un grand merci à toi grand chef.

Discussions similaires

  1. Freeware/script d'extraction d'URLs de pages web
    Par Invité dans le forum Internet
    Réponses: 2
    Dernier message: 22/09/2011, 11h56
  2. Script d'extraction Macro Excel
    Par botmez dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/05/2011, 11h38
  3. script pour extraction de lignes : awk ?
    Par Tioup dans le forum Unix
    Réponses: 2
    Dernier message: 02/04/2010, 14h37
  4. Meilleur langage pour script CGI extractant des liens ?
    Par beninsky dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 18/01/2010, 23h18
  5. Réponses: 5
    Dernier message: 14/10/2009, 04h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo